Hadoop.2.x_HA部署
一、概念與HA思路
1. 首先Hadoop架構為主從架構(NameNode/DataNode)
2. NameNode管理著文件系統和與維護客戶端訪問DataNode
3. Hadoop 2.0 之前的版本,集群中NameNode存在單點故障(SPOF)
4. 單個NameNode機器宕機將導致集群無法使用,直到管理員重啟
5. 單個NameNode機器升級時也會導致集群無法使用
6. HDFS HA用于解決單節點故障(使用Active/Standby兩個NameNode交替)方案一:借助質量好的機器進行讀寫操作保證日志數據一致方案二:使用類似與Zookeeper(2n+1特效) 備份日志數據(保證日志數據的安全性),兩個NameNode共同管理一份元數據方案三:使用Zookeeper
7. 使用方案二,日志交于JournalNode進程管理,日志節點為奇數個 AvtiveNameNode啟動時接收DataNode心跳匯報,StandbyNameNode也需要使用JournalNode至少需要3個節點
8. 既然ActiveNameNode有可能會宕掉,那么客戶端如何去找到StandbyNameNode這其中有一個Proxy(代理)用于告知客戶端
9. ActiveNameNode與StandbyNameNode通過隔離機制互不干預通過代理找到ActiveNameNode,通過Zookeeper選主操作轉移故障
10.既然ResourceManager也是一個分布式的系統,同樣也可能出現單節點故障 二、部署與搭建測試
1. 目錄規劃(hdfs存儲位置,JournalNode存儲位置,等)
2. 上傳并解壓Hadoop
3. 配置自定義(這僅僅配置HDFS NameNode HA)
*.env
# 配置JDK路徑
hdfs-site.xml
# 服務配置
dfs.nameservices-->ns1
dfs.ha.namenodes.ns1-->nn1,nn2
dfs.namenode.rpc-address.ns1.nn1-->hadoop09-linux-01.ibeifeng.com:8020
dfs.namenode.rpc-address.ns1.nn2-->hadoop09-linux-02.ibeifeng.com:8020
dfs.namenode.http-address.ns1.nn1-->hadoop09-linux-01.ibeifeng.com:50070
dfs.namenode.http-address.ns1.nn2-->hadoop09-linux-02.ibeifeng.com:50070
# JournalNode存儲配置(注意新建自定義目錄)
dfs.namenode.shared.edits.dir-->qjournal://hadoop09-linux-01.ibeifeng.com:8485;hadoop09-linux-02.ibeifeng.com:8485;hadoop09-linux-03.ibeifeng.com:8485/ns1
dfs.journalnode.edits.dir-->/home/liuwl/opt/app/hadoop-2.5.0/data/dfs/jn
# 隔離機制
dfs.ha.fencing.methods-->sshfence
# 注意測試那幾個節點是否能夠連通 ssh hadoop09-linux-01.ibeifeng.com
dfs.ha.fencing.ssh.private-key-files-->/home/liuwl/.ssh/id_rsa
# 訪問文件系統權限
dfs.permissions.enabled-->false
core-site.xml
fs.defaultFS-->hdfs://ns1
hadoop.tmp.dir-->/home/liuwl/opt/app/hadoop-2.5.0/data/tmp
hadoop.http.staticuser.user-->liuwl
slaves
hadoop09-linux-01.ibeifeng.com
hadoop09-linux-02.ibeifeng.com
hadoop09-linux-03.ibeifeng.com 4. 分發配置文件目錄(注意剛才新建的data/dfs/jn,其他節點也要保持一致)
scp -r hadoop/ liuwl@hadoop09-linux-02.ibeifeng.com:/home/liuwl/opt/app/hadoop-2.5.0/etc
scp -r hadoop/ liuwl@hadoop09-linux-03.ibeifeng.com:/home/liuwl/opt/app/hadoop-2.5.0/etc 5. 分別啟動Zookeeper(轉13步)
bin/zkServer start 6. 分別啟動JournalNode服務
sbin/hadoop-daemon.sh start journalnode 7. 在nn1所在節點進行格式化文件系統,并啟動
bin/hdfs dfs namenode -format
sbin/hadoop-daemon.sh start namenode 8. 在nn2所在節點進行同步元數據信息,并啟動
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode 9. 將nn1切換為Active(手動切換)
bin/hdfs haadmin -transitionToActive nn1 10. 在nn1所在節點啟動所有datanode
sbin/hadoop-daemon.sh start datanode 11. kill掉nn1上的namenode,并手動設置nn2為Active
nn1: kill -9 xxx/sbin/hadoop-daemon.sh stop namenode
nn2: bin/hdfs haadmin -transitionToActive nn2 --forceactive 12. 網頁上查看namenode狀態或使用命令
bin/hdfs haadmin -getServiceState nn2 13. 使用Zookeeper自動轉移故障
hdfs-site.xml
dfs.ha.automatic-failover.enabled-->false
core-site.xml
ha.zookeeper.quorum-->hadoop09-linux-01.ibeifeng.com:2181,hadoop09-linux-02.ibeifeng.com:2181,hadoop09-linux-03.ibeifeng.com:2181 14. 按照官方文檔,需要初始化Zookeeper,注意每個節點上的Zookeeper服務為開啟狀態(轉13步)
bin/hdfs zkfc -formatZK
# 單獨啟動zookeeper的故障轉移監控器(DFSZKFailoverController),每個namenode都有一個
sbin/hadoop-deamon.sh start zkfc 15. 測試Zookeeper存儲
../zookeeper-3.4.6/bin/zkCli.sh 16. 啟動yarn,上傳一個wc.input,節點三運行MR程序,運行時,kill掉ActiveNameNode
sbin/start-yarn.sh
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount tmp/mapreduce/wordcount/input tmp/mapreduce/wordcount/output
kill -9 xxx
# 查看namenode狀態
# 分析結論:DFSZKFailoverController監控NameNode狀態,NameNode宕掉,監聽器馬上告訴Zookeeper,
# Zookeeper告知Standby的DFSZKFailoverController,進入切換Active流程
# DFSZKFailoverController進行選主操作,
# 確保新的Active節點,然后通過RPC將StandbyNameNode切換為ActiveNameNode,完成故障轉移
# HA 解決了元數據共享,Active切換,隔離,并保證了元數據的安全性 17. ResourceManager HA (支持一個ActiveResourceManager對應多個StandbyResourceManager)
yarn-site.xml
# 運行MapRedue程序必配
yarn.nodemanager.aux-services-->mapreduce_shuffle
# 配置日志聚集功能
# 日志聚集是YARN提供的日志中央化管理功能,
# 它能將運行完成的Container/任務日志上傳到HDFS上,
# 從而減輕NodeManager負載,且提供一個中央化存儲和分析機制,
# 默認情況下,Container/任務日志是存在各個NodeManager上的
yarn.log-aggregation-enable-->true
# 在HDFS上聚集的日志最多保存多長時間
yarn.log-aggregation.retain-seconds-->604800
# 使用ResourceManager HA
yarn.resourcemanager.ha.enabled-->true
# 添加一個ResourceManager集群ID
yarn.resourcemanager.cluster-id-->yarn-cluster
# 指定兩個ResouceManager
yarn.resourcemanager.ha.rm-ids-->rm109,rm110
# 指定ResourceManager所在機器
yarn.resourcemanager.hostname.rm109-->hadoop09-linux-02.ibeifeng.com
yarn.resourcemanager.hostname.rm110-->hadoop09-linux-03.ibeifeng.com
# 配置Zookeeper機器地址
yarn.resourcemanager.zk-address-->hadoop09-linux-01.ibeifeng.com:2181,hadoop09-linux-02.ibeifeng.com:2181,hadoop09-linux-03.ibeifeng.com:2181
# ResourceManager恢復
yarn.resourcemanager.recovery.enabled-->true
# 修改ResourceManager默認存儲日志的方式
yarn.resourcemanager.store.class-->org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
# 分發到各個節點 18. 分別啟動(之前先啟動Zookeeper)
節點1:sbin/start-dfs.sh
節點1:sbin/start-yarn.sh
節點1:sbin/start-yarn.sh 19. 打開web查看各類信息,當使用節點3打開resourcemanager,發現它會自動重定向到節點2
20. 節點1測試一個mr程序,斷掉節點2的ResourceManager,查看web
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount tmp/mapreduce/wordcount/input tmp/mapreduce/wordcount/output2
kill -9 xx
# 當kill節點2的ResourceManager的一瞬間,節點報錯(連接超時)
# java.io.IOException: Failed on local exception: java.io.EOFException; Host Details : local host is: "hadoop09-linux-01.ibeifeng.com/10.0.0.108"; destination host is: "hadoop09-linux-02.ibeifeng.com":8032;
# 打開節點3的web頁面發現該程序仍在運行,即由節點3的ResoreceManager接管執行mr程序
# 過了幾十秒后mr程序成功運行完畢
# 內部已設置一個監控器,所以可以自動切換 21. 進入Zookeeper客戶端查看
../zookeeper-3.4.6/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[rmstore, yarn-leader-election, hadoop-ha, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /rmstore
[ZKRMStateRoot]
[zk: localhost:2181(CONNECTED) 2] ls /rmstore/ZKRMStateRoot
[RMAppRoot, RMVersionNode, RMDTSecretManagerRoot]
轉載于:https://www.cnblogs.com/eRrsr/p/5988404.html
總結
以上是生活随笔為你收集整理的Hadoop.2.x_HA部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管堵塞的治疗有哪些
- 下一篇: java 使用对象