帶你快速搭建Hadoop的HA集羣!

        相信在看了上一篇博客《帶你快速認識NamenodeHA和Yarn HA,爲搭建HadoopHA集羣打下基礎!》後,大家一定對於如何搭建HA集羣非常期待٩(๑❛ᴗ❛๑)۶不要慌,本篇博客即將爲大家帶來搭建HA集羣的詳細教程!

        碼字不易,先贊後看!
在這裏插入圖片描述


Hadoop HA集羣的搭建

友情提示

        以下所有的操作均是有Hadoop集羣的基礎上執行的。建議第一次安裝集羣的朋友先去看這篇博客《Hadoop(CDH)分佈式環境搭建》,先搭建起一個正常可用的集羣,再看這篇博客《zookeeper的安裝詳解》在集羣上安裝好了Zookeeper後再來看這篇進階的博客。

<1> 安裝配置Hadoop集羣

① 備份集羣

        因爲我們事先已經搭建好了一個集羣,所以我們需要先把之前的hadoop集羣關閉
        stop-all.sh

        然後將之前的hadoop所在的目錄進行備份(三臺節點)

        cd /export/servers/

        mv mv hadoop-2.6.0-cdh5.14.0 hadoop-2.6.0-cdh5.14.0_bk

② 解壓新的集羣

        進入到hadoop安裝包所在的目錄,重新解壓。

        cd /export/softwares/

        tar -zxvf hadoop-2.6.0-cdh5.14.0.tar.gz -C ../servers/

③ 配置HDFS

需要注意的是,hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下

這一步本該是做一些添加系統環境變量之類的操作,但因爲我們在之前的集羣中就已經完成了這些操作,所以這一步的內容就可以直接跳過了~這也是爲什麼我推薦你們先搭建好一個集羣的原因。

④ 修改core-site.xml

        進入到指定的目錄下:

        cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop

        編輯core-site.xml,添加如下配置

        vim core-site.xml

<configuration>
<!-- 集羣名稱在這裏指定!該值來自於hdfs-site.xml中的配置 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<!-- 這裏的路徑默認是NameNode、DataNode、JournalNode等存放數據的公共目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/HAhadoopDatas/tmp</value>
</property>

<!-- ZooKeeper集羣的地址和端口。注意,數量一定是奇數,且不少於三個節點-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
</configuration>

⑤ 修改hdfs-site.xml

        vim hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice爲cluster1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<!-- cluster1下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn1</name>
<value>node01:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nn1</name>
<value>node01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn2</name>
<value>node02:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nn2</name>
<value>node02:50070</value>
</property>
<!-- 指定NameNode的edits元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/cluster1</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/journaldata</value>
</property>
<!-- 開啓NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定該集羣出故障時,哪個實現類負責執行故障切換 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
</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>

⑦ 修改mapred-site.xml

        先備份一份
        cp mapred-site.xml.template mapred-site.xml

        編輯mapred-site.xml,添加如下內容

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

⑧修改yarn-site.xml

        修改yarn-site.xml,添加如下內容:

        vim 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>node01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node02</value>
</property>
<!-- 指定zk集羣地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

⑨修改slaves

vim slaves

node01
node02
node03

        將軟件拷貝到所有節點

        這裏是用scp命令,當然xsync可是可以的~

        scp -r hadoop-2.6.0-cdh5.14.0 node02:/$PWD
        scp -r hadoop-2.6.0-cdh5.14.0 node03:/$PWD

⑩配置免密登錄

        這裏需要對主備節點配置免密登錄,但因爲我們在安裝原始集羣的時候已經配置好了,所以這一步也可以跳過了~

#首先要配置node01到node01、node02、node03 的免密碼登陸
#在node01上生產一對鑰匙
ssh-keygen
#將公鑰拷貝到其他節點,包括自己
ssh-coyp-id node01
ssh-coyp-id node02
ssh-coyp-id node03
#注意:兩個namenode之間要配置ssh免密碼登陸 ssh遠程補刀時候需要
#在node02上生產一對鑰匙
ssh-keygen
#將公鑰拷貝到node01
ssh-coyp-id node01

<2> 啓動各項進程

        嚴格按照下面的步驟,否則不能保證一定能成功

① 啓動zookeeper集羣

        分別在node01,node02,node03節點上啓動zookeeper

bin/zkServer.sh start
#查看狀態:一個leader,兩個follower
bin/zkServer.sh status

② 手動啓動journalnode

        分別在在node01、node02、node03上執行

hadoop-daemon.sh start journalnode
#運行jps命令檢驗,node01、node02、node03上多了JournalNode進程

③ 格式化namenode

#在node01上執行命令:
hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置的目錄下生成個hdfs初始化文件,
			
hadoop.tmp.dir配置的目錄下所有文件拷貝到另一臺namenode節點所在的機器
scp -r tmp/ node02:/home/hadoop/app/hadoop-2.6.4/

④格式化ZKFC(在active上執行即可)

hdfs zkfc -formatZK

⑤ 啓動HDFS(在node01上執行)

start-dfs.sh

⑥ 啓動YARN

start-yarn.sh
還需要手動在standby上手動啓動備份的  resourcemanager
yarn-daemon.sh start resourcemanager

<3> 瀏覽器訪問

        配置完上述,用jps查看當前進程

[root@node01 helloworld]# jps
14305 QuorumPeerMain
15186 NodeManager
14354 JournalNode
14726 DataNode
20887 Jps
15096 ResourceManager
15658 NameNode
14991 DFSZKFailoverController

終於可以用瀏覽器進行訪問了~

訪問node01
http://node01:50070

可以發現當前該節點namenode的狀態爲Active
在這裏插入圖片描述

訪問node02

http://node02:50070

可以發現當前該節點namenode的狀態爲(standby)
在這裏插入圖片描述
說明我們的HA集羣部署成功了~

接下來我們向hdfs上傳一個文件
hadoop fs -put /etc/profile /profile

通過UI界面可以看到新的文件上傳上來了
在這裏插入圖片描述

然後再kill掉active狀態節點(也就是node01)的NameNode

kill -9 <pid of NN>

這個時候我們通過瀏覽器訪問node02
http://node02:50070

發現node01"宕機"之後,node02的namenode處於Active的狀態!
在這裏插入圖片描述
在node02節點運行下列命令,可以發現集羣的數據跟node01宕機前是一樣的。

hadoop fs -ls /
-rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile

剛剛我們手動"幹掉"了node01節點上的namenode,現在我們手動啓動它。

hadoop-daemon.sh start namenode

前面驗證了HA,現在我們來認證一下Yarn!

任意一個節點,運行一下hadoop提供的demo中的WordCount程序:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar wordcount /profile /out
在這裏插入圖片描述
看到上述的效果圖,說明我們的HA集羣算是搭建成功了!!!

<4> 拓展

OK大功告成!下面拓展一些測試HA集羣的命令

hdfs dfsadmin -report	 查看hdfs的各節點狀態信息

hdfs haadmin -getServiceState nn1  獲取一個namenode節點的HA狀態

hadoop-daemon.sh start zkfc   單獨啓動一個zkfc進程

        本次分享就到這裏,受益的小夥伴或對大數據技術感興趣的朋友不妨關注一下博主~互相學習,共同進步!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章