Hadoop HA搭建


hadoop HA部署

說明:
    1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,
      以便能夠在它失敗時快速進行切換。hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據
      信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換
      Standby NameNode為standby狀態
    2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop2.5.1開啟RM高用后可以解決這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調

集群規划:
主機名        IP地址                  安裝的軟件                      運行的進程
node1      192.168.40.143    jdk,hadoop                    NameNode,DFSZKFailoverController
node2      192.168.40.144    jdk,hadoop,zookeeper    NameNode,DFSZKFailoverController,DataNode,NodeManager,QuorumPeerMain,JournalNode
node3      192.168.40.145    jdk,hadoop,zookeeper    DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
node4      192.168.40.140    jdk,hadoop,zookeeper    DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode

1.准備環境,四台虛擬機,64位CentOS6.5系統,hadoop版本2.5.1
    192.168.40.143
    192.168.40.144
    192.168.40.145
    192.168.40.140
2.配置hosts
  在/etc/hosts下配置端口映射
  192.168.40.143 node1
  192.168.40.144 node2
  192.168.40.145 node3
  192.168.40.140 node4
3.安裝jdk1.7.0_79
4.建立hadoop運行賬號hello(四台機器一樣)
5.使用hadoop用戶操作:ssh遠程免密碼登陸
6.在node2,node3,node4上安裝zookeeper(詳細安裝步驟略,見前面文章)
7.安裝配置hadoop集群(在node1上操作)    
    7.1下載並解壓hadoop安裝包
        tar -zxvf hadoop-2.5.1-x64.tar.gz
    7.2修改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下)
        #將hadoop添加到環境變量中
        vim /etc/profile
        export HADOOP_HOME=/home/hello/app/hadoop-2.5.1
        export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

        7.2.1修改core-site.xml
            <configuration>
                <!-- 指定hdfs的nameservice為ns1 -->
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://ns1/</value>
                </property>
                <!-- 指定hadoop臨時目錄,tmp這個目錄需要提前建立好 -->
                <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/home/hello/app/hadoop-2.5.1/tmp</value>
                </property>
                <!-- 指定zookeeper地址 -->
                <property>
                    <name>ha.zookeeper.quorum</name>
                    <value>node2:2181,node3:2181,node4:2181</value>
                </property>
            </configuration>
        
        7.2.2修改hdfs-site.xml
            <configuration>
                <!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->
                <property>
                    <name>dfs.nameservices</name>
                    <value>ns1</value>
                </property>
                <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
                <property>
                    <name>dfs.ha.namenodes.ns1</name>
                    <value>nn1,nn2</value>
                </property>
                <!-- nn1的RPC通信地址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn1</name>
                    <value>node1:9000</value>
                </property>
                <!-- nn1的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn1</name>
                    <value>node1:50070</value>
                </property>
                <!-- nn2的RPC通信地址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn2</name>
                    <value>node2:9000</value>
                </property>
                <!-- nn2的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn2</name>
                    <value>node2:50070</value>
                </property>
                <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
                <property>
                    <name>dfs.namenode.shared.edits.dir</name>
                    <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
                </property>
                <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
                <property>
                    <name>dfs.journalnode.edits.dir</name>
                    <value>/home/hello/app/hadoop-2.5.1/journaldata</value>
                </property>
                <!-- 開啟NameNode失敗自動切換 -->
                <property>
                    <name>dfs.ha.automatic-failover.enabled</name>
                    <value>true</value>
                </property>
                <!-- 配置失敗自動切換實現方式 -->
                <property>
                    <name>dfs.client.failover.proxy.provider.ns1</name>
                    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                </property>
                <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
                <property>
                    <name>dfs.ha.fencing.methods</name>
                    <value>
                        sshfence
                        shell(/bin/true)
                    </value>
                </property>
                <!-- 使用sshfence隔離機制時需要ssh免登陸 -->
                <property>
                    <name>dfs.ha.fencing.ssh.private-key-files</name>
                    <value>/home/hello/.ssh/id_rsa</value>
                </property>
                <!-- 配置sshfence隔離機制超時時間 -->
                <property>
                    <name>dfs.ha.fencing.ssh.connect-timeout</name>
                    <value>30000</value>
                </property>
            </configuration>
        
        7.2.3修改mapred-site.xml
            <configuration>
                <!-- 指定mr框架為yarn方式 -->
                <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                </property>
            </configuration>    
        
        7.2.4修改yarn-site.xml
            <configuration>
                    <!-- 開啟RM高可用 -->
                    <property>
                       <name>yarn.resourcemanager.ha.enabled</name>
                       <value>true</value>
                    </property>
                    <!-- 指定RM的cluster id -->
                    <property>
                       <name>yarn.resourcemanager.cluster-id</name>
                       <value>yrc</value>
                    </property>
                    <!-- 指定RM的名字 -->
                    <property>
                       <name>yarn.resourcemanager.ha.rm-ids</name>
                       <value>rm1,rm2</value>
                    </property>
                    <!-- 分別指定RM的地址 -->
                    <property>
                       <name>yarn.resourcemanager.hostname.rm1</name>
                       <value>node3</value>
                    </property>
                    <property>
                       <name>yarn.resourcemanager.hostname.rm2</name>
                       <value>node4</value>
                    </property>
                    <!-- 指定zk集群地址 -->
                    <property>
                       <name>yarn.resourcemanager.zk-address</name>
                       <value>node2:2181,node3:2181,node4:2181</value>
                    </property>
                    <property>
                       <name>yarn.nodemanager.aux-services</name>
                       <value>mapreduce_shuffle</value>
                    </property>
            </configuration>
            
        7.2.5修改slaves
            node2
            node3
            node4
                
        7.2.6修改hadoop-env.sh
            export JAVA_HOME=/usr/java/jdk1.7.0_79
            
        7.2.7修改yarn-env.sh
            export JAVA_HOME=/usr/java/jdk1.7.0_79

    7.3將配置好的hadoop拷貝到其他節點
        scp -r  ./hadoop-2.5.1 hello@node2:/home/hello/app/
        scp -r  ./hadoop-2.5.1 hello@node3:/home/hello/app/
        scp -r  ./hadoop-2.5.1 hello@node4:/home/hello/app/

