相信在看了上一篇博客《帶你快速認識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進程
本次分享就到這裏,受益的小夥伴或對大數據技術感興趣的朋友不妨關注一下博主~互相學習,共同進步!