本文原始碼:GitHub·點這裡 || GitEE·點這裡
一、HDFS高可用
1、基礎描述
在單點或者少數節點故障的情況下,叢集還可以正常的提供服務,HDFS高可用機制可以通過配置Active/Standby兩個NameNodes節點實現在叢集中對NameNode的熱備來消除單節點故障問題,如果單個節點出現故障,可通過該方式將NameNode快速切換到另外一個節點上。
2、機制詳解
- 基於兩個NameNode做高可用,依賴共享Edits檔案和Zookeeper叢集;
- 每個NameNode節點配置一個ZKfailover程式,負責監控所在NameNode節點狀態;
- NameNode與ZooKeeper叢集維護一個持久會話;
- 如果Active節點故障停機,ZooKeeper通知Standby狀態的NameNode節點;
- 在ZKfailover程式檢測並確認故障節點無法工作後;
- ZKfailover通知Standby狀態的NameNode節點切換為Active狀態繼續服務;
ZooKeeper在大資料體系中非常重要,協調不同元件的工作,維護並傳遞資料,例如上述高可用下自動故障轉移就依賴於ZooKeeper元件。
二、HDFS高可用
1、整體配置
服務列表 | HDFS檔案 | YARN排程 | 單服務 | 共享檔案 | Zk叢集 |
---|---|---|---|---|---|
hop01 | DataNode | NodeManager | NameNode | JournalNode | ZK-hop01 |
hop02 | DataNode | NodeManager | ResourceManager | JournalNode | ZK-hop02 |
hop03 | DataNode | NodeManager | SecondaryNameNode | JournalNode | ZK-hop03 |
2、配置JournalNode
建立目錄
[root@hop01 opt]# mkdir hopHA
拷貝Hadoop目錄
cp -r /opt/hadoop2.7/ /opt/hopHA/
配置core-site.xml
<configuration>
<!-- NameNode叢集模式 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop執行時產生檔案的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hopHA/hadoop2.7/data/tmp</value>
</property>
</configuration>
配置hdfs-site.xml,新增內容如下
<!-- 分散式叢集名稱 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 叢集中NameNode節點 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NN1 RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hop01:9000</value>
</property>
<!-- NN2 RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hop02:9000</value>
</property>
<!-- NN1 Http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hop01:50070</value>
</property>
<!-- NN2 Http通訊地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hop02:50070</value>
</property>
<!-- 指定NameNode後設資料在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hop01:8485;hop02:8485;hop03: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>/root/.ssh/id_rsa</value>
</property>
<!-- 宣告journalnode伺服器儲存目錄-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hopHA/hadoop2.7/data/jn</value>
</property>
<!-- 關閉許可權檢查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 訪問代理類失敗自動切換實現方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
依次啟動journalnode服務
[root@hop01 hadoop2.7]# pwd
/opt/hopHA/hadoop2.7
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start journalnode
刪除hopHA下資料
[root@hop01 hadoop2.7]# rm -rf data/ logs/
NN1格式化並啟動NameNode
[root@hop01 hadoop2.7]# pwd
/opt/hopHA/hadoop2.7
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
NN2同步NN1資料
[root@hop02 hadoop2.7]# bin/hdfs namenode -bootstrapStandby
NN2啟動NameNode
[root@hop02 hadoop2.7]# sbin/hadoop-daemon.sh start namenode
檢視當前狀態
在NN1上啟動全部DataNode
[root@hop01 hadoop2.7]# sbin/hadoop-daemons.sh start datanode
NN1切換為Active狀態
[root@hop01 hadoop2.7]# bin/hdfs haadmin -transitionToActive nn1
[root@hop01 hadoop2.7]# bin/hdfs haadmin -getServiceState nn1
active
3、故障轉移配置
配置hdfs-site.xml,新增內容如下,同步叢集
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
配置core-site.xml,新增內容如下,同步叢集
<property>
<name>ha.zookeeper.quorum</name>
<value>hop01:2181,hop02:2181,hop03:2181</value>
</property>
關閉全部HDFS服務
[root@hop01 hadoop2.7]# sbin/stop-dfs.sh
啟動Zookeeper叢集
/opt/zookeeper3.4/bin/zkServer.sh start
hop01初始化HA在Zookeeper中狀態
[root@hop01 hadoop2.7]# bin/hdfs zkfc -formatZK
hop01啟動HDFS服務
[root@hop01 hadoop2.7]# sbin/start-dfs.sh
NameNode節點啟動ZKFailover
這裡hop01和hop02先啟動的服務狀態就是Active,這裡先啟動hop02。
[hadoop2.7]# sbin/hadoop-daemon.sh start zkfc
結束hop02的NameNode程式
kill -9 14422
等待一下檢視hop01狀態
[root@hop01 hadoop2.7]# bin/hdfs haadmin -getServiceState nn1
active
三、YARN高可用
1、基礎描述
基本流程和思路與HDFS機制類似,依賴Zookeeper叢集,當Active節點故障時,Standby節點會切換為Active狀態持續服務。
2、配置詳解
環境同樣基於hop01和hop02來演示。
配置yarn-site.xml,同步叢集下服務
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--啟用HA機制-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--宣告Resourcemanager服務-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn01</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hop02</value>
</property>
<!--Zookeeper叢集的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hop01:2181,hop02:2181,hop03:2181</value>
</property>
<!--啟用自動恢復機制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定狀態儲存Zookeeper叢集-->
<property>
<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
重啟journalnode節點
sbin/hadoop-daemon.sh start journalnode
在NN1服務格式化並啟動
[root@hop01 hadoop2.7]# bin/hdfs namenode -format
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start namenode
NN2上同步NN1後設資料
[root@hop02 hadoop2.7]# bin/hdfs namenode -bootstrapStandby
啟動叢集下DataNode
[root@hop01 hadoop2.7]# sbin/hadoop-daemons.sh start datanode
NN1設定為Active狀態
先啟動hop01即可,然後啟動hop02。
[root@hop01 hadoop2.7]# sbin/hadoop-daemon.sh start zkfc
hop01啟動yarn
[root@hop01 hadoop2.7]# sbin/start-yarn.sh
hop02啟動ResourceManager
[root@hop02 hadoop2.7]# sbin/yarn-daemon.sh start resourcemanager
檢視狀態
[root@hop01 hadoop2.7]# bin/yarn rmadmin -getServiceState rm1
四、原始碼地址
GitHub·地址
https://github.com/cicadasmile/big-data-parent
GitEE·地址
https://gitee.com/cicadasmile/big-data-parent
推薦閱讀:程式設計體系整理
序號 | 專案名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
---|---|---|---|---|
01 | Java描述設計模式,演算法,資料結構 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
02 | Java基礎、併發、物件導向、Web開發 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆ |
03 | SpringCloud微服務基礎元件案例詳解 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆ |
04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆ |
06 | SpringBoot框架整合開發常用中介軟體 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
07 | 資料管理、分散式、架構設計基礎案例 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
08 | 大資料系列、儲存、元件、計算等框架 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |