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