配置Hadoop-2.4.0的HA Federation Yarn詳細記錄

本篇是配置HA和Federation,並非單獨配置其中一個,我參考了吳超老師及網上的資料,詳細的記錄了我搭建的全過程

吳超老師搭建:國內第一篇詳細講解hadoop2的automatic HA Federation Yarn配置的教程

下面開始我苦逼的搭建四個結點的過程

1.配置資訊

主機名         IP                            作業系統                   是否NameNode   是否JournalNode   是否Zookeeper   是否ZKFC   是否DataNode

hadoop1      192.168.1.151        RedHat 6.5                是                         是                           是                        是                是

hadoop2      192.168.1.152        CentOS 6.5 mini        是                         是                           是                        是                是     

hadoop3      192.168.1.153        CentOS 6.5 mini        是                         是                           是                        是                是

hadoop4      192.168.1.154        CentOS 6.5 mini        是                         是                           否                        是                是

我的電腦是渣渣,總共才8G記憶體,不能太囂張的安裝很多大型虛擬機器,就算四個小的,CPU也跟不上,只好裝迷你版,大量的操作通過 hadoop1 完成

2.我用的軟體版本

jdk-7u71-linux-i586.tar.gz

hadoop-2.4.0.tar.gz

zookeeper-3.4.6.tar.gz

3.我配置的體系結構

hadoop1和hadoop2組成一個HA,hadoop3和hadoop4組成一個HA

hadoop1和hadoop3組成Federation的兩個 nameservice,hadoop2和hadoop4分別是他們的Standby

下面圖片展示的是 HA和Federation的體系結構,當然這不是我的架構,只是網路上的圖片,便於理解這個體系

HA Federation體系結構

4.我安裝的目錄

jdk:/usr/lib/jdk

hadoop:/usr/local/hadoop

zookeeper:/usr/local/zookeeper

5.既然能搭建HA和Federation,想必基本的分散式系統,單機模式都搭建成功了,下面直接講配置

hadoop-env.sh,yarn-env.sh

export JAVA_HOME=/usr/local/jdk   

具體詳細配置參考度娘

core-site.xml

 <property>

<name>hadoop.tmp.dir</name>           –臨時資料夾,預設在linux 的 /tmp下,每次重啟都會清空,配置下比較好

<value>/usr/local/hadoop/tmp</value>

</property>

<property> 

<name>ha.zookeeper.quorum</name>             –Zookeeper叢集的地址埠,要是奇數,不少於3個結點,用於選舉,自動切換HA的namenode結點

<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>

</property>

<property>

<name>fs.defaultFS</name>               –接下來的三個配置時配置 Federation的,我是配置成功了,具體怎麼用還沒研究清楚,後期慢慢的編輯

<value>viewfs:///</value>

</property>

<property>

<name>fs.viewfs.mounttable.default.link./cluster1</name>

<value>hdfs://HadoopCluster1/c1</value>

</property>

<property>

<name>fs.viewfs.mounttable.default.link./cluster2</name>

<value>hdfs://HadoopCluster2/c2</value>

</property>

   <property>

    <name>hadoop.proxyuser.hadoop.hosts</name>

    <value>*</value>

   </property>

   <property>

       <name>hadoop.proxyuser.hadoop.groups</name>

       <value>*</value>

   </property>

<property>

   <name>ha.zookeeper.session-timeout.ms</name>

    <value>1000</value>

    <description>ms</description>

</property>

hdfs-site.xml

關於這個,網路上說不同的Federation結點這個配置不一樣,我這邊是配置成一樣的,方便同步到其他機器,為什麼能配置一樣我會註釋的

<property>

<name>dfs.namenode.name.dir</name> 

<value>file:///usr/local/hadoop/dfs/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:///usr/local/hadoop/dfs/data</value>

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/usr/local/hadoop/dfs/journal</value>

</property>

<property> 

<name>dfs.replication</name> 

<value>2</value>

</property>

<property> 

<name>dfs.nameservices</name>

<value>HadoopCluster1,HadoopCluster2</value>

</property>

<property>

<name>dfs.ha.namenodes.HadoopCluster1</name>

<value>hadoop1,hadoop2</value>

</property>

<property>

<name>dfs.namenode.rpc-address.HadoopCluster1.hadoop1</name>

<value>hadoop1:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.HadoopCluster1.hadoop1</name>

<value>hadoop1:50070</value>

</property>

<property>

<name>dfs.namenode.rpc-address.HadoopCluster1.hadoop2</name>

