配置hadoop2.X的namenode HA及Yarn HA

以前用hadoop2.2.0只搭建了hadoop的高可用,但在hadoop2.2.0中始終沒有完成YARN HA的搭建,直接下載了hadoop最新穩定版本2.6.0完成了YARN HA及HADOOP HA的搭建流程,沒有仔細看hadoop的官方文檔,貌似hadoop2.2.0不支持YARN HA,如果說錯了謝謝指正呀,下面總結一下我的搭建流程:
首先完成虛擬機的搭建:

機器名 IP 安裝軟件 運行進程
namenode1 192.168.3.161 hadoop NameNode、DFSZKFailoverController、ResourceManager
namenode2 192.168.3.162 hadoop NameNode、DFSZKFailoverController、ResourceManager
datanode1 192.168.3.163 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
datanode2 192.168.3.164 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
datanode3 192.168.3.165 hadoop DataNode、NodeManager
datanode4 192.168.3.166 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
說明:
在hadoop2.X中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM(由cloudra提出,原理類似zookeeper)。這裏我使用QJM完成。主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認爲寫入成功。通常配置奇數個JournalNode
虛擬機安裝linux系統,我這裏用的是centos6.4
使用root用戶修改/etc/hosts文件,如下:
  1. 192.168.3.161 namenode1
  2. 192.168.3.162 namenode2
  3. 192.168.3.163 datanode1
  4. 192.168.3.164 datanode2
  5. 192.168.3.165 datanode3
  6. 192.168.3.166 datanode4
複製代碼


安裝jdk1.7和hadoop並配置環境變量,可以配置全局的(修改/etc/profile)也可以配置當前用戶的(修改~/.bashrc文件),這裏我配置是全局的環境變量
安裝jdk的過程直接解壓tar xzvf jdk.tar, 這裏不做說明了,列出/etc/profile文件中末尾添加的內容如下:
  1. export JAVA_HOME=/usr/java/jdk1.7.0_67
  2. export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
  3. export PATH=$PATH:$JAVA_HOME/bin
  4. export HADOOP_HOME=/home/hadoop/hadoop_installs/hadoop-2.6.0
複製代碼


使用root用戶關閉防火牆和selinux
  1. service iptables stop
複製代碼

centos7好像把防火牆修改成firewalld,可以試試service firewalld stop
  1. chkconfig iptables off
複製代碼


修改/etc/selinux/config文件中設置SELINUX=disabled ,然後重啓服務器
創建hadoop用戶組及hadoop用戶並完成.ssh免密碼登錄
在每臺虛擬機中通過hadoop用戶執行ssh-keygen -t rsa會在~/.ssh/目錄中生成兩個文件id_rsa和id_rsa.pub,
如果想從namenode1免密碼登錄到namenode2中要在namenode1中執行ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@namenode2
(注意:些命令中的-i一定加上否則之後的一些操作會出現ssh_exchange_identification: Connection closed by remote host這樣的錯誤),
這個命令完成後會在namenode2的~/.ssh/目錄下生成文件authorized_keys,此時可以從namenode1直接ssh到namenode2了,建議在每臺機器包括namenode2本身都執行ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@namenode2然後把生成的authorized_keys複製到集羣中每個機器上實現任何機器之間都可以免密碼登錄。
完成安裝zookeeper3.4.5集羣:主要作用是用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode爲standby狀態
解壓zookeeper包在zookeeper3.4.5/conf/目錄執行mv zoo_sample.cfg zoo.cfg,之後修改zoo.cfg文件,如下:
修改dataDir=/hadoop/zookeeper-3.4.5/tmp(zookeeper修改源數據的地方,包括myid文件)
文件最後添加
  1. server.1=datanode1:2888:3888

  2. server.2=datanode2:2888:3888

  3. server.3=datanode4:2888:3888
複製代碼


保存退出 
然後分別在datanode1,2,4節點中創建一個tmp文件夾 ,mkdir /hadoop/zookeeper-3.4.5/tmp ,再創建一個空文件  touch /hadoop/zookeeper-3.4.5/tmp/myid 最後向該文件寫入ID,datanode1執行echo 1 > /hadoop/zookeeper-3.4.5/tmp/myid,datanode1執行echo 2 > /hadoop/zookeeper-3.4.5/tmp/myid,datanode3執行echo 3 > /hadoop/zookeeper-3.4.5/tmp/myid
安裝配置hadoop2.6.0集羣:
解壓文件後配置HDFS(注意:hadoop2.X之後所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下),需要修改文件如下:
修改文件hadoo-env.sh
  1. export JAVA_HOME=/usr/java/jdk1.7.0_67

  2. export HADOOP_LOG_DIR=/data/log/hadoop
複製代碼



指定日誌存放目錄
修改文件core-site.xml
  1. <configuration>
  2.   <!-- 指定hdfs的nameservice爲ns1,是NameNode的URI。hdfs://主機名:端口/ -->
  3.         <property>
  4.                 <name>fs.defaultFS</name>
  5.                 <value>hdfs://gagcluster</value>
  6.         </property>

  7.         <property>
  8.                 <name>io.file.buffer.size</name>
  9.                 <value>131072</value>
  10.         </property>
  11. <!-- 指定hadoop臨時目錄 -->
  12.         <property>
  13.                 <name>hadoop.tmp.dir</name>
  14.                 <value>file:/data/hadoop/tmp</value>
  15.                 <description>Abase for other temporary directories.</description>
  16.         </property>
  17. <!--指定可以在任何IP訪問-->
  18.         <property>
  19.                 <name>hadoop.proxyuser.hduser.hosts</name>
  20.                 <value>*</value>
  21.         </property>
  22. <!--指定所有用戶可以訪問-->
  23.         <property>
  24.                 <name>hadoop.proxyuser.hduser.groups</name>
  25.                 <value>*</value>
  26.         </property>
  27. <!-- 指定zookeeper地址 -->
  28.         <property>
  29.                 <name>ha.zookeeper.quorum</name>
  30.                 <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
  31.         </property>

  32. </configuration>
複製代碼

修改文件hdfs-site.xml
  1. <configuration>
  2. <!--指定hdfs的nameservice爲ns1,需要和core-site.xml中的保持一致 -->
  3.         <property>
  4.                 <name>dfs.nameservices</name>
  5.                 <value>gagcluster</value>
  6.         </property>
  7. <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
  8.         <property>
  9.                 <name>dfs.ha.namenodes.gagcluster</name>
  10.                 <value>nn1,nn2</value>
  11.         </property>
  12. <!-- nn1的RPC通信地址 -->
  13.         <property>
  14.                 <name>dfs.namenode.rpc-address.gagcluster.nn1</name>
  15.                 <value>namenode1:9000</value>
  16.         </property>
  17. <!-- nn2的RPC通信地址 -->
  18.         <property>
  19.                 <name>dfs.namenode.rpc-address.gagcluster.nn2</name>
  20.                 <value>namenode2:9000</value>
  21.         </property>

  22. <!-- nn1的http通信地址 -->
  23.         <property>
  24.                 <name>dfs.namenode.http-address.gagcluster.nn1</name>
  25.                 <value>namenode1:50070</value>
  26.         </property>

  27. <!-- nn2的http通信地址 -->
  28.         <property>
  29.                 <name>dfs.namenode.http-address.gagcluster.nn2</name>
  30.                 <value>namenode2:50070</value>
  31.         </property>
  32. <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
  33.         <property>
  34.                 <name>dfs.namenode.shared.edits.dir</name>
  35.                 <value>qjournal://dataNode1:8485;datanode2:8485;datanode4:8485/gagcluster</value>
  36.         </property>

  37. <!-- 配置失敗自動切換實現方式 -->
  38.         <property>
  39.                 <name>dfs.client.failover.proxy.provider.gagcluster</name>
  40.                 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  41.         </property>
  42. <!-- 配置隔離機制 -->
  43.         <property>
  44.                 <name>dfs.ha.fencing.methods</name>
  45.                 <value>sshfence</value>
  46.         </property>
  47. <!-- 使用隔離機制時需要ssh免密碼登陸 -->
  48.         <property>
  49.                 <name>dfs.ha.fencing.ssh.private-key-files</name>
  50.                 <value>/home/hadoop/.ssh/id_rsa</value>
  51.         </property>
  52. <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
  53.         <property>
  54.                 <name>dfs.journalnode.edits.dir</name>
  55.                 <value>/data/hadoop/tmp/journal</value>
  56.         </property>
  57. <!--指定支持高可用自動切換機制-->
  58.         <property>
  59.                 <name>dfs.ha.automatic-failover.enabled</name>
  60.                 <value>true</value>
  61.         </property>
  62. <!--指定namenode名稱空間的存儲地址-->
  63.         <property>   
  64.                 <name>dfs.namenode.name.dir</name>   
  65.                 <value>file:/data/hadoop/dfs/name</value>  
  66.         </property> 
  67. <!--指定datanode數據存儲地址-->
  68.         <property>   
  69.                 <name>dfs.datanode.data.dir</name>   
  70.                 <value>file:/data/hadoop/dfs/data</value>  
  71.         </property> 
  72. <!--指定數據冗餘份數-->
  73.         <property>   
  74.                 <name>dfs.replication</name>   
  75.                 <value>3</value> 
  76.         </property> 
  77. <!--指定可以通過web訪問hdfs目錄-->
  78.         <property>  
  79.                 <name>dfs.webhdfs.enabled</name>  
  80.                 <value>true</value> 
  81.         </property>

  82. <!--保證數據恢復 -->  
  83.     <property>  
  84.               <name>dfs.journalnode.http-address</name>  
  85.               <value>0.0.0.0:8480</value>  
  86.     </property>  
  87.     <property>  
  88.                  <name>dfs.journalnode.rpc-address</name>  
  89.                  <value>0.0.0.0:8485</value>  
  90.      </property> 
  91.      <property>
  92.               <name>ha.zookeeper.quorum</name>
  93.               <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
  94.     </property>

  95. </configuration>
