1. 程式人生 > >Hadoop2.7.3-HA 叢集搭建(傳智播客)

Hadoop2.7.3-HA 叢集搭建(傳智播客)

前期準備

1 修改Linux主機名
2 修改IP
3 修改主機名和IP的對映關係 /etc/hosts
4 關閉防火牆
5 ssh免登陸
6 安裝JDK,配置環境變數等

叢集規劃

主機名     IP              安裝的軟體                   執行的程序
mini01  192.168.175.141  jdk、hadoop             NameNode、DFSZKFailoverController(zkfc)
mini02  192.168.175.142  jdk、hadoop             NameNode、DFSZKFailoverController(zkfc)
mini03  192.168.175.143  jdk、hadoop             ResourceManager 
mini04  192.168.175.144  jdk、hadoop             ResourceManager
mini05  192.168.175.145  jdk、hadoop、zookeeper   DataNode、NodeManager、JournalNode、QuorumPeerMain
mini06  192.168.175.146  jdk、hadoop、zookeeper   DataNode、NodeManager、JournalNode、QuorumPeerMain
mini07  192.168.175.147  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狀態

      2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調

安裝步驟

1 安裝配置zookeeper叢集(先在mini05上配置)

2 安裝配置hadoop叢集(先在mini01上操作)

2.0 解壓配置環境變數

tar -zxf hadoop-2.7.3.tar.gz -C /home/apps/ 

vim /etc/profile
export JAVA_HOME=/home/apps/jdk1.8.0
_111 export HADOOP_HOME=/home/apps/hadoop-2.7.3 export PATH=\$PATH:\$JAVA_HOME/bin:$HADOOP_HOME/bin

2.1 修改hadoo-env.sh(#hadoop2.0的配置檔案全部在$HADOOP_HOME/etc/hadoop下)

export JAVA_HOME=/home/apps/jdk1.8.0_111



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/apps/hadoop-2.7.3/tmp</value>
    </property>

    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>mini05:2181,mini06:2181,mini07:2181</value>
    </property>
</configuration>

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>mini01:9000</value>
    </property>
    <!-- nn1的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.ns1.nn1</name>
        <value>mini01:50070</value>
    </property>
    <!-- nn2的RPC通訊地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns1.nn2</name>
        <value>mini02:9000</value>
    </property>
    <!-- nn2的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.ns1.nn2</name>
        <value>mini02:50070</value>
    </property>
    <!-- 指定NameNode的edits元資料在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://mini05:8485;mini06:8485;mini07:8485/ns1</value>
    </property>
    <!-- 指定JournalNode在本地磁碟存放資料的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/apps/hadoop-2.7.3/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>/root/.ssh/id_rsa</value>
    </property>
    <!-- 配置sshfence隔離機制超時時間 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>

2.4 修改mapred-site.xml

<configuration>
    <!-- 指定mr框架為yarn方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

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>mini03</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>mini04</value>
    </property>
    <!-- 指定zk叢集地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>mini05:2181,mini06:2181,mini07:2181</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

2.6 修改slaves

mini05
mini06
mini07

3 配置免登陸

配置mini01到mini02、mini03、mini04、mini05、mini06、mini07的免密碼登陸
1 在mini01上生產一對鑰匙
ssh-keygen -t rsa
2 將公鑰拷貝到其他節點,包括自己
ssh-coyp-id mini01
ssh-coyp-id mini02
ssh-coyp-id mini03
ssh-coyp-id mini04
ssh-coyp-id mini05
ssh-coyp-id mini06
ssh-coyp-id mini07

配置mini03到mini04、mini05、mini06、mini07的免密碼登陸
mini03上生產一對鑰匙
ssh-keygen -t rsa
將公鑰拷貝到其他節點
ssh-coyp-id mini03
ssh-coyp-id mini04
ssh-coyp-id mini05
ssh-coyp-id mini06
ssh-coyp-id mini07

#注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置mini02到mini01的免登陸
在mini02上生產一對鑰匙
ssh-keygen -t rsa
ssh-coyp-id -i mini01

4 拷貝到其他節點

scp -r /home/apps/ mini02:/home/apps/
scp -r /home/apps/ mini03:/home/apps/
scp -r /home/apps/ mini04:/home/apps/
scp -r /home/apps/ mini05:/home/apps/
scp -r /home/apps/ mini06:/home/apps/
scp -r /home/apps/ mini07:/home/apps/

5 執行步驟

5.1 啟動zookeeper叢集(分別在mini05、mini06、mini07上啟動zk)

cd /home/apps/zookeeper-3.4.9/bin/
./zkServer.sh start
#檢視狀態:一個leader,兩個follower
./zkServer.sh status

5.2 啟動journalnode(分別在在mini05、mini06、mini07上執行)

cd /home/apps/hadoop-2.7.3/
sbin/hadoop-daemon.sh start journalnode
#執行jps命令檢驗,mini05、mini06、mini07上多了JournalNode程序

5.3 格式化HDFS(由於叢集格式都完全一樣, 先格式化一臺然後再拷貝)

#在mini01上執行命令:
    hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/home/apps/hadoop-2.7.3/tmp,然後將/home/apps/hadoop-2.7.3/tmp拷貝到hadoop02的/home/apps/hadoop-2.7.3/下。
    scp -r tmp/ mini02:/home/apps/hadoop-2.7.3/

也可以這樣,建議hdfs namenode -bootstrapStandby

5.4 格式化ZKFC(在mini01上執行一次即可)

hdfs zkfc -formatZK

5.5 啟動HDFS(在mini01上執行)

sbin/start-dfs.sh

5.6啟動YARN

在mini03上執行 start-yarn.sh
在mini04上執行 yarn-daemon.sh start resourcemanager
由於把namenode和resourcemanager分開是因為效能問題,因為他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)

6 瀏覽器檢視

http://mini01:50070
NameNode 'mini01:9000' (active)
http://mini02:50070
NameNode 'mini02:9000' (standby)

7 驗證HDFS HA

先向hdfs上傳一個檔案
hdfs dfs -put /etc/profile /profile
hdfs dfs -ls /

然後再kill掉active的NameNode
kill -9 <pid of NN>
通過瀏覽器訪問:http://mini02:50070
NameNode 'mini02:9000' (active)
這個時候mini02上的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://mini01:50070
NameNode 'mini01:9000' (standby)

8 驗證YARN

在任意一臺機器上執行一下hadoop提供的demo中的WordCount程式:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /profile /out

其他

測試叢集工作狀態的一些指令
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程序**