天天看點

7台機器的hadoop2.4.1高可用(HA)叢集搭建

hadoop2.0已經釋出了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.4.1又增加了YARN HA

注意:apache提供的hadoop-2.4.1的安裝包是在32位作業系統編譯的,因為hadoop依賴一些C++的本地庫,

是以如果在64位的操作上安裝hadoop-2.4.1就需要重新在64作業系統上重新編譯

(建議第一次安裝用32位的系統,我将編譯好的64位的也上傳到群共享裡了,如果有興趣的可以自己編譯一下)

前期準備:

1.修改Linux主機名

2.修改IP

3.修改主機名和IP的映射關系

######注意######如果你們公司是租用的伺服器或是使用的雲主機(如華為用主機、阿裡雲主機等)

/etc/hosts裡面要配置的是内網IP位址和主機名的映射關系

4.關閉防火牆

5.ssh免登陸

6.安裝JDK,配置環境變量等

如下圖所示:

7台機器的hadoop2.4.1高可用(HA)叢集搭建

需要保證這7台機器能夠互相ping 通,并能夠互相ssh免密登入

叢集規劃:

主機名     IP              安裝的軟體                   運作的程序
    weekend01   192.168.1.201   jdk、hadoop                  NameNode、DFSZKFailoverController(zkfc)
    weekend02   192.168.1.202   jdk、hadoop                  NameNode、DFSZKFailoverController(zkfc)
    weekend03   192.168.1.203   jdk、hadoop                  ResourceManager
    weekend04   192.168.1.204   jdk、hadoop                  ResourceManager
    weekend05   192.168.1.205   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain
    weekend06   192.168.1.206   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain
    weekend07   192.168.1.207   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain           

說明:

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狀态

安裝步驟:

1.安裝配置zooekeeper叢集(在weekend05上)

1.1解壓

tar -zxvf zookeeper-3.4.5.tar.gz -C /weekend/

1.2修改配置

cd /weekend/zookeeper-3.4.5/conf/

cp zoo_sample.cfg zoo.cfg

vim zoo.cfg

修改:dataDir=/weekend/zookeeper-3.4.5/tmp

在最後添加:

server.1=weekend05:2888:3888

server.2=weekend06:2888:3888

server.3=weekend07:2888:3888

儲存退出

然後建立一個tmp檔案夾

mkdir /weekend/zookeeper-3.4.5/tmp

再建立一個空檔案

touch /weekend/zookeeper-3.4.5/tmp/myid

最後向該檔案寫入ID

echo 1 > /weekend/zookeeper-3.4.5/tmp/myid

1.3将配置好的zookeeper拷貝到其他節點(首先分别在weekend06、weekend07根目錄下建立一個weekend目錄:mkdir /weekend)

scp -r /weekend/zookeeper-3.4.5/ weekend06:/weekend/

scp -r /weekend/zookeeper-3.4.5/ weekend07:/weekend/

注意:修改weekend06、weekend07對應/weekend/zookeeper-3.4.5/tmp/myid内容
        weekend06:
            echo 2 > /weekend/zookeeper-3.4.5/tmp/myid
        weekend07:
            echo 3 > /weekend/zookeeper-3.4.5/tmp/myid

