搭建hadoop2.6.0 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文件,如下:

192.168.3.161 namenode1
192.168.3.162 namenode2
192.168.3.163 datanode1
192.168.3.164 datanode2
192.168.3.165 datanode3
192.168.3.166 datanode4

安裝jdk1.7和hadoop並配置環境變量,可以配置全局的(修改/etc/profile)也可以配置當前用戶的(修改~/.bashrc文件),這里我配置是全局的環境變量

安裝jdk的過程直接解壓tar xzvf jdk.tar, 這里不做說明了,列出/etc/profile文件中末尾添加的內容如下:

export JAVA_HOME=/usr/java/jdk1.7.0_67
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/home/hadoop/hadoop_installs/hadoop-2.6.0

使用root用戶關閉防火牆和selinux

service iptables stop

centos7好像把防火牆修改成firewalld,可以試試service firewalld stop

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文件)

文件最后添加

server.1=datanode1:2888:3888

server.2=datanode2:2888:3888

 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

export JAVA_HOME=/usr/java/jdk1.7.0_67

export HADOOP_LOG_DIR=/data/log/hadoop指定日志存放目錄

修改文件core-site.xml

 <configuration>
  <!-- 指定hdfs的nameservice為ns1,是NameNode的URI。hdfs://主機名:端口/ -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://gagcluster</value>
        </property>

        <property>
                <name>io.file.buffer.size</name>
                <value>131072</value>
        </property>
<!-- 指定hadoop臨時目錄 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/data/hadoop/tmp</value>
                <description>Abase for other temporary directories.</description>
        </property>
<!--指定可以在任何IP訪問-->
        <property>
                <name>hadoop.proxyuser.hduser.hosts</name>
                <value>*</value>
        </property>
<!--指定所有用戶可以訪問-->
        <property>
                <name>hadoop.proxyuser.hduser.groups</name>
                <value>*</value>
        </property>
<!-- 指定zookeeper地址 -->
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
        </property>

</configuration>

修改文件hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
        <property>
                <name>dfs.nameservices</name>
                <value>gagcluster</value>
        </property>
<!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
        <property>
                <name>dfs.ha.namenodes.gagcluster</name>
                <value>nn1,nn2</value>
        </property>
<!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.gagcluster.nn1</name>
                <value>namenode1:9000</value>
        </property>
<!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.gagcluster.nn2</name>
                <value>namenode2:9000</value>
        </property>

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

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

<!-- 配置失敗自動切換實現方式 -->
        <property>
                <name>dfs.client.failover.proxy.provider.gagcluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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/hadoop/.ssh/id_rsa</value>
        </property>
<!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/data/hadoop/tmp/journal</value>
        </property>
<!--指定支持高可用自動切換機制-->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
<!--指定namenode名稱空間的存儲地址-->
        <property>   
                <name>dfs.namenode.name.dir</name>   
                <value>file:/data/hadoop/dfs/name</value>  
        </property>
<!--指定datanode數據存儲地址-->
        <property>   
                <name>dfs.datanode.data.dir</name>   
                <value>file:/data/hadoop/dfs/data</value>  
        </property>
<!--指定數據冗余份數-->
        <property>   
                <name>dfs.replication</name>   
                <value>3</value>
        </property>
<!--指定可以通過web訪問hdfs目錄-->
        <property>  
                <name>dfs.webhdfs.enabled</name>  
                <value>true</value>
        </property>

<!--保證數據恢復 -->  
    <property>  
              <name>dfs.journalnode.http-address</name>  
              <value>0.0.0.0:8480</value>  
    </property>  
    <property>  
                 <name>dfs.journalnode.rpc-address</name>  
                 <value>0.0.0.0:8485</value>  
     </property>
     <property>
              <name>ha.zookeeper.quorum</name>
              <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
    </property>

</configuration>

修改文件yarn-site.xml

<configuration>
<!--rm失聯后重新鏈接的時間-->
<property>
   <name>yarn.resourcemanager.connect.retry-interval.ms</name>
   <value>2000</value>
</property>
<!--開啟resource manager HA,默認為false-->
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
</property>
<!--配置resource manager -->
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<property>
  <name>ha.zookeeper.quorum</name>
  <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
</property>

<!--開啟故障自動切換-->
<property>
   <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>namenode1</value>
</property>
                   