<value>hadoop2:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.HadoopCluster1.hadoop2</name>

<value>hadoop2:50070</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir.HadoopCluster1</name>

<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/HadoopCluster1</value>

</property>

<property>

<name>dfs.ha.automatic-failover.enabled.HadoopCluster1</name>

<value>true</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.HadoopCluster1</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<property>

<name>dfs.ha.namenodes.HadoopCluster2</name>

<value>hadoop3,hadoop4</value>

</property>

<property>

<name>dfs.namenode.rpc-address.HadoopCluster2.hadoop3</name>

<value>hadoop3:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.HadoopCluster2.hadoop3</name>

<value>hadoop3:50070</value>

</property>

<property>

<name>dfs.namenode.rpc-address.HadoopCluster2.hadoop4</name>

<value>hadoop4:9000</value>

</property>

<property>

<name>dfs.namenode.http-address.HadoopCluster2.hadoop4</name>

<value>hadoop4:50070</value>

</property>

<property>

<name>dfs.namenode.shared.edits.dir.HadoopCluster2</name>

<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/HadoopCluster2</value>

</property>

<property>

<name>dfs.ha.automatic-failover.enabled.HadoopCluster2</name>

<value>true</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.HadoopCluster2</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/home/hadoop/.ssh/id_rsa</value>

</property>

<property>

<name>dfs.datanode.max.xcievers</name>

<value>4096</value>

</property>

mapred-site.xml

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

yarn-site.xml

<property>

<name>yarn.resourcemanager.hostname</name>

<value>hadoop1</value>

</property>
<property>

<name>yarn.resourcemanager.scheduler.class</name>

<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</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>

這些都是些基本的配置,如果你想個性化配置,自己配置就行,我一般都是預設系統的地址和埠

slaves

hadoop1

hadoop2

hadoop3

hadoop4

啟動

6.啟動Zookeeper

在hadoop1,hadoop2,hadoop3上執行  /usr/local/zookeeper/bin/zkServer.sh start

檢測:/usr/local/zookeeper/bin/zkServer.sh status

看看zookeeper的狀態,一般一個  leader 和  剩下的 follower

7.接下來格式化Zookeeper叢集,用於HA

在hadoop1上執行:/usr/local/hadoop/bin/hdfs zkfc –formatZK

在hadoop3上執行:/usr/local/hadoop/bin/hdfs zkfc –formatZK

具體的格式化產生的日誌是什麼樣的,我就不貼了,可以參考我給出的吳超老師的頁面

檢測是否成功:/usr/local/zookeeper/bin/zkCli.sh

WatchedEvent state:SyncConnected type:None path:null

[zk: localhost:2181(CONNECTED) 0] ls /

[hadoop-ha, zookeeper]

[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha

[HadoopCluster2, HadoopCluster1]

到這裡執行  quit  退出即可

8.啟動Journalnode叢集,我選四個結點都是Journalnode結點,方便一起啟動

在一個結點上執行,我選擇hadoop1:/usr/local/hadoop/sbin/hadoop-daemons.sh startjournalnode  –這是一起啟動所有結點的journalnode,熟悉這個啟動指令碼會明白

如果你選擇一個結點一個結點的啟動:/usr/local/hadoop/sbin/hadoop-daemon.sh startjournalnode   –妥妥滴,在所有節點都執行一遍

利用 jps 檢視程序資訊看看是否有   journalnode  程序

進入 /usr/local/hadoop/dfs/  下  會生成一個 journal  資料夾 ,請看配置,這個是自己定義的

9.格式化HadoopCluster1的Namenode

格式化hadoop1

在hadoop1執行以下命令:/usr/local/hadoop/bin/hdfs namenode -format -clusterid liufeiqiang

注意這裡的   liufeiqiang  是你自己 定義的叢集 ID,使用federation時,叢集ID一定要自己指定,保證大家ID一樣 ,格式化另一個 nameservice 時要用到,

格式化完畢,檢視/usr/local/hadoop/dfs/ 資料夾,這時生成了一個name 資料夾

啟動hadoop1的namenode:/usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

這時用  jps  命令看看是否有  namenode  程序,有即表示成功,這時可以訪問  hadoop1:50070 如果開啟頁面,也表示啟動成功

格式化hadoop2,這裡的hadoop2是hadoop1的熱備,所以不能單純的格式化,需要同步資料,

在hadoop2上執行命令:/usr/local/hadoop/bin/hdfs namenode –bootstrapStandby

等格式化完成,驗證是否格式化成功,在/usr/local/hadoop/dfs/ 目錄下 生成  name 資料夾,表示成功

啟動hadoop2的namenode:/usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

利用 jps 命令,或 hadoop2:50070 都可以檢視是否啟動成功

10.格式化HadoopCluster2的Namenode

格式化hadoop3

在hadoop3執行以下命令:/usr/local/hadoop/bin/hdfs namenode -format -clusterid liufeiqiang        –看,這裡的  liufeiqiang  就是和上面的叢集 ID  一致,而吳超老師為什麼兩個叢集ID設定的不一致,我也沒看懂,還有待以後的學習。

格式化完畢,檢視/usr/local/hadoop/dfs/ 資料夾,這時生成了一個name 資料夾

啟動hadoop3的namenode:/usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

這時用  jps  命令看看是否有  namenode  程序,有即表示成功,這時可以訪問  hadoop3:50070 如果開啟頁面,也表示啟動成功

格式化hadoop4,這裡的hadoop4是hadoop3的熱備,所以也不能單純的格式化,需要同步資料,

在hadoop4上執行命令:/usr/local/hadoop/bin/hdfs namenode –bootstrapStandby

等格式化完成,驗證是否格式化成功,在/usr/local/hadoop/dfs/ 目錄下 生成  name 資料夾,表示成功

啟動hadoop4的namenode:/usr/local/hadoop/sbin/hadoop-daemon.sh start namenode

利用 jps 命令,或 hadoop4:50070 都可以檢視是否啟動成功

11.啟動所有的Datanode

在hadoop1上執行命令:/usr/local/hadoop/sbin/hadoop-daemons.sh start datanode       –這裡注意下,如果你叢集上的 slaves  檔案一樣,那麼隨便一個結點都可以啟動

用 jps 命令檢查是否有 DataNode 程序,或訪問  hadoop1:50075,能開啟頁面也表示成功

12.啟動 Yarn

在hadoop1上執行命令:/usr/local/hadoop/sbin/start-yarn.sh            –這裡也是一樣的,隨便一個節點都可以

用 jps 命令檢查是否有 ResourceManager 程序,或訪問  hadoop1:8088,能開啟頁面也表示成功

13.啟動 ZooKeeperFailoverController

在hadoop1上執行命令:/usr/local/hadoop/sbin/hadoop-daemons.sh start zkfc     –妥妥滴一條命令,啟動所有節點的ZKFC

–如果你想單獨啟動ZKFC,在hadoop1、hadoop2、hadoop3、hadoop4上分別執行命令:/usr/local/hadoop/sbin/hadoop-daemon.sh start zkfc 

利用 jps 檢視是否有 DFSZKFailoverController 程序,有則表示成功

14.驗證 HDFS 是否可行

15.驗證 Yarn 是否可行

16.驗證HA的故障自動轉移是否好用

開始時,hadoop3是standby node,hadoop4是active node ,把hadoop4的namenode程序kill掉   kill -9 pid

重新整理頁面

自動轉換成功,perfect

17.下面貼出啟動完成後所有的程序

[[email protected] ~]$ jps                                               [[email protected] ~]$ jps

2915 DataNode                                                                1387 NameNode

3039 ResourceManager                                                   1114 QuorumPeerMain

3145 NodeManager                                                          1634 NodeManager

2539 JournalNode                                                            1176 DFSZKFailoverController

2661 NameNode                                                              1519 DataNode

5154 Jps                                                                           3153 Jps

2430 DFSZKFailoverController                                        1243 JournalNode

2316 QuorumPeerMain

[[email protected] ~]$ jps                                               [[email protected] ~]$ jps

1882 QuorumPeerMain                                                    1550 NodeManager

2836 DataNode                                                                 3084 Jps

4494 Jps                                                                           1313 NameNode

2037 JournalNode                                                             1124 DFSZKFailoverController

2953 NodeManager                                                          1181 JournalNode

2632 NameNode                                                               1436 DataNode

1963 DFSZKFailoverController

媽蛋,我的手要凍掉了,寒冷的冬天,沒個妹子,心冷手冷身體更冷快哭了快哭了快哭了,今天就記到這裡,剩下的慢慢補全,這個是我一點一點記錄的,苦逼的IT技術員,請各位大牛不要嘲笑,如果要轉載,請註明出處,順帶給我漲點人氣大哭大哭大哭大哭