2.安裝配置hadoop叢集(在weekend01上操作)
    2.1解壓
        tar -zxvf hadoop-2.4.1.tar.gz -C /weekend/
    2.2配置HDFS(hadoop2.0所有的配置檔案都在$HADOOP_HOME/etc/hadoop目錄下)
        #将hadoop添加到環境變量中
        vim /etc/profile
        export JAVA_HOME=/usr/java/jdk1.7.0_55
        export HADOOP_HOME=/weekend/hadoop-2.4.1
        export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

        #hadoop2.0的配置檔案全部在$HADOOP_HOME/etc/hadoop下
        cd /home/hadoop/app/hadoop-2.4.1/etc/hadoop

        2.2.1修改hadoo-env.sh
            export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55

        2.2.2修改core-site.xml
            <configuration>
                <!-- 指定hdfs的nameservice為ns1 -->
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://ns1/</value>
                </property>
                <!-- 指定hadoop臨時目錄 -->
                <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/home/hadoop/app/hadoop-2.4.1/tmp</value>
                </property>

                <!-- 指定zookeeper位址 -->
                <property>
                    <name>ha.zookeeper.quorum</name>
                    <value>weekend05:2181,weekend06:2181,weekend07:2181</value>
                </property>
            </configuration>

        2.2.3修改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>weekend01:9000</value>
                </property>
                <!-- nn1的http通信位址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn1</name>
                    <value>weekend01:50070</value>
                </property>
                <!-- nn2的RPC通信位址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn2</name>
                    <value>weekend02:9000</value>
                </property>
                <!-- nn2的http通信位址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn2</name>
                    <value>weekend02:50070</value>
                </property>
                <!-- 指定NameNode的中繼資料在JournalNode上的存放位置 -->
                <property>
                    <name>dfs.namenode.shared.edits.dir</name>
                    <value>qjournal://weekend05:8485;weekend06:8485;weekend07:8485/ns1</value>
                </property>
                <!-- 指定JournalNode在本地磁盤存放資料的位置 -->
                <property>
                    <name>dfs.journalnode.edits.dir</name>
                    <value>/home/hadoop/app/hadoop-2.4.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/hadoop/.ssh/id_rsa</value>
                </property>
                <!-- 配置sshfence隔離機制逾時時間 -->
                <property>
                    <name>dfs.ha.fencing.ssh.connect-timeout</name>
                    <value>30000</value>
                </property>
            </configuration>

        2.2.4修改mapred-site.xml(mv mapred-site.template mapred-site.xml)
            <configuration>
                <!-- 指定mr架構為yarn方式 -->
                <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                </property>
            </configuration>    

        2.2.5修改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>weekend03</value>
                    </property>
                    <property>
                       <name>yarn.resourcemanager.hostname.rm2</name>
                       <value>weekend04</value>
                    </property>
                    <!-- 指定zk叢集位址 -->
                    <property>
                       <name>yarn.resourcemanager.zk-address</name>
                       <value>weekend05:2181,weekend06:2181,weekend07:2181</value>
                    </property>
                    <property>
                       <name>yarn.nodemanager.aux-services</name>
                       <value>mapreduce_shuffle</value>
                    </property>
            </configuration>


        2.2.6修改slaves(slaves是指定子節點的位置,因為要在weekend01上啟動HDFS、在weekend03啟動yarn,是以weekend01上的slaves檔案指定的是datanode的位置,weekend03上的slaves檔案指定的是nodemanager的位置)
            weekend05
            weekend06
            weekend07

        2.2.7配置免密碼登陸
            #首先要配置weekend01到weekend02、weekend03、weekend04、weekend05、weekend06、weekend07的免密碼登陸
            #在weekend01上生産一對鑰匙
            ssh-keygen -t rsa
            #将公鑰拷貝到其他節點,包括自己
            ssh-coyp-id weekend01
            ssh-coyp-id weekend02
            ssh-coyp-id weekend03
            ssh-coyp-id weekend04
            ssh-coyp-id weekend05
            ssh-coyp-id weekend06
            ssh-coyp-id weekend07
            #配置weekend03到weekend04、weekend05、weekend06、weekend07的免密碼登陸
            #在weekend03上生産一對鑰匙
            ssh-keygen -t rsa
            #将公鑰拷貝到其他節點
            ssh-coyp-id weekend04
            ssh-coyp-id weekend05
            ssh-coyp-id weekend06
            ssh-coyp-id weekend07
            #注意:兩個namenode之間要配置ssh免密碼登陸,别忘了配置weekend02到weekend01的免登陸
            在weekend02上生産一對鑰匙
            ssh-keygen -t rsa
            ssh-coyp-id -i weekend01                

    2.4将配置好的hadoop拷貝到其他節點
        scp -r /weekend/ weekend02:/
        scp -r /weekend/ weekend03:/
        scp -r /weekend/hadoop-2.4.1/ [email protected]:/weekend/
        scp -r /weekend/hadoop-2.4.1/ [email protected]:/weekend/
        scp -r /weekend/hadoop-2.4.1/ [email protected]:/weekend/
        scp -r /weekend/hadoop-2.4.1/ [email protected]:/weekend/
    ###注意:嚴格按照下面的步驟
    2.5啟動zookeeper叢集(分别在weekend05、weekend06、tcast07上啟動zk)
        cd /weekend/zookeeper-3.4.5/bin/
        ./zkServer.sh start
        #檢視狀态:一個leader,兩個follower
        ./zkServer.sh status

    2.6啟動journalnode(分别在在weekend05、weekend06、tcast07上執行)
        cd /weekend/hadoop-2.4.1
        sbin/hadoop-daemon.sh start journalnode
        #運作jps指令檢驗,weekend05、weekend06、weekend07上多了JournalNode程序

    2.7格式化HDFS
        #在weekend01上執行指令:
        hdfs namenode -format
        #格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/weekend/hadoop-2.4.1/tmp,然後将/weekend/hadoop-2.4.1/tmp拷貝到weekend02的/weekend/hadoop-2.4.1/下。
        scp -r tmp/ weekend02:/home/hadoop/app/hadoop-2.4.1/
        ##也可以這樣,建議hdfs namenode -bootstrapStandby

    2.8格式化ZKFC(在weekend01上執行即可)
        hdfs zkfc -formatZK

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

    2.10啟動YARN(#####注意#####:是在weekend03上執行start-yarn.sh,把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,是以把他們分開了,他們分開了就要分别在不同的機器上啟動)
        sbin/start-yarn.sh
        另一台需要手動啟動:(yarn-daemon.sh start resourcemanager)


到此,hadoop-2.4.1配置完畢,可以統計浏覽器通路:
    http://192.168.1.201:50070
    NameNode 'weekend01:9000' (active)
    http://192.168.1.202:50070
    NameNode 'weekend02:9000' (standby)

驗證HDFS HA
    首先向hdfs上傳一個檔案
    hadoop fs -put /etc/profile /profile
    hadoop fs -ls /
    然後再kill掉active的NameNode
    kill -9 <pid of NN>
    通過浏覽器通路:http://192.168.1.202:50070
    NameNode 'weekend02:9000' (active)
    這個時候weekend02上的NameNode變成了active
    在執行指令:
    hadoop fs -ls /
    -rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
    剛才上傳的檔案依然存在!!!
    手動啟動那個挂掉的NameNode
    sbin/hadoop-daemon.sh start namenode
    通過浏覽器通路:http://192.168.1.201:50070
    NameNode 'weekend01:9000' (standby)

驗證YARN:
    運作一下hadoop提供的demo中的WordCount程式:
    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out

OK,大功告成!!!
           

測試叢集工作狀态的一些指令 :

bin/hdfs dfsadmin -report 檢視hdfs的各節點狀态資訊

bin/hdfs haadmin -getServiceState nn1 擷取一個namenode節點的HA狀态

sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode程序

./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc程序