zookeeper與HDFS
在2.0之前HDFS中只有一個(gè)NameNode,但對(duì)于在線的應(yīng)用只有一個(gè)NameNode是不安全的,故在2.0中對(duì)NameNode進(jìn)行抽象,抽象成NamService其下包含有多個(gè)NameNode,但只有一個(gè)運(yùn)行在活躍狀態(tài),因此需要zookeeper進(jìn)行選舉和自動(dòng)轉(zhuǎn)換。一旦active當(dāng)?shù)糁髗ookeeper會(huì)自定進(jìn)行切換將standby切換為active。
圖片來(lái)源:HDFS-1623設(shè)計(jì)文檔
圖片作者: Sanjay Radia, Suresh Srinivas
如上圖,每一個(gè)運(yùn)行NameNode的機(jī)器上都會(huì)運(yùn)行一個(gè)FailoverController Active進(jìn)程,用于監(jiān)控NameNode,即FailoverController與NameNode 二者是運(yùn)行在同一臺(tái)節(jié)點(diǎn)上的。
1】、如上,系統(tǒng)中Active NameNode一旦數(shù)據(jù)發(fā)生變化,Active NameNode會(huì)將變化(edits文件)寫入到介質(zhì)中,通常介質(zhì)使用:
1、NFS網(wǎng)絡(luò)文件系統(tǒng);
2、依賴于zookeeper的JournalNode,當(dāng)機(jī)器不是很多時(shí)可以使用JournalNode存儲(chǔ)edits,而一旦介質(zhì)中數(shù)據(jù)發(fā)生變化,Standby的NameNode會(huì)實(shí)時(shí)同步介質(zhì)中的數(shù)據(jù),因此ActiveNameNode與處于Standby的NameNode是實(shí)時(shí)數(shù)據(jù)同步的,
2】、FailoverController Active進(jìn)程會(huì)實(shí)時(shí)監(jiān)控Active的NameNode并把他的信息匯報(bào)給zookeeper(由此不難理解為什么要將FailoverController與NameNode?安裝在同一個(gè)節(jié)點(diǎn)上了吧,因?yàn)镕ailoverController需要實(shí)時(shí)的監(jiān)控NameNode將二者放在同一個(gè)節(jié)點(diǎn)上),若active NameNode沒(méi)有發(fā)生故障,F(xiàn)ailoverController Active進(jìn)程會(huì)每隔一段時(shí)間將監(jiān)控Actice NameNode的狀態(tài),并將Active NameNode的信息發(fā)送給zookeeper。若一旦監(jiān)控到Active NameNode出現(xiàn)問(wèn)題,就會(huì)將信息匯報(bào)給zookeeper,而另一個(gè)Standby FailoverController進(jìn)程與active?FailoverController進(jìn)程是數(shù)據(jù)同步的(通過(guò)zookeeper實(shí)現(xiàn))因此,Standby?FailoverController進(jìn)程會(huì)同時(shí)知道Active NameNode當(dāng)?shù)袅?,此時(shí)會(huì)給它監(jiān)控的Standby NameNode節(jié)點(diǎn)發(fā)送信息,使其成為Active NameNode。
CDH5.7.1版本的hdfs在zookeeper的目錄為:/hadoop-ha/nameservice1/{ActiveBreadCrumb/ActiveStandbyElectorLock}
hadoop-ha/Namespace(集群當(dāng)前為nameservice1 -- 對(duì)應(yīng)hdfs的NameNode Nameservice配置);nameservice1 目錄下有:ActiveBreadCrumb ActiveStandbyElectorLock 其內(nèi)容均為nameservice1 - hadoop6 (hadoop6為當(dāng)前activeNameNode hadoop7為standbyNameNode)
yarn在zookeeper上的節(jié)點(diǎn):/yarn-leader-election/yarnRM/{ActiveBreadCrumb/ActiveStandbyElectorLock} 記載resourceManager的Active節(jié)點(diǎn)服務(wù)器地址
/rmstore/ZKRMStateRoot/{RMAppRoot,AMRMTokenSecretManagerRoot,EpochNode,RMDTSecretManagerRoot,RMVersionNode} 其中RMAppRoot保留了所有歷史的提交到y(tǒng)arn上的應(yīng)用程序的元數(shù)據(jù)。
/hbase/[...rs,master,balancer,namespace,hbaseid,table ...]
rs保留了region server的入口 其子節(jié)點(diǎn)對(duì)應(yīng)region server 的 regionServer:60030/rs-status 中 的 RegionServer描述-ServerName(一般來(lái)說(shuō)DataNode節(jié)點(diǎn)上都會(huì)安裝region server 移動(dòng)計(jì)算而不是移動(dòng)數(shù)據(jù))
balancer記錄了其負(fù)載數(shù)據(jù)? namespace 記錄了hbase的命名空間 一個(gè)命名空間包含default和hbase,命名空間內(nèi)創(chuàng)建hbase表
hbaseid記錄著hbase cluster id,table里的子節(jié)點(diǎn)為hbase上的表。table-lock? 上鎖的table表
與kafka的結(jié)合 -- kafka目錄的配置在 kafka-配置的Zookeeper Root -- zookeeper.chroot 如果為空在默認(rèn)在zookeeper的根目錄下直接創(chuàng)建admin等節(jié)點(diǎn),如果添加/kafka的話,則在/kafka的節(jié)點(diǎn)下創(chuàng)建一系列節(jié)點(diǎn)。
/kafka/{admin,isr_change_notification,controller_epoch,consumers,brokers,config,controller} 為kafka提供服務(wù)其中admin節(jié)點(diǎn)包含deletetopics其子節(jié)點(diǎn)為所有刪除過(guò)得topic。isr_change_notification實(shí)現(xiàn)kafka分區(qū)同步監(jiān)聽任務(wù)。consumers記錄了當(dāng)前的消費(fèi)者。brokers包含{ids,topics,seqid},ids包含子節(jié)點(diǎn)為brokerid 此時(shí)為170 --對(duì)應(yīng)著kafka配置中的Kafka Broker 的Broker ID -- broker.id (當(dāng)前kafka集群只有一個(gè)broker 其brokerid為170). brokerid為170,該節(jié)點(diǎn)的內(nèi)容為{"jmx_port":"9393","timestamp","","endpoints":["PLAINTEXT://10.2.5.64:9092"],"host":"10.2.5.64","version":2,"port":9092} topics下面的節(jié)點(diǎn)對(duì)應(yīng)的是有多少個(gè)topic,每個(gè)topic的子節(jié)點(diǎn)為partitions,partitions的子節(jié)點(diǎn)為分區(qū)編號(hào){0,1,2,...},每個(gè)分區(qū)編號(hào)子節(jié)點(diǎn)為state,state節(jié)點(diǎn)下沒(méi)有子節(jié)點(diǎn)了。state的數(shù)據(jù)為{"controller_epoch":25,"leader":170(brokerid),"version":1,"leader_epoch":1,"isr":[170]} isr--對(duì)應(yīng)的是該分區(qū)數(shù)據(jù)處在同步狀態(tài)副本的brokerid
zookeeper與Hbase
Client客戶端、Master、Region都會(huì)通過(guò)心跳機(jī)制(RPC通信)與zookeeper保持聯(lián)系。
當(dāng)在Hbase中插入或讀取數(shù)據(jù)時(shí)流程如下;
1、在Client中寫一個(gè)Java類運(yùn)行,客戶端只需要連接zookeeper,客戶端會(huì)從zookeeper中得到Regionserver的映射信息,之后客戶端會(huì)直接連接到Region Server,
2、RegionServer在啟動(dòng)之后會(huì)向zookeeper匯報(bào)信息(通過(guò)心跳RPC):本身有多少Region,有哪些數(shù)據(jù),當(dāng)前機(jī)器的運(yùn)行狀況等等。
3、master 啟動(dòng)后也會(huì)向zookeeper匯報(bào)信息,并且從zookeeper中得到Region Server的一些信息。例如當(dāng)一臺(tái)Region Server當(dāng)?shù)糁螅?b>zookeeper會(huì)得知,之后Master也會(huì)通過(guò)zookeeper得到該Region Server當(dāng)?shù)舻男畔ⅰ?/p>
4、當(dāng)客戶端Client在做DDL(創(chuàng)建,修改,刪除表)時(shí),會(huì)通過(guò)zookeeper獲取到Master的地址,而Master中保存了表的元數(shù)據(jù)信息,之后Client就可以直接與Master進(jìn)行通信,進(jìn)行表的DDL操作
5、當(dāng)Region中數(shù)據(jù)不斷增大,MAster會(huì)向Region Serve發(fā)送指令,講分割出來(lái)的Region進(jìn)行轉(zhuǎn)移,
Zookeeper:
1】保證任何時(shí)候,集群中只有一個(gè)活躍的master,因?yàn)闉楸WC安全性會(huì)啟動(dòng)多個(gè)Master
2】存儲(chǔ)所有Region的尋址入口。知道那個(gè)Region在哪臺(tái)機(jī)器上。
3】實(shí)時(shí)監(jiān)控Region Server的狀態(tài),將Region Server的上下線的信息匯報(bào)給HMaster。(因?yàn)槊块g隔一段時(shí)間,RegionServer與Master都會(huì)zookeeper發(fā)送心跳信息),Region Server不直接向Master發(fā)送信息的原因是為了減少M(fèi)aster的壓力因?yàn)橹挥幸粋€(gè)活躍的Master,所有的RegionServer同時(shí)向他匯報(bào)信息,壓力太大。而若有100臺(tái)RegionServer時(shí),Region Server可以分每10臺(tái)向一個(gè)zookeeper匯報(bào)信息,實(shí)現(xiàn)zookeeper的負(fù)載均衡。
4】存儲(chǔ)Hbase的元數(shù)據(jù)(Schema)包括,知道整個(gè)Hbase集群中有哪些Table,每個(gè)?Table 有哪些column family(列族)
Client
Client包含了訪問(wèn)Hbase的接口,Client維護(hù)這些Cache來(lái)加快對(duì)Hbase的訪問(wèn),比如Region的位置信息,zookeeper,zookeeper保證了任何時(shí)候群眾只有一個(gè)Master存儲(chǔ)所有的Region中的尋址入口還有實(shí)時(shí)監(jiān)控RegionServer上的狀態(tài),將RegionServer的上線和下線信息實(shí)時(shí)通知給Master,存儲(chǔ)hbase 的Schema,包括有哪些table,每個(gè)Table有哪些Column Family
Master
Master有以下特點(diǎn):
1、為RegionServer分配Region
2、負(fù)責(zé)RegionServer的負(fù)載均衡
3、發(fā)現(xiàn)失效的RegionServer并重新分配其上的Region
4、HDFS上的垃圾文件回收
5、處理Schema更新請(qǐng)求
RegionServer有以下幾點(diǎn):
1、RegionServer維護(hù)Master分配給他的 Region,處理對(duì)這些Region的IO請(qǐng)求
2、RegionServer負(fù)責(zé)切分在運(yùn)行過(guò)程中變得過(guò)大的Region,
因此可看出,Client訪問(wèn)Hbase上的數(shù)據(jù)的過(guò)程并不需要Master的參與(尋址訪問(wèn)zookeeper和Region Serve,寫數(shù)據(jù)訪問(wèn)Region Server)Master僅僅維護(hù)著table和Region的元數(shù)據(jù)信息。負(fù)載很低。