1 概述
- HA(high available),即高可用(24h不中斷服務)
- 實現高可用最關鍵的策略是消除單點故障。HA嚴格來說是應該分成各個組件的HA機制
- hadoop2.0之前,在HDFS集群中NamNode存在單點故障(SPOF)
- NameNode主要存在以下兩個方敏影響HDFS集群。
- NameNode機器發(fā)生意外,如宕機,集群無法使用,直到管理員重啟。
- NameNode機器需要升級,包括軟件,硬件升級,此時集群也將無法使用。
HDFS HA功能通過配置Active/Standby兩個nameNode實現在集群中對NameNode的熱備份來解決上述問題。如果機器出現故障,這是可通過此種方式將NameNode很快切換到另一臺機器。
2 HDFS-HA工作機制
通過雙NameNode消除單點故障
2.1 HDFS-HA工作要點
1、元數據管理方式需要改變
- 內存中各自保存一份元數據;
- Edits日志只有Active狀態(tài)的NameNode節(jié)點可以做寫操作。
- 兩個NameNode都可以讀取Edits
- 共享的Edit放在一個共享存儲中管理(qjournal和NFS兩個主流實現)
2、需要一個狀態(tài)管理功能模塊
- 實現了一個zkfailover,常駐在每一個namenode所在的節(jié)點,每一個zkfailover負責監(jiān)控自己所在NameNode節(jié)點,利用zk進行狀態(tài)表示,當需要進行裝填切換時,由zkfaiover來負責切換,切換時需要防止brain split想想發(fā)生。
3、必須保證兩個 NameNode 之間能歐ssh無密碼登錄
4、隔離(Fence),即同一時刻僅僅有一個 NameNode對外提供服務。
2.2 HDFS 自動故障轉移工作
通過命令 hdfs haadmin -failover
進行手動故障轉移的模式下,即使現役 NameNode已經失效,系統(tǒng)也不會自動從現役 NameNode轉移到待機NameNode,因而下面介紹自動故障轉移。
自動故障顓臾為HDFS部署增加了兩個新組件:
- ZooKeeper進程
- ZKFailoverController(ZKFC)進程
其中ZK負責維護少量協(xié)調數據,通知客戶端這些數據的改變和客戶端故障的高可用服務。HA的自動故障轉移依賴于ZK以下功能:
1、故障檢測
集群中每個 NameNode 在Zookeeper 中維護了一個持久回話,如果機器崩潰,ZK中的會話將終止,ZK通知另一個NameNode需要除法故障轉移。
2、現役 NameNode選擇
ZooKeeper提供了一個簡單的機制用于唯一的選擇一個節(jié)點為 active 狀態(tài)。如果目前現役 NameNode崩潰,另一個節(jié)點可能從 ZK獲得特殊的排外鎖,以表名它應該稱為現役 NameNode。
ZKFC是自動故障轉移中的另一個新組建,是ZK的客戶端,也監(jiān)視和管理 NameNode的裝填
3、健康檢測
ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時回復健康狀態(tài),ZKFC認為該節(jié)點是健康的。如果該節(jié)點崩潰、凍結或進入不健康狀態(tài),健康檢測器標識該節(jié)點為非健康的。
4、ZooKeeper會話管理
當本地NameNode是將康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處于active狀態(tài),ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對對該節(jié)點的支持,如果會話終止,鎖節(jié)點將自動刪除。
5、基于 ZooKeeper的選擇
如果本地 NameNode是健康的,且ZKFC發(fā)現沒有其他節(jié)點持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,并負責運行故障轉移進程以使它的本地 NameNode為Active。故障轉移進程與前面描述的手動付賬轉移相似,首先如果必要保護之前的嫌疑NameNode,然后本地NameNode轉換為Active狀態(tài)。
3 HDFS-HA集群配置
3.1 環(huán)境準備
-
映射主機ip、 安裝jdk、ssh免密、防火墻(按具體情況配置,安全第一)
-
搭建 ZooKeeper集群
3.2 搭建ZooKeeper集群
詳細請閱讀ZK秘籍8.2節(jié):古傳送陣
啟動
$ZK_HOME/bin/zkServer.sh start $ZK_HOME/conf/zoo.cfg
3.3 配置 HDFS-HA集群
3.3.1 配置環(huán)境
# hadoop-HA
export $HADOOP_HA_HOME=/usr/local/hadoop-HA/hadoop-2.8.4
export PATH=$PATH:$HADOOP_HA_HOME/bin:$HADOOP_HA_HOME/sbin
# hadoop
#export HADOOP_HOME=/usr/local/hadoop-2.8.4
#export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
vim $HADOOP_HA_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_151
export HADOOP_CONF_DIR=/usr/local/hadoop-HA/hadoop-2.8.4/etc/hadoop
scp -r $HADOOP_HA_HOME/etc/hadoop/hadoop-env.sh root@slave1:$HADOOP_HA_HOME/etc/hadoop/
scp -r $HADOOP_HA_HOME/etc/hadoop/hadoop-env.sh root@slave2:$HADOOP_HA_HOME/etc/hadoop/
3.3.2 配置core-site.xml
mkdir /usr/local/hadoop-HA/data
vim $HADOOP_HA_HOME/etc/hadoop/core-site.xml
<configuration>
<!-- 把兩個 NameNode 的地址組裝成一個集群 mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-HA/data</value>
</property>
</configuration>
3.3.3 配置 hdfs-site.xml
NameNode:master、slave1
DataNode:master、slave1、slave2
mkdir /usr/local/hadoop-HA/data/jn
vim $HADOOP_HA_HOME/etc/hadoop/hdfs-site.xml
<configuration>
<!-- 完全分布式集群名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中 NameNode節(jié)點都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的 RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
<!-- nn2的 RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
<!-- nn1的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
<!-- 指定 NameNode元數據在 JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2: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>~/.ssh/id_rsa</value>
</property>
<!-- 聲明 journalnode 服務器存儲目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop-HA/data/jn</value>
</property>
<!-- 關閉權限檢查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</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>
</configuration>
配置發(fā)送到其他機器
scp -r /usr/local/hadoop-HA/ root@slave1:/usr/local/
scp -r /usr/local/hadoop-HA/ root@slave2:/usr/local/
3.3.4 啟動 HDFS-HA集群
在各個JournalNode節(jié)點商,輸入以下命令啟動journalnode服務
1、在各個 JournalNode 節(jié)點上,輸入以下命令啟動 journalnode 服務
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start journalnode
2、在[nn1]上,對其進行格式化,并啟動
# 格式化
$HADOOP_HA_HOME/bin/hdfs namenode -format
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start namenode
3、在[nn2]上,同步nn1的元數據信息
$HADOOP_HA_HOME/bin/hdfs namenode -bootstrapStandby
4、啟動[nn2]
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start namenode
5、查看web頁面(此時2個NameNode均為standby狀態(tài))
http://192.168.56.20:50070
http://192.168.56.21:50070
6、在 [nn1] 上,啟動所有 datanode
# 配置節(jié)點域名
vim $HADOOP_HA_HOME/etc/hadoop/slaves
master
slave1
slave2
$HADOOP_HA_HOME/sbin/hadoop-daemons.sh start datanode
7、將 [nn1] 切換為 Active
$HADOOP_HA_HOME/bin/hdfs haadmin -transitionToActive nn1
8、查看是否Active
$HADOOP_HA_HOME/bin/hdfs haadmin -getServiceState nn1
3.3.5 配置 HDFS-HA自動故障轉移
1 具體配置
在hdfs-site.xml 增加
vim $HADOOP_HA_HOME/etc/hadoop/hdfs-site.xml
<!-- 配置 HDFS-HA自動故障轉移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
在core-site.xml 增加
vim $HADOOP_HA_HOME/etc/hadoop/core-site.xml
<!-- 配置 HDFS-HA自動故障轉移 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
2 同步配置
scp -r $HADOOP_HA_HOME/etc/hadoop/hdfs-site.xml root@slave1:$HADOOP_HA_HOME/etc/hadoop/
scp -r $HADOOP_HA_HOME/etc/hadoop/core-site.xml root@slave1:$HADOOP_HA_HOME/etc/hadoop/
3 啟動
1、關閉所有 HDFS服務
$HADOOP_HA_HOME/sbin/stop-dfs.sh
2、啟動 ZooKeeper集群
$ZK_HOME/bin/zkServer.sh start $ZK_HOME/conf/zoo.cfg
3、初始化 HA 在 ZooKeeper 中狀態(tài)(NameNode節(jié)點)
$HADOOP_HA_HOME/bin/hdfs zkfc -formatZK
4、啟動 HDFS 服務
$HADOOP_HA_HOME/sbin/start-dfs.sh
5、在各個 NameNode節(jié)點上啟動 DFSZK Failover Controller,先在哪臺機器啟動,哪個機器的 NameNode就是Active NameNode
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start zkfc
4 驗證
1、將 Active NameNode 進程 kill
kill -9 (namenode進程id)
2、恢復NameNode
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start namenode
5 其他處理
1、Standby所在的namenode不會自動切換為active狀態(tài)。
檢查服務器時間是否同步,同步需要在root用戶下。
hdfs namenode -initializeSharedEdits
3.4 YARN-HA配置
工作機制
3.4.1 yarn-site.xml
vim $HADOOP_HA_HOME/etc/hadoop/yarn-site.xml
<configuration>
<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>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!--指定 zookeeper 集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2: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>
</configuration>
同步更新其他節(jié)點的配置信息
scp -r $HADOOP_HA_HOME/etc/hadoop/yarn-site.xml root@slave1:$HADOOP_HA_HOME/etc/hadoop/
scp -r $HADOOP_HA_HOME/etc/hadoop/yarn-site.xml root@slave2:$HADOOP_HA_HOME/etc/hadoop/
3.4.2 啟動hdfs
1、關閉所有 HDFS服務
$HADOOP_HA_HOME/sbin/stop-dfs.sh
1、在各個 JournalNode節(jié)點上,輸入以下命令啟動 journalnode服務:
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start journalnode
2、在 [nn1] 上,對其進行格式化,并啟動
$HADOOP_HA_HOME/bin/hdfs namenode -format
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start namenode
3、在 [nn2] 上,同步 nn1 的元數據信息
$HADOOP_HA_HOME/bin/hdfs namenode -bootstrapStandby
4、啟動 [nn2]
$HADOOP_HA_HOME/sbin/hadoop-daemon.sh start namenode
5、啟動所有 DataNode
$HADOOP_HA_HOME/sbin/hadoop-daemons.sh start datanode
6、將 [nn1]切換為 Active
$HADOOP_HA_HOME/bin/hdfs haadmin -transitionToActive nn1
3.4.3 啟動 YARN
進程:ResourceManager、NodeManager、NodeManager
$HADOOP_HA_HOME/sbin/start-yarn.sh
slave2執(zhí)行(非NameNode節(jié)點)
$HADOOP_HA_HOME/sbin/yarn-daemon.sh start resourcemanager
3、查看服務狀態(tài)
$HADOOP_HA_HOME/bin/yarn rmadmin -getServiceState rm1
3.5 查看集群
http://192.168.56.20:8088/cluster
報錯處理
重新格式化
1、查看hdfs-site.xml:
<!-- 指定 hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-HA/data</value>
</property>
將 dfs.name.dir所指定的目錄刪除、dfs.data.dir所指定的目錄刪除
rm -rf /usr/local/hadoop-HA/data/dfs/name/*
rm -rf /usr/local/hadoop-HA/data/dfs/data/*
2、查看core-site.xml:
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-HA/data</value>
<description>namenode上本地的hadoop臨時文件夾</description>
</property>
將Hadoop.tmp.dir所指定的目錄刪除。文章來源:http://www.zghlxwxcb.cn/news/detail-428790.html
rm -rf /usr/local/hadoop-HA/data/jn/*
致謝:
感謝尚硅谷教程文章來源地址http://www.zghlxwxcb.cn/news/detail-428790.html
到了這里,關于hadoop HA高可用集群實戰(zhàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!