###注意:嚴格按照下面的步驟
8.啟動集群
    8.1啟動zookeeper集群(分別在node2、node3、node4上啟動zk)
        cd /home/hello/app/zookeeper-3.4.7
        ./bin/zkServer.sh start
        #查看狀態:一個leader,兩個follower
        ./bin/zkServer.sh status

    8.2啟動journalnode(分別在在node2、node3、node4上執行)
        cd /weekend/hadoop-2.5.1
        ./sbin/hadoop-daemon.sh start journalnode
        #運行/usr/java/jdk1.7.0_79/bin/jps命令檢驗,node2、node3、node4上多了JournalNode進程
        
    8.3格式化HDFS
        #在node1上執行命令:
        ./bin/hdfs namenode -format
        #格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/home/hello/app/hadoop-2.5.1/tmp,
        #然后將/home/hello/app/hadoop-2.5.1/tmp拷貝到node2的/home/hello/app/hadoop-2.5.1/下。
        scp -r ./tmp/ hello@node2:/home/hello/app/hadoop-2.5.1/
        ##也可以這樣,建議hdfs namenode -bootstrapStandby
        
    8.4格式化ZKFC(在node1上執行即可)
        ./bin/hdfs zkfc -formatZK
        
    8.5啟動HDFS(在node1上執行)
        ./sbin/start-dfs.sh

    8.6啟動YARN(分別在node3,node4上執行)
        ./sbin/start-yarn.sh
    
測試集群工作狀態的一些指令:
./bin/hdfs dfsadmin -report                           查看hdfs的各節點狀態信息
./bin/hdfs haadmin -getServiceState nn1        查看namenode高可用
./bin/yarn rmadmin –getServiceState rm1       查看ResourceManager高可用
./sbin/hadoop-daemon.sh start namenode     單獨啟動一個namenode進程
./hadoop-daemon.sh start zkfc                     單獨啟動一個zkfc進程

附:成功部署完成后的截圖


免責聲明!

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



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