hadoop、hive安裝

語言: CN / TW / HK

hadoop(hdfs+mapReduce+yarn)

前提

準備三台服務器(本文使用虛擬機),安裝jdk1.8

配置

本文使用hadoop版本為3.3.0,解壓hadoop壓縮包到任意目錄,以/export/server/hadoop-3.3.0/為例。

解壓完畢後,進入hadoop目錄,修改配置文件,位於/etc/hadoop/目錄下,文本中有關路徑和網絡地址的配置需要根據實際情況修改

  • 指定java路徑,指定各個進程運行的用户名 ``` vim hadoop-env.sh

export JAVA_HOME=/export/server/jdk1.8.0_341 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root ```

  • 核心配置文件,共有四個需要修改 ``` vim core-site.xml

fs.defaultFS hdfs://192.168.88.128:8020

hadoop.tmp.dir /export/server/hadoop-3.3.0

hadoop.http.staticuser.user root

hadoop.proxyuser.root.hosts hadoop.proxyuser.root.groups

fs.trash.interval 1440

```

``` vim hdfs-site.xml

dfs.namenode.secondary.http-address 192.168.88.129:9868

dfs.namenode.datanode.registration.ip-hostname-check false

```

``` vim mapred-site.xml

mapreduce.framework.name yarn

mapreduce.jobhistory.address 192.168.88.128:10020

mapreduce.jobhistory.webapp.address 192.168.88.128:19888
yarn.app.mapreduce.am.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.map.env HADOOP_MAPRED_HOME=${HADOOP_HOME} mapreduce.reduce.env HADOOP_MAPRED_HOME=${HADOOP_HOME}

```

``` vim yarn-site.xml

yarn.resourcemanager.hostname 192.168.88.128 yarn.nodemanager.aux-services mapreduce_shuffle

yarn.nodemanager.pmem-check-enabled false

yarn.nodemanager.vmem-check-enabled false

yarn.log-aggregation-enable true

yarn.log.server.url http://192.168.88.128:19888/jobhistory/logs

yarn.log-aggregation.retain-seconds 604800

```

  • 設置集羣所在的網絡地址 ``` vim workers

192.168.88.128 192.168.88.129 192.168.88.130 ```

  • 將hadoop添加到環境變量 ``` vim /etc/profile

export HADOOP_HOME=/export/server/hadoop-3.3.0 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin `` 編譯環境變量,source /etc/profile`,執行hadoop命令,驗證是否配置成功

  • 將hadoop及環境變量文件同步到其他兩個節點,執行編譯

  • 初始化hdfs 在主節點機器執行hdfs namenode -format,如果出現storage directory /export/server/hadoop-3.3.0/dfs/name has been successfully formatted,説明成功

啟動

start-all.sh 啟動成功後,在瀏覽器輸入namenode所在服務器地址加上9870端口,可查看hdfs管理界面,如192.168.88.128:9870;在瀏覽器輸入namenode所在服務器地址加上8088端口,可查看mapReduce管理界面,如192.168.88.128:8088

問題記錄

啟動時,報錯Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

需要配置免密登錄,才可以啟動其他服務器下的hadoop服務,參考SSH免密登錄配置

hdfs

上傳下載命令

注: 1. 其他常見文件操作命令基本與linux相同,故不記錄 2. 本地路徑可直接寫路徑,也可用前綴file:///指明絕對路徑;hdfs路徑可直接寫路徑,也可用前綴hdfs://${namenode}:8020/指明絕對路徑

  • 上傳文件

hadoop fs -put 本地路徑 hdfs路徑

  • 下載文件

hadoop fs -get hdfs路徑 本地路徑

問題記錄

使用start-dfs.sh啟動,控制枱顯示成功,進入管理界面,live nodes顯示只有一個

可能是使用ip連接的NameNode,如果是這樣的話,需要在hdfs-site.xml添加如下配置 <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property>

進入管理界面,live nodes顯示三個,點進去只顯示一個,如下圖 image.png

node列表以主機名+端口去重,三個節點的主機名都是localhost,端口又一樣,因此只顯示一個,解決方法是修改主機名或端口,本文中使用第一個

修改/etc/hostname文件或使用命令hostnamectl set-hostname node1修改三個節點的主機名,之後重啟服務器

mr

説明

當前大數據技術下,很多框架封裝了MapReduce,因此對於它瞭解即可

執行計算圓周率,進入/export/server/hadoop-3.3.0/share/hadoop/mapreduce/目錄,執行hadoop -jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2命令,後面兩個參數可任意修改

問題記錄

執行example的計算pi任務,進入管理界面,發現任務一直沒有執行,或者進度長期沒有變化

執行資源調度的是node1,之前設置了主機名,如果分配給node2節點執行,發起的url為node2:${port},此時node1節點並不知道它的實際地址,所以任務進度長期沒有變化

在node1節點上修改/etc/hosts文件,將所有節點的ip與主機名映射

執行example的計算pi任務,報異常java.net.UnknownHostException: node3

只修改了node1映射,其他節點的映射也需要修改

hive

前提

  • 啟動mysql服務並配置可遠程連接
  • 整合hadoop,在core-sile.xml文件上,之前已經配置好了,見註釋整合hive 用户代理設置

配置

本文使用hive版本為3.1.2,解壓hive壓縮包到任意目錄,以/export/server/hive-3.1.2/為例,文本中有關路徑、網絡地址、及MySQL配置信息等需要根據實際情況修改

  • 解決hive與hadoop之間guava版本差異 cd /export/server/hive-3.1.2/lib rm -rf guava-19.0.jar cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar .

  • 修改配置文件,進入conf目錄,將hive-env.sh.template重命名為hive-env.sh,添加以下配置 ``` vim hive-env.sh

export HADOOP_HOME=/export/server/hadoop-3.3.0 export HIVE_CONF_DIR=/export/server/hive-3.1.2/conf export HIVE_AUX_JARS_PATH=/export/server/hive-3.1.2/lib ```

  • conf目錄下的hive-site.xml,添加如下配置 ``` vim hive-site.xml

javax.jdo.option.ConnectionURL jdbc:mysql://192.168.26.1/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8

javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName root

javax.jdo.option.ConnectionPassword root

hive.server2.thrift.bind.host node1

hive.metastore.uris thrift://node1:9083

hive.metastore.event.db.notification.api.auth false ```

  • 將mysql驅動放到hive安裝包lib下,jar包名稱為mysql-connector-java-8.0.22.jar,具體過程略

  • 初始化hive 執行bin/schematool -initSchema -dbType mysql -verbos --verbose,如果出現Initialization script completed,説明成功。查看MySQL,發現已經有hive3數據庫,且數據表也初始化了

  • 支持中文 如果對字段、表使用中文註釋,查看時會發現顯示???,這是因為沒有設置UTF-8字符集,因此還需要對元數據表字段做一些調整 ALTER TABLE `hive3`.`columns_v2` MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`table_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`partition_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`partition_keys` MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8mb4; ALTER TABLE `hive3`.`index_params` MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8mb4;

啟動

``` nohup ./hive --service metastore &

nohup ./hive --service hiveserver2 & `` hive默認開放兩個端口。若啟動成功,在瀏覽器輸入ip:10002,可查看後台頁面;10000端口使客户端以jdbc方式連接,連接地址為jdbc:hive2://ip:10000`

連接

  1. beeline連接 java ./beeline -u jdbc:hive2://ip:10000 -n root 或者 ./beeline !connect jdbc:hive2://ip:10000 root
  2. 使用idea、dbeaver之類的軟件連接,好處是寫SQL時有智能提示