hadoop高可用集群搭建


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高可用集群搭建 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM