1、HA概述
??實現高可用最關鍵的策略是消除單點故障。HA分成各個組件的HA機制:HDFS的HA和YARN的HA。
??Hadoop2.0之前,在HDFS集群中NameNode存在單點故障(SPOF)。
NameNode主要在以下兩個方面影響HDFS集群:
(1)NameNode機器發(fā)生意外,如宕機,集群將無法使用,直到管理員重啟。
(2)NameNode機器需要升級,包括軟件、硬件升級,此時集群也將無法使用。
??HDFS HA功能通過配置Active/Standby兩個NameNodes實現在集群中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器。
2、HDFS-HA
2.1 HDFS-HA工作機制
通過雙或多NameNode消除單點故障。
(1)元數據存儲方式:內存中保存一份元數據,日志文件只有Active狀態(tài)的NameNode節(jié)點才能進行寫操作,多個NameNode都可以對日志文件進行讀操作,共享的日志文件放在一個共享存儲中管理。
(2)需要一個狀態(tài)管理功能模塊:實現一個zkfailover,常駐在每一個NameNode所在的節(jié)點,每一個zkfailover負責監(jiān)控自己所在NameNode節(jié)點,利用zk進行狀態(tài)標識,當需要進行狀態(tài)切換時,由zkfailover來負責切換,切換時需要防止brain split(腦裂)現象的發(fā)生。
(3)必須保證多個NameNode之間能夠ssh無密碼登錄
(4)隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
2.2 HDFS-HA自動故障轉移機制
??自動故障轉移為HDFS部署增加了兩個新組件:ZooKeeper和ZKFailoverController(ZKFC)進程。ZooKeeper是維護少量協調數據,通知客戶端這些數據的改變和監(jiān)視客戶端故障的高可用服務。
HA的自動故障轉移依賴于ZooKeeper的以下功能:
(1)故障檢測:集群中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發(fā)故障轉移。
(2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用于唯一的選擇一個節(jié)點為active狀態(tài)。如果目前現役NameNode崩潰,另一個節(jié)點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode。
??ZKFC是自動故障轉移中的另一個新組件,是ZooKeeper的客戶端,也監(jiān)視和管理NameNode的狀態(tài)。每個運行NameNode的主機也運行了一個ZKFC進程。
ZKFC負責:
(1)健康監(jiān)測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回復健康狀態(tài),ZKFC認為該節(jié)點是健康的。如果該節(jié)點崩潰,凍結或進入不健康狀態(tài),健康監(jiān)測器標識該節(jié)點為非健康的。
(2)ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處于active狀態(tài),ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節(jié)點的支持,如果會話終止,鎖節(jié)點將自動刪除。
(3)基于ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發(fā)現沒有其它的節(jié)點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,并負責運行故障轉移進程以使它的本地NameNode為Active。首先如果必要保護之前的現役NameNode,然后本地NameNode轉換為Active狀態(tài)。
2.3 HDFS-HA集群配置
2.3.1 集群規(guī)劃
2.3.2 配置Zookeeper集群
(1)解壓安裝
//解壓zookeeper安裝包到/opt/module/目錄下
tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/
//在/opt/module/zookeeper-3.5.7/目錄下創(chuàng)建zkData
mkdir -p zkData
//重命名/opt/module/zookeeper-3.5.7/conf目錄下的zoo_sample.cfg為zoo.cfg
mv zoo_sample.cfg zoo.cfg
(2)配置zoo.cfg文件
vim zoo.cfg
#更改以下
dataDir=/opt/module/zookeeper-3.5.7/zkData
#添加以下
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
配置參數解讀:Server.A=B:C:D。
A是一個數字,表示這個是第幾號服務器;
B是這個服務器的IP地址;
C是這個服務器與集群中的Leader服務器交換信息的端口;
D是萬一集群中的Leader服務器掛了,需要一個端口來重新進行選舉,選出一個新的Leader,而這個端口就是用來執(zhí)行選舉時服務器相互通信的端口。
??集群模式下配置一個文件myid,這個文件在zkData目錄下,這個文件里面有一個數據就是A的值,Zookeeper啟動時讀取此文件,拿到里面的數據與zoo.cfg里面的配置信息比較從而判斷到底是哪個server。
//在/opt/module/zookeeper-3.5.7/zkData下創(chuàng)建一個文件myid,并編輯
vim myid
#在hadoop102添加以下:
2
(3)集群操作
//分發(fā)zookeeper到其他機器上:
xsync zookeeper-3.5.7
//分別在hadoop103、hadoop104的myid文件中修改2為3、4
//在/home/用戶名/bin中新建一個文件zk.sh并編輯
vim zk.sh
#添加以下內容:
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 啟動 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
done
};;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 停止 ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
};;
"status"){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 狀態(tài) ------------
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
};;
esac
//賦予腳本權限:
chmod 777 zk.sh
//啟動zookeeper
zk.sh start
//查看狀態(tài)
zk.sh status
//關閉zookeeper
zk.sh stop
2.3.3 配置HDFS-HA集群
在/opt/下新建文件夾ha,將/opt/module/下的hadoop-3.3.1拷貝到/opt/ha/下
cd /opt
mkdir ha
cp -r hadoop-3.3.1/ /opt/ha/
配置core-site.xml,刪掉之前的配置,添加以下
<!-- 把兩個NameNode)的地址組裝成一個集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-3.3.1/data</value>
</property>
<!-- 指定zkfc要連接的zkServer地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
配置hdfs-site.xml,刪掉之前的配置,添加以下
<!-- NameNode數據存儲目錄 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/name</value>
</property>
<!-- DataNode數據存儲目錄 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/data</value>
</property>
<!-- JournalNode數據存儲目錄 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>${hadoop.tmp.dir}/jn</value>
</property>
<!-- 完全分布式集群名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode節(jié)點都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop102:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop103:8020</value>
</property>
<!-- nn3的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop104:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop102:9870</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop103:9870</value>
</property>
<!-- nn3的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop104:9870</value>
</property>
<!-- 指定NameNode元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
</property>
<!-- 配置隔離機制,即同一時刻只能有一臺服務器對外響應 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh無秘鑰登錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/liaoyanxia/.ssh/id_rsa</value>
</property>
<!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 啟動nn故障自動轉移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
分配兩個文件到其他節(jié)點
xsync core-site.xml hdfs-site.xml
在每個節(jié)點的/etc/profilr.d下的my_env.sh文件中修改HADOOP_HOME:
/opt/module/hadoop-3.3.1改為/opt/ha/hadoop-3.3.1
然后source一下讓環(huán)境變量生效:
source my_env.sh
啟動HDFS-HA集群:
//在各個JournalNode節(jié)點上,輸入以下命令啟動journalnode服務
hdfs --daemon start journalnode
//在nn1上進行格式化并啟動
hdfs namenode -format
hdfs --daemon start namenode
//在nn2、nn3上同步nn1的元數據信息
hdfs namenode -boostrapStandby
//啟動nn2和nn3
hdfs --daemon start namenode
//啟動datanode
hdfs --daemon start datanode
//關閉所有hdfs服務
sbin/stop-dfs.sh
//啟動zookeeper集群
zk.sh start
//初始化HA在zookeeper中的狀態(tài)
bin/hdfs zkfc -formatZK
//啟動hdfs服務
start-dfs.sh
3、Yarn-HA
3.1 Yarn-HA工作機制
??Yarn核心進程有兩個,分別是ResourceManager和NodeManager,NodeManager是每個節(jié)點有一個,如果某個節(jié)點掛了則資源會少一點,但ResourceManager掛了則會發(fā)生單點故障,整個集群就用不了了,及不能提交任何任務,所以需要配置Yarn-HA。
??Yarn-HA也以來于zookeeper集群,啟動多個ResourceManager,誰先啟動成功誰就到zookeeper注冊為臨時節(jié)點。后啟動的也會去zookeeper上注冊節(jié)點,創(chuàng)建時發(fā)現節(jié)點已經存在即指定轉為standby,所有的standby節(jié)點以輪詢的方式詢問節(jié)點信息是否存在,一旦節(jié)點信息不存在則立馬主機注冊為新的節(jié)點為Active,即當一個Active的ResourceManager進程掛點之后,zookeeper中的臨時節(jié)點會自動刪除。
3.2 Yarn-HA集群配置
3.2.1 集群規(guī)劃
核心問題:
(1)如果當前Active rm掛了,其他Standby rm利用zk的臨時節(jié)點上位;
(2)當前rm上有很多計算程序在等待運行,em會將當前所有計算機程序的狀態(tài)存儲在zk,其他em上位后會讀取,任何接著跑。
3.2.2 配置Yarn-HA集群
配置yarn-site.xml,刪除原有的內容,添加以下:文章來源:http://www.zghlxwxcb.cn/news/detail-517715.html
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--啟用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--聲明兩臺resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!-- 指定resourcemanager的邏輯列表 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
</property>
<!--rm1的主機名-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop103</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>hadoop104</value>
</property>
<!--rm1的web端地址-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop102:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop103:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>hadoop104:8088</value>
</property>
<!--rm1的內部通信地址-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop102:8032</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop103:8032</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>hadoop104:8032</value>
</property>
<!--指定AM向rm1申請資源的地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop102:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop103:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>hadoop104:8030</value>
</property>
<!--指定供NM連接的地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop102:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop103:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>hadoop104:8031</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
<!--啟用自動恢復-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的狀態(tài)信息存儲在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--環(huán)境變量的繼承-->
<property>
<name>yarn.nodemanager.env-whilelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
//分配到其他節(jié)點
xsync yarn-site.xml
//關閉hdfs
sbin/stop-all.sh
//開啟hdfs
sbin/start-dfs.sh
//將nn1切換為Active狀態(tài)
hdfs haadmin -transitionToActive nn1
//啟動yarn
sbin/start-yarn.sh
//查看服務狀態(tài)
bin/yarn 1rmadmin -getServiceState rm1
文章來源地址http://www.zghlxwxcb.cn/news/detail-517715.html
到了這里,關于【大數據之Hadoop】三十七、Hadoop HA高可用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!