本文源碼:GitHub·點這裏 || GitEE·點這裏java
在單點或者少數節點故障的狀況下,集羣還能夠正常的提供服務,HDFS高可用機制能夠經過配置Active/Standby兩個NameNodes節點實如今集羣中對NameNode的熱備來消除單節點故障問題,若是單個節點出現故障,可經過該方式將NameNode快速切換到另一個節點上。node
ZooKeeper在大數據體系中很是重要,協調不一樣組件的工做,維護並傳遞數據,例如上述高可用下自動故障轉移就依賴於ZooKeeper組件。git
服務列表 | HDFS文件 | YARN調度 | 單服務 | 共享文件 | Zk集羣 |
---|---|---|---|---|---|
hop01 | DataNode | NodeManager | NameNode | JournalNode | ZK-hop01 |
hop02 | DataNode | NodeManager | ResourceManager | JournalNode | ZK-hop02 |
hop03 | DataNode | NodeManager | SecondaryNameNode | JournalNode | ZK-hop03 |
建立目錄github
[root@hop01 opt]# mkdir hopHA
拷貝Hadoop目錄算法
cp -r /opt/hadoop2.7/ /opt/hopHA/
配置core-site.xmlspring
<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,添加內容以下apache
<!-- 分佈式集羣名稱 --> <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下數據bootstrap
[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
配置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
基本流程和思路與HDFS機制相似,依賴Zookeeper集羣,當Active節點故障時,Standby節點會切換爲Active狀態持續服務。
環境一樣基於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·點這裏 | ☆☆☆☆☆ |