<property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>namenode2</value>
</property>
<!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜歡把配置好的文件遠程復制到其它機器上,但這個在YARN的另一個機器上一定要修改-->
<property>
  <name>yarn.resourcemanager.ha.id</name>
  <value>rm1</value>
<description>If we want to launch more than one RM in single node, we need this configuration</description>
</property>
<!--開啟自動恢復功能-->
<property>
  <name>yarn.resourcemanager.recovery.enabled</name>
  <value>true</value>
</property>
<!--配置與zookeeper的連接地址-->
<property>
  <name>yarn.resourcemanager.zk-state-store.address</name>
  <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
</property>
<property>
  <name>yarn.resourcemanager.store.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>gagcluster-yarn</value>
</property>
<!--schelduler失聯等待連接時間-->
<property>
  <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
  <value>5000</value>
</property>
<!--配置rm1-->
<property>
  <name>yarn.resourcemanager.address.rm1</name>
  <value>namenode1:8132</value>
</property>
<property>
  <name>yarn.resourcemanager.scheduler.address.rm1</name>
  <value>namenode1:8130</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>namenode1:8188</value>
</property>
<property>
   <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
   <value>namenode1:8131</value>
</property>
<property>
  <name>yarn.resourcemanager.admin.address.rm1</name>
  <value>namenode1:8033</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.admin.address.rm1</name>
  <value>namenode1:23142</value>
</property>
<!--配置rm2-->
<property>
  <name>yarn.resourcemanager.address.rm2</name>
  <value>namenode2:8132</value>
</property>
<property>
  <name>yarn.resourcemanager.scheduler.address.rm2</name>
  <value>namenode2:8130</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>namenode2:8188</value>
</property>
<property>
  <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  <value>namenode2:8131</value>
</property>
<property>
  <name>yarn.resourcemanager.admin.address.rm2</name>
  <value>namenode2:8033</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.admin.address.rm2</name>
  <value>namenode2:23142</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
  <name>yarn.nodemanager.local-dirs</name>
  <value>/data/hadoop/yarn/local</value>
</property>
<property>
  <name>yarn.nodemanager.log-dirs</name>
  <value>/data/log/hadoop</value>
</property>
<property>
  <name>mapreduce.shuffle.port</name>
  <value>23080</value>
</property>
<!--故障處理類-->
<property>
  <name>yarn.client.failover-proxy-provider</name>
  <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
</property>
<property>
    <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
    <value>/yarn-leader-election</value>
    <description>Optional setting. The default value is /yarn-leader-election</description>
</property>
</configuration>

修改文件mapred-site.xml

<configuration>

        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
<!-- 配置 MapReduce JobHistory Server 地址 ,默認端口10020 -->
    <property>
            <name>mapreduce.jobhistory.address</name>
            <value>0.0.0.0:10020</value>
    </property>
<!-- 配置 MapReduce JobHistory Server web ui 地址, 默認端口19888 -->
    <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>0.0.0.0:19888</value>
     </property>
</configuration>

修改文件slaves

atanode1
datanode2
datanode3
datanode4

修改文件yarn-env.sh

export JAVA_HOME=/usr/java/jdk1.7.0_67

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/
            ./zkServer.sh start
            查看狀態:
            ./zkServer.sh status
            (一個leader,兩個follower)

啟動journalnode(在namenode1上啟動所有journalnode)
            進入到hadoop-2.6.0
            sbin/hadoop-daemons.sh start journalnode

    或者單獨進入到datanode1,datanode2,datanode4執行

    sbin/hadoop-daemon.sh start journalnode
            (運行jps命令檢驗,多了JournalNode進程)

格式化HDFS
            在namenode1上執行命令:
            hadoop namenode -format
            格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,之后通過sbin/hadoop-daemon.sh start namenode啟動namenode進程在namenode2上執行hdfs namenode -bootstrapStandby完成主備節點同步信息

格式化ZK(在namenode1上執行即可)
            hdfs zkfc -formatZK

啟動HDFS(在namenode1上執行)
            sbin/start-dfs.sh

啟動YARN(在namenode1)
            sbin/start-yarn.sh

在namenode2上執行sbin/yarn-daemon.sh start resourcemanager啟動resourceManager進程

啟動完成之后可以在瀏覽器中輸入http://192.168.3.161:50070和http://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查看狀態


免責聲明!

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



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