1、集群規划
1.1、主機配置環境
172.16.0.11 node60 172.16.0.13 node89 172.16.0.8 node145
1.2、安裝后啟動的進程
2、修改host文件
希望三個主機之間都能夠使用主機名稱的方式相互訪問而不是IP,我們需要在hosts中配置其他主機的host。因此我們在主機的/etc/hosts下均進行如下配置:
$ vim /etc/hosts 172.16.0.11 node60 172.16.0.13 node89 172.16.0.8 node145
將配置發送到其他主機,同時在其他主機上均如上配置。
$ ping node60 PING node60 (172.16.0.11) 56(84) bytes of data. 64 bytes from node60 (172.16.0.11): icmp_seq=1 ttl=64 time=0.313 ms 64 bytes from node60 (172.16.0.11): icmp_seq=2 ttl=64 time=0.275 ms $ ping node89 PING node89 (172.16.0.13) 56(84) bytes of data. 64 bytes from instance-2nfzkw5m-1 (172.16.0.13): icmp_seq=1 ttl=64 time=0.038 ms 64 bytes from instance-2nfzkw5m-1 (172.16.0.13): icmp_seq=2 ttl=64 time=0.054 ms $ ping node145 64 bytes from node145 (172.16.0.8): icmp_seq=1 ttl=64 time=0.288 ms 64 bytes from node145 (172.16.0.8): icmp_seq=2 ttl=64 time=0.278 ms
3、添加用戶賬號
在所有的主機下均建立一個賬號admin用來運行hadoop ,並將其添加至sudoers中
#添加用戶通過手動輸入修改密碼 $ useradd admin #更改用戶 admin 的密碼 $ passwd admin
設置admin用戶具有root權限 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
$ visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL admin ALL=(ALL) ALL
修改完畢 :wq! 保存退出,現在可以用admin帳號登錄,然后用命令 su - ,切換用戶即可獲得root權限進行操作。
4、/opt目錄下創建文件夾
4.1、在root用戶下創建module、software文件夾
[root@89 ~]# cd /opt/ [root@89 opt]# mkdir module [root@89 opt]# mkdir software
4.2、修改module、software文件夾的所有者
[root@89 opt]# chown admin:admin module [root@89 opt]# chown admin:admin software
4.3、查看module、software文件夾的所有者
[root@89 opt]# ll drwxr-xr-x 2 admin admin 4096 Mar 8 19:25 module drwxr-xr-x 2 admin admin 4096 Mar 8 19:25 software
5、安裝配置jdk1.8
本機root用戶已安裝配置jdk,admin用戶不用重新安裝,直接使用即可。
如果未安裝可采用如下命令安裝:
$ sudo yum install -y java-1.8.0-openjdk* $ vim /etc/profile(root用戶安裝) 或 vim /home/admin/.bash_profile(admin用戶安裝),內容如下: export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH=$PATH:$JAVA_HOME/bin
6、設置SSH免密鑰
關於ssh免密碼的設置,要求每兩台主機之間設置免密碼,自己的主機與自己的主機之間也要求設置免密碼。 這項操作可以在admin用戶下執行,執行完畢公鑰在/home/admin/.ssh/id_rsa.pub。
在CentOS下會存在非root用戶配置免密不能登陸的問題。
root用戶按照正常操作配置SSH無密碼登錄服務器,一切順利,但是到非root用戶的時候,就會出現各種各樣的問題,這里,就統一解決一下這些出現的問題,這里以admin用戶作為例子說明。
主機node60,node89,node145都需要執行以下步驟,如果之前做過免密,后來改密碼了,最好把原來的.ssh目錄刪掉:
$ rm -rf /home/admin/.ssh (三台都需要刪掉,刪掉以后在執行以下語句) $ ssh-keygen -t rsa $ cat /home/admin/.ssh/id_rsa.pub >> /home/admin/.ssh/authorized_keys $ chmod 700 /home/admin/ $ chmod 700 /home/admin/.ssh $ chmod 644 /home/admin/.ssh/authorized_keys $ chmod 600 /home/admin/.ssh/id_rsa
如上命令在主機node60,node89,node145上執行成功,下面就來配置這三台主機的免密設置。
a、配置node60免密設置
把主機node89,node145對應的/home/admin/.ssh/id_rsa.pub內容拷貝到/home/admin/.ssh/authorized_keys(該文件在node60主機上)
b、配置node89免密設置
把主機node60,node145對應的/home/admin/.ssh/id_rsa.pub內容拷貝到/home/admin/.ssh/authorized_keys(該文件在node89主機上)
c、配置node145免密設置
把主機node60,node89對應的/home/admin/.ssh/id_rsa.pub內容拷貝到/home/admin/.ssh/authorized_keys(該文件在node145主機上)
d、驗證免密是否設置成功
[admin@60 ~]$ ssh node89 Last login: Sun Mar 8 20:52:20 2020 from 172.16.0.11 [admin@89 ~]$ exit logout Connection to node89 closed. [admin@60 ~]$ ssh node145 Last login: Sun Mar 8 20:52:26 2020 from 172.16.0.11 [admin@145 ~]$ exit logout Connection to node145 closed. [admin@60 ~]$ ssh node60 Last login: Sun Mar 8 20:52:16 2020 from 172.16.0.11 [admin@60 ~]$ exit logout Connection to node60 closed.
到此,主機之間設置免密完成。
6、安裝Zookeeper
安裝詳解參考:
ZooKeeper集群搭建
ZooKeeper安裝與配置
CentOS7.5搭建Zookeeper集群與命令行操作
7、安裝hadoop集群
7.1、下載hadoop安裝包
http://archive.apache.org/dist/hadoop/core/
http://archive.apache.org/dist/hadoop/core/hadoop-2.7.6/hadoop-2.7.6.tar.gz
hadoop-2.7.6.tar.gz下載后存到/opt/software/
7.2、解壓安裝Hadoop
解壓 hadoop-2.7.6到/opt/module/目錄下
$ tar zxvf hadoop-2.7.6.tar.gz -C /opt/module/
7.2 配置Hadoop集群
配置文件都在/opt/module/hadoop-2.7.6/etc/hadoop/下
7.2.1 修改hadoop-env.sh, mapred-env.sh ,yarn-env.sh 的JAVA環境變量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
注:export JAVA_HOME=${JAVA_HOME} 采用變量方式,會導致 hadoop-daemons.sh start datanode 執行失敗
7.2.2 修改 core-site.xml
$ vim core-site.xml
<configuration>
<!-- 把兩個NameNode的地址組裝成一個集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.6/data/ha/tmp</value>
</property>
<!-- 指定ZKFC故障自動切換轉移 -->
<property>
<name>ha.zookeeper.quorum</name>
<!-- <value>node60:2181,node89:2181,node145:2181</value> -->
<value>node145:2181</value>
</property>
<!--修改core-site.xml中的ipc參數,防止出現連接journalnode服務ConnectException-->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
</configuration>
7.2.3 修改hdfs-site.xml
$ vim hdfs-site.xml
<configuration>
<!-- 設置dfs副本數,默認3個 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 完全分布式集群名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode節點都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node60:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node89:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node60:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node89:50070</value>
</property>
<!-- 指定NameNode元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node60:8485;node89:8485;node145:8485/mycluster</value>
</property>
<!-- 配置隔離機制,即同一時刻只能有一台服務器對外響應 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh無秘鑰登錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/admin/.ssh/id_rsa</value>
</property>
<!-- 聲明journalnode服務器存儲目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-2.7.6/data/ha/jn</value>
</property>
<!-- 關閉權限檢查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置自動故障轉移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
7.2.4 修改mapred-site.xml
$ mv mapred-site.xml.template mapred-site.xml
$ vim mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mr歷史服務器主機,端口 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node60:10020</value>
</property>
<!-- 指定mr歷史服務器WebUI主機,端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node60:19888</value>
</property>
<!-- 歷史服務器的WEB UI上最多顯示20000個歷史的作業記錄信息 -->
<property>
<name>mapreduce.jobhistory.joblist.cache.size</name>
<value>20000</value>
</property>
<!--配置作業運行日志 -->
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
</property>
</configuration>
7.2.5 修改 slaves
$ vim slaves
node60
node89
node145
7.2.6 修改yarn-site.xml
[admin@node21 hadoop]$ vim yarn-site.xml
<configuration>
<!-- reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--啟用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmCluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node89</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node145</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node60:2181,node89:2181,node145:2181</value>
</property>
<!--啟用自動恢復-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的狀態信息存儲在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
7.2.7 拷貝hadoop到其他節點
[admin@145 module]# scp -r hadoop-2.7.6/ admin@node60:/opt/module/ [admin@145 module]# scp -r hadoop-2.7.6/ admin@node89:/opt/module/
注:記得切換成admin用戶操作
7.2.8 配置Hadoop環境變量
$ sudo vim /etc/profile 末尾追加 export HADOOP_HOME=/opt/module/hadoop-2.7.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 編譯生效 source /etc/profile $ echo ${HADOOP_HOME}
8、啟動集群
8.1、啟動journalnode,三台機器都要執行(僅第一次啟動hadoop時,需要這一步操作,之后不再需要手動啟動journalnode),前提zookeeper集群已啟動:
$ sudo mkdir -p /opt/module/hadoop-2.7.6/logs $ sudo chown admin:admin /opt/module/hadoop-2.7.6/logs $ ssh admin@node60 '/opt/module/hadoop-2.7.6/sbin/stop-all.sh'; $ ssh admin@node89 '/opt/module/hadoop-2.7.6/sbin/stop-all.sh'; $ ssh admin@node145 '/opt/module/hadoop-2.7.6/sbin/stop-all.sh'; $ ssh admin@node60 'rm -rf /opt/module/hadoop-2.7.6/data'; $ ssh admin@node89 'rm -rf /opt/module/hadoop-2.7.6/data'; $ ssh admin@node145 'rm -rf /opt/module/hadoop-2.7.6/data'; $ ssh admin@node60 'cd /opt/module/hadoop-2.7.6/sbin/;sh hadoop-daemon.sh start journalnode;'; $ ssh admin@node89 'cd /opt/module/hadoop-2.7.6/sbin/;sh hadoop-daemon.sh start journalnode;'; $ ssh admin@node145 'cd /opt/module/hadoop-2.7.6/sbin/;sh hadoop-daemon.sh start journalnode;';
啟動Journalnde是為了創建/data/ha/jn,此時jn里面是空的
[admin@60 jn]$ cd /opt/module/hadoop-2.7.6/data/ha/jn [admin@60 jn]$ ll total 0
查看journalnode服務日志
$ tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-journalnode-145.out $ tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-journalnode-145.log
注:hadoop-daemon.sh stop journalnode 關閉JournalNode節點
8.2、在[nn1]上,對namenode進行格式化,並啟動:
[admin@node60 ~]$ cd /opt/module/hadoop-2.7.6/bin [admin@node60 ~]$ hdfs namenode -format
格式化namenode,此時jn里面會產生集群ID等信息
注:圖片盜用別人的,node21對用我主機的node60
另外,/data/ha/tmp也會產生如下信息
注:圖片盜用別人的,node21對用我主機的node60
啟動nn1上namenode
[admin@60 sbin]$ hadoop-daemon.sh start namenode starting namenode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-node21.out [admin@60 sbin]$ tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-60.out [admin@60 sbin]$ tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-60.log
8.3、在[nn2]上,同步nn1的元數據信息:
[admin@89 bin]$ cd /opt/module/hadoop-2.7.6/bin [admin@89 ~]$ hdfs namenode -bootstrapStandby
8.4、啟動[nn2]:
[admin@89 sbin]$ hadoop-daemon.sh start namenode
8.5、在[nn1]上,啟動所有datanode
[admin@60 sbin]$ hadoop-daemons.sh start datanode
8.6、查看web頁面此時顯示
http://182.*.*.60:50070
http://106.*.*.89:50070
8.7、手動切換狀態,在各個NameNode節點上啟動DFSZK Failover Controller,先在哪台機器啟動,哪個機器的NameNode就是Active NameNode
[admin@60 ~]$ hadoop-daemon.sh start zkfc [admin@89 ~]$ hadoop-daemon.sh start zkfc
或者強制手動其中一個節點變為Active
[admin@60 data]$ hdfs haadmin -transitionToActive nn1 --forcemanual
Web頁面查看
Overview 'node60:8020' (active) Overview 'node89:8020' (standby)
8.8、自動切換狀態,需要初始化HA在Zookeeper中狀態,先停掉hdfs服務,然后隨便找一台zookeeper的安裝節點
[admin@60 current]$ hdfs zkfc -formatZK
查看,此時會產生一個hadoop-ha的目錄
[admin@145 ~]# cd /opt/module/zookeeper-3.4.6/bin [admin@145 bin]$ ./zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper, hadoop-ha] [zk: localhost:2181(CONNECTED) 1]
啟動hdfs服務,查看namenode狀態
[admin@60 ~]$ ./start-dfs.sh
8.9、測試namenode高可用
8.9.1、在node60上kill掉namenode進程,然后通過瀏覽器查看node89的狀態,發現狀態變為active,說明高可用測試成功
[admin@60 sbin]$ jps 20441 NameNode 24523 Jps 20172 JournalNode 24430 DFSZKFailoverController 21278 DataNode [admin@60 sbin]$ kill -9 20441
8.9.2、重新啟動node60的namenode進程,sh start-dfs.sh,瀏覽器訪問node60,此時node60的狀態為standby
[admin@60 sbin]$ hadoop-daemon.sh start journalnode [admin@60 sbin]$ sh start-dfs.sh
至此,hadoop高可用集群搭建完畢。
9、啟動yarn
9.1、在node89中執行:
[admin@89 ~]$ cd /opt/module/hadoop-2.7.6/sbin [admin@89 ~]$ start-yarn.sh
9.2、在node145中執行:
[admin@89 ~]$ cd /opt/module/hadoop-2.7.6/sbin [admin@145 ~]$ yarn-daemon.sh start resourcemanager
9.3、查看服務狀態
[admin@145 sbin]$ yarn rmadmin -getServiceState rm1 standby [admin@145 sbin]$ yarn rmadmin -getServiceState rm2 active [admin@145 sbin]$
10、查看啟動journalnode日志
ssh admin@node60 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-journalnode-60.log'; ssh admin@node89 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-journalnode-89.log'; ssh admin@node145 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-journalnode-145.log'; ssh admin@node60 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-60.log'; ssh admin@node89 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-89.log'; ssh admin@node60 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-zkfc-60.log'; ssh admin@node89 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/hadoop-admin-zkfc-89.log'; ssh admin@node60 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/yarn-admin-nodemanager-60.log'; ssh admin@node89 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/yarn-admin-nodemanager-89.log'; ssh admin@node89 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/yarn-admin-resourcemanager-89.log'; ssh admin@node145 'tail -f -n 1000 /opt/module/hadoop-2.7.6/logs/yarn-admin-nodemanager-145.log';
配置集群常見錯誤
1、執行yum提示錯誤:rpmdb: BDB0113 Thread/process 424227/139826856310848 failed
解決方案:https://blog.csdn.net/qq_41688455/article/details/86690143
2、hadoop-daemon.sh start journalnode啟動失敗
2020-03-09 14:20:03,099 INFO org.apache.hadoop.hdfs.qjournal.server.JournalNode: registered UNIX signal handlers for [TERM, HUP, INT]
2020-03-09 14:20:03,303 ERROR org.apache.hadoop.hdfs.qjournal.server.JournalNode: Failed to start journalnode.
org.apache.hadoop.util.DiskChecker$DiskErrorException: Cannot create directory: /opt/module/hadoop-2.7.6/data/ha/jn
at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:106)
at org.apache.hadoop.hdfs.qjournal.server.JournalNode.validateAndCreateJournalDir(JournalNode.java:118)
at org.apache.hadoop.hdfs.qjournal.server.JournalNode.start(JournalNode.java:138)
at org.apache.hadoop.hdfs.qjournal.server.JournalNode.run(JournalNode.java:128)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
at org.apache.hadoop.hdfs.qjournal.server.JournalNode.main(JournalNode.java:299)
2020-03-09 14:20:03,309 INFO org.apache.hadoop.util.ExitUtil: Exiting with status -1
2020-03-09 14:20:03,311 INFO org.apache.hadoop.hdfs.qjournal.server.JournalNode: SHUTDOWN_MSG:
解決方案:
$ sudo chown admin:admin hadoop-2.7.6/
3、2020-03-13 17:15:20,059 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/opt/module/hadoop-2.7.6/data/ha/tmp/dfs/data/
java.io.IOException: Incompatible clusterIDs in /opt/module/hadoop-2.7.6/data/ha/tmp/dfs/data: namenode clusterID = CID-1e9a7844-9d48-4d66-be81-5ee83e19a482; datanode clusterID = CID-0599cb61-c91b-453f-9821-fa32956b55c0
由於多次格式化命令所致(/opt/module/hadoop-2.7.6/bin/hdfs namenode -format)
解決方法:
停止Hadoop服務,刪除/opt/module/hadoop-2.7.6/data下的所有文件,然后重新格式化,再啟動就好了.
ssh admin@node60 'rm -rf /opt/module/hadoop-2.7.6/data';
ssh admin@node89 'rm -rf /opt/module/hadoop-2.7.6/data';
ssh admin@node145 'rm -rf /opt/module/hadoop-2.7.6/data';
參考文章:
CentOS7.5搭建Hadoop2.7.6完全分布式集群
hadoop高可用集群搭建