複製代碼


修改文件yarn-site.xml
  1. <configuration>
  2. <!--rm失聯後重新鏈接的時間--> 
  3. <property> 
  4.    <name>yarn.resourcemanager.connect.retry-interval.ms</name> 
  5.    <value>2000</value> 
  6. </property>
  7. <!--開啓resource manager HA,默認爲false--> 
  8. <property> 
  9.    <name>yarn.resourcemanager.ha.enabled</name> 
  10.    <value>true</value> 
  11. </property> 
  12. <!--配置resource manager -->
  13. <property>
  14.   <name>yarn.resourcemanager.ha.rm-ids</name>
  15.   <value>rm1,rm2</value>
  16. </property>
  17. <property>
  18.   <name>ha.zookeeper.quorum</name>
  19.   <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value> 
  20. </property>

  21. <!--開啓故障自動切換--> 
  22. <property> 
  23.    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> 
  24.    <value>true</value> 
  25. </property> 
  26. <property>
  27.   <name>yarn.resourcemanager.hostname.rm1</name>
  28.   <value>namenode1</value>
  29. </property>
  30.                    
  31. <property>
  32.    <name>yarn.resourcemanager.hostname.rm2</name>
  33.    <value>namenode2</value>
  34. </property>
  35. <!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜歡把配置好的文件遠程複製到其它機器上,但這個在YARN的另一個機器上一定要修改--> 
  36. <property> 
  37.   <name>yarn.resourcemanager.ha.id</name> 
  38.   <value>rm1</value> 
  39. <description>If we want to launch more than one RM in single node, we need this configuration</description> 
  40. </property> 
  41. <!--開啓自動恢復功能--> 
  42. <property>
  43.   <name>yarn.resourcemanager.recovery.enabled</name> 
  44.   <value>true</value> 
  45. </property>
  46. <!--配置與zookeeper的連接地址--> 
  47. <property> 
  48.   <name>yarn.resourcemanager.zk-state-store.address</name> 
  49.   <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
  50. </property> 
  51. <property> 
  52.   <name>yarn.resourcemanager.store.class</name> 
  53.   <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> 
  54. </property> 
  55. <property>
  56.   <name>yarn.resourcemanager.zk-address</name>
  57.   <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
  58. </property>
  59. <property> 
  60.   <name>yarn.resourcemanager.cluster-id</name> 
  61.   <value>gagcluster-yarn</value> 
  62. </property> 
  63. <!--schelduler失聯等待連接時間--> 
  64. <property> 
  65.   <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> 
  66.   <value>5000</value> 
  67. </property> 
  68. <!--配置rm1--> 
  69. <property> 
  70.   <name>yarn.resourcemanager.address.rm1</name> 
  71.   <value>namenode1:8132</value> 
  72. </property> 
  73. <property> 
  74.   <name>yarn.resourcemanager.scheduler.address.rm1</name> 
  75.   <value>namenode1:8130</value> 
  76. </property> 
  77. <property> 
  78.   <name>yarn.resourcemanager.webapp.address.rm1</name> 
  79.   <value>namenode1:8188</value> 
  80. </property> 
  81. <property>
  82.    <name>yarn.resourcemanager.resource-tracker.address.rm1</name> 
  83.    <value>namenode1:8131</value> 
  84. </property> 
  85. <property> 
  86.   <name>yarn.resourcemanager.admin.address.rm1</name> 
  87.   <value>namenode1:8033</value> 
  88. </property> 
  89. <property> 
  90.   <name>yarn.resourcemanager.ha.admin.address.rm1</name> 
  91.   <value>namenode1:23142</value> 
  92. </property> 
  93. <!--配置rm2--> 
  94. <property> 
  95.   <name>yarn.resourcemanager.address.rm2</name> 
  96.   <value>namenode2:8132</value> 
  97. </property> 
  98. <property> 
  99.   <name>yarn.resourcemanager.scheduler.address.rm2</name> 
  100.   <value>namenode2:8130</value> 
  101. </property> 
  102. <property> 
  103.   <name>yarn.resourcemanager.webapp.address.rm2</name> 
  104.   <value>namenode2:8188</value> 
  105. </property> 
  106. <property> 
  107.   <name>yarn.resourcemanager.resource-tracker.address.rm2</name> 
  108.   <value>namenode2:8131</value> 
  109. </property> 
  110. <property> 
  111.   <name>yarn.resourcemanager.admin.address.rm2</name> 
  112.   <value>namenode2:8033</value> 
  113. </property> 
  114. <property> 
  115.   <name>yarn.resourcemanager.ha.admin.address.rm2</name> 
  116.   <value>namenode2:23142</value> 
  117. </property> 
  118. <property> 
  119.   <name>yarn.nodemanager.aux-services</name> 
  120.   <value>mapreduce_shuffle</value> 
  121. </property> 
  122. <property> 
  123.   <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> 
  124.   <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
  125. </property> 
  126. <property> 
  127.   <name>yarn.nodemanager.local-dirs</name> 
  128.   <value>/data/hadoop/yarn/local</value> 
  129. </property> 
  130. <property> 
  131.   <name>yarn.nodemanager.log-dirs</name> 
  132.   <value>/data/log/hadoop</value> 
  133. </property> 
  134. <property> 
  135.   <name>mapreduce.shuffle.port</name> 
  136.   <value>23080</value> 
  137. </property> 
  138. <!--故障處理類--> 
  139. <property> 
  140.   <name>yarn.client.failover-proxy-provider</name> 
  141.   <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value> 
  142. </property> 
  143. <property>
  144.     <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
  145.     <value>/yarn-leader-election</value>
  146.     <description>Optional setting. The default value is /yarn-leader-election</description>
  147. </property>
  148. </configuration>
複製代碼


修改文件mapred-site.xml
  1. <configuration>

  2.         <property>
  3.                 <name>mapreduce.framework.name</name>
  4.                 <value>yarn</value>
  5.         </property>
  6. <!-- 配置 MapReduce JobHistory Server 地址 ,默認端口10020 -->
  7.     <property>
  8.             <name>mapreduce.jobhistory.address</name>
  9.             <value>0.0.0.0:10020</value>
  10.     </property>
  11. <!-- 配置 MapReduce JobHistory Server web ui 地址, 默認端口19888 -->
  12.     <property>
  13.             <name>mapreduce.jobhistory.webapp.address</name>
  14.             <value>0.0.0.0:19888</value>
  15.      </property>
  16. </configuration>
複製代碼

修改文件slaves
  1. atanode1
  2. datanode2
  3. datanode3
  4. datanode4
複製代碼

修改文件yarn-env.sh
  1. export JAVA_HOME=/usr/java/jdk1.7.0_67

  2. export YARN_LOG_DIR=/data/log/hadoop指定日誌存放目錄
複製代碼


把配置好的文件遠程scp到集羣其它節點相應目錄中,注意修改YARN高可用的yarn-site.xml文件中的yarn.resourcemanager.ha.id項
啓動zookeeper集羣(分別在datanode1、datanode2、datanode4上啓動zk) 
            進入到 zookeeper-3.4.5/bin/ 
  1.             ./zkServer.sh start 
複製代碼

            查看狀態: 
  1.             ./zkServer.sh status
複製代碼


            (一個leader,兩個follower)
啓動journalnode(在namenode1上啓動所有journalnode) 
            進入到hadoop-2.6.0
  1.             sbin/hadoop-daemons.sh start journalnode
複製代碼


    或者單獨進入到datanode1,datanode2,datanode4執行
  1.     sbin/hadoop-daemon.sh start journalnode
複製代碼


            (運行jps命令檢驗,多了JournalNode進程)
格式化HDFS 
            在namenode1上執行命令: 
  1.             hadoop namenode -format 
複製代碼

            格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,之後通過sbin/hadoop-daemon.sh start namenode啓動namenode進程在namenode2上執行hdfs namenode -bootstrapStandby完成主備節點同步信息
格式化ZK(在namenode1上執行即可)
  1.             hdfs zkfc -formatZK
複製代碼

啓動HDFS(在namenode1上執行)
  1.             sbin/start-dfs.sh
複製代碼

啓動YARN(在namenode1和namenode2上執行)
  1.             sbin/start-yarn.sh
複製代碼

    注意在namenode2上執行此命令時會提示NodeManager已存在等信息不用管這些,主要是啓動namenode2上的resourceManager完成與namenode1的互備作用,目前沒有找到單獨啓動resourceManager的方法
啓動完成之後可以在瀏覽器中輸入http://192.168.3.161:50070http://192.168.3.162:50070查看namenode分別爲Active和Standby
在namenode1上執行${HADOOP_HOME}/bin/yarn rmadmin -getServiceState rm1查看rm1和rm2分別爲active和standby狀態,也可以通過瀏覽器訪問http://192.168.3.161:8188查看狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章