? 在hadoop1.0的時候,hdfs集群中namenode存在單點故障的問題,當namenode不可用的時候,就會導(dǎo)致整個hdfs集群服務(wù)不可用。另外如果需要臨時對namenode進行設(shè)計或者其他操作時,停掉namenode之后,hdfs集群也無法使用了。
? 通過HA的方式,可以一定程度上解決單點故障問題。
創(chuàng)新互聯(lián)主營丹陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),丹陽h5微信小程序開發(fā)搭建,丹陽網(wǎng)站營銷推廣歡迎丹陽等地區(qū)企業(yè)咨詢
1)元數(shù)據(jù)管理方式需要改變:
內(nèi)存中各自保存一份元數(shù)據(jù);
Edits日志只有Active狀態(tài)的namenode節(jié)點可以做寫操作;
兩個namenode都可以讀取edits;
共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現(xiàn));
2)需要一個狀態(tài)管理功能模塊
hadoop實現(xiàn)了一個zkfailover,常駐在每一個namenode所在的節(jié)點,每一個zkfailover負責(zé)監(jiān)控自己所在namenode節(jié)點,利用zk進行狀態(tài)標識,當需要進行狀態(tài)切換時,由zkfailover來負責(zé)切換,切換時需要防止brain split現(xiàn)象的發(fā)生。
3)必須保證兩個NameNode之間能夠ssh無密碼登錄。用于后面的隔離。通過ssh方式到另外的namenode節(jié)點上,將namenode進程徹底殺死。防止腦裂。
4)隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務(wù)
namenode HA自動故障轉(zhuǎn)移除了要兩個namenode之外,還需要增加兩個組件:zookeeper集群服務(wù),ZKFailoverController(ZKFC)。
它是zookeeper的一個客戶端,同時負責(zé)監(jiān)控namenode的狀態(tài)。每個namenode上都運行一個ZKFC進程。
1)健康監(jiān)測:
ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回復(fù)健康狀態(tài),ZKFC認為該節(jié)點是健康的。如果該節(jié)點崩潰,凍結(jié)或進入不健康狀態(tài),健康監(jiān)測器標識該節(jié)點為非健康的。
2)ZooKeeper會話管理:
當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處于active狀態(tài),ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節(jié)點(也就是臨時節(jié)點)的支持,如果會話終止,鎖節(jié)點將自動刪除。
ZKFC會在zookeeper上創(chuàng)建一個 /hadoop-ha/namenodeHA集群名稱/ 這樣一個節(jié)點,
該節(jié)點上有兩個子節(jié)點:
ActiveBreadCrumb:
持久節(jié)點,節(jié)點的值中記錄了 HA集群名稱 active節(jié)點別名 active節(jié)點地址
主要用于其他想訪問namenode服務(wù)的client用于獲取active狀態(tài)的namenode地址,所以必須得是持久節(jié)點。
ActiveStandbyElectorLock:
臨時節(jié)點,節(jié)點的值中記錄了 HA集群名稱 active節(jié)點別名 active節(jié)點地址。
起到互斥鎖的作用,只有獲取到該節(jié)點的使用權(quán),才能修改上面ActiveBreadCrumb節(jié)點的值。
因為是臨時節(jié)點,所以當active namenode和zk保持連接,該節(jié)點就會一直存在,而standby的namenode也是和zk保持連接,但是發(fā)現(xiàn)該臨時節(jié)點已存在,就明白已經(jīng)有人占用了,所以它不會做任何事。當上面的active namenode發(fā)生問題,不正常了,ZKFC就會斷開和zk的連接,那么臨時節(jié)點就會消失。此時standby namenode就會重新創(chuàng)建該臨時節(jié)點,相當于獲得了鎖,可以修改ActiveBreadCrumb的值。此時它自己也就順理成章變成新的active namenode。
3)基于ZooKeeper的選擇:
如果本地NameNode是健康的,且ZKFC發(fā)現(xiàn)沒有其它的節(jié)點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經(jīng)贏得了選擇,并負責(zé)運行故障轉(zhuǎn)移進程以使它的本地NameNode為active。
主機 | 角色 |
---|---|
bigdata121/192.168.50.121 | namenode,journalnode,datanode,zk |
bigdata122/192.168.50.122 | namenode,journalnode,zk |
bigdata123/192.168.50.123 | zk |
軟件版本 | hadoop2.8.4,zookeeper3.4.10,centos7.2 |
jdk,zookeeper部署不重復(fù)講了,看之前的文章吧
基礎(chǔ)環(huán)境配置:
每個機器添加主機名解析/etc/hosts
每臺主機對自己,以及對另外兩臺主機都要配置ssh免秘鑰登錄
關(guān)閉防火墻以及selinux
hadoop的完整部署可以看之前的文章,這里著重講namenode HA的配置。
修改配置文件:
core-site.xml
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/opt/modules/HA/hadoop-2.8.4/data/ha_data
ha.zookeeper.quorum
bigdata121:2181,bigdata122:2181,bigdata123:2181
hdfs-site.xml
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
dfs.namenode.rpc-address.mycluster.nn1
bigdata121:9000
dfs.namenode.rpc-address.mycluster.nn2
bigdata122:9000
dfs.namenode.http-address.mycluster.nn1
bigdata121:50070
dfs.namenode.http-address.mycluster.nn2
bigdata122:50070
dfs.namenode.shared.edits.dir
qjournal://bigdata121:8485;bigdata122:8485/mycluster
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
dfs.journalnode.edits.dir
/opt/modules/HA/hadoop-2.8.4/data/jn
dfs.permissions.enable
false
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.automatic-failover.enabled
true
配置文件同步到各個節(jié)點中。使用scp或者rsync隨意吧。
第一次啟動時:
cd /opt/modules/HA/hadoop-2.8.4
1)各個journalnode節(jié)點上啟動journalnode服務(wù)
sbin/hadoop-daemon.sh start journalnode
2)nn1上格式化namenode,并啟動
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
3)nn2上通過啟動的journalnode從nn1上同步namenode的數(shù)據(jù)到本地namenode
bin/hdfs namenode -bootstrapStandby
4)啟動nn2
sbin/hadoop-daemon.sh start namenode
5)nn1上啟動所有datanode
sbin/hadoop-daemons.sh start datanode
6)兩臺namenode上查看namenode狀態(tài)
bin/hdfs haadmin -getServiceState nn1
bin/hdfs haadmin -getServiceState nn2
正常情況一個是active,一個是standby
7)手動轉(zhuǎn)換成active和standby
bin/hdfs haadmin -transitionToActive namenode名稱
bin/hdfs haadmin -transitionToStandby namenode名稱
注意,如果需要手動切換,那么需要將hdfs-site.xml中的自動切換關(guān)掉。否則報錯。
或者使用 --forceactive 進行強制轉(zhuǎn)換。
啟動完成后,可以手動將active的namenode關(guān)掉,可以看到剛剛standby的namenode會自動轉(zhuǎn)為 active。而剛才關(guān)掉的namenode重新上線的話,就會變?yōu)閟tandby。
第二次啟動:
直接start-dfs.sh即可
當我們啟動完整個namenode的HA集群之后,我們發(fā)現(xiàn)并沒有SNN的身影,天真的我以為以為還需要手動啟動,就手動啟動一發(fā)了,結(jié)果報錯了。
查看SNN的啟動日志,可以發(fā)現(xiàn)有這么一個報異常信息
org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Failed to start secondary namenode
java.io.IOException: Cannot use SecondaryNameNode in an HA cluster. The Standby Namenode will perform checkpointing.
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.(SecondaryNameNode.java:189)
at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.main(SecondaryNameNode.java:690)
意思很明顯了,就是說SNN的職責(zé)由standby的namenode來完成了,HA狀態(tài)下不需要SNN的存在了。這樣其實也很合理,可以說是充分利用了standby的namenode,免得它閑在那里。
其實和上面的namenode的ha類似,也是借助ZKFC進行監(jiān)控RM。
會在 zk上創(chuàng)建一個 /yarn-leader-election/yarn集群名稱 的節(jié)點,
下面有兩個子節(jié)點:ActiveBreadCrumb, ActiveStandbyElectorLock
作用類似,不重復(fù)講。工作機制基本類似的
主機 | 角色 |
---|---|
bigdata121 | zk, rm |
bigdata122 | zk, rm |
bigdata123 | zk |
yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.log-aggregation-enable
true
yarn.log-aggregation.retain-seconds
604800
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster-yarn1
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
bigdata121
yarn.resourcemanager.hostname.rm2
bigdata122
yarn.resourcemanager.zk-address
bigdata121:2181,bigdata122:2181,bigdata123:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
配置文件同步到其他節(jié)點。
bigdata121:啟動yarn
sbin/start-yarn.sh
bigdata122:啟動rm
sbin/yarn-daemon.sh start resourcemanager
查看服務(wù)狀態(tài):
bin/yarn rmadmin -getServiceState rm1
bin/yarn rmadmin -getServiceState rm2
測試方式和namenode類似,這里不重復(fù)