HBase部署相對(duì)是一個(gè)較大的動(dòng)作,其依賴于zookeeper cluster,hadoop HDFS。

Zookeeper作用在于:
1、hbase regionserver向zookeeper注冊,提供hbase regionserver狀態(tài)信息(是否在線)。
2、hmaster啟動(dòng)時(shí)候會(huì)將hbase系統(tǒng)表-ROOT-加載到zookeeper cluster,通過zookeeper cluster可以獲取當(dāng)前系統(tǒng)表.META.的存儲(chǔ)所對(duì)應(yīng)的regionserver信息。
zookeeper是hbase集群的"協(xié)調(diào)器"。由于zookeeper的輕量級(jí)特性,因此我們可以將多個(gè)hbase集群共用一個(gè)zookeeper集群,以節(jié)約大量的服務(wù)器。多個(gè)hbase集群共用zookeeper集群的方法是使用同一組ip,修改不同hbase集群的"zookeeper.znode.parent"屬性,讓它們使用不同的根目錄。比如cluster1使用/hbase-c1,cluster2使用/hbase-c2,等等。
HMaster主要作用在于,通過HMaster維護(hù)系統(tǒng)表-ROOT-,.META.,記錄regionserver所對(duì)應(yīng)region變化信息。此外還負(fù)責(zé)監(jiān)控處理當(dāng)前hbase cluster中regionserver狀態(tài)變化信息。
hbase regionserver則用于多個(gè)/單個(gè)維護(hù)region。
region則對(duì)應(yīng)為hbase數(shù)據(jù)表的表分區(qū)數(shù)據(jù)維護(hù)。
參考:http://koven2049.iteye.com/blog/1150484
hbase.zookeeper.zookeeperwatcher.java類
ZooKeeper Watcher.One instance of this is instantiated for each Master, RegionServer, and client process.每一個(gè)Master、RS和客戶端進(jìn)程都會(huì)創(chuàng)建一個(gè)zookeeperwatcher的實(shí)例。
1、初始化ZooKeeper連接和watcher
①設(shè)置節(jié)點(diǎn)名稱
②ZKUtil.connet
③如果連接成功,則新建一些節(jié)點(diǎn),如ZKUtil.createAndFailSilent(this, baseZNode);如果節(jié)點(diǎn)存在,則不再創(chuàng)建。不加watch。此處創(chuàng)建的是持久性節(jié)點(diǎn),并具有open access性。
HBase中的znode


ZooKeeperWatcher的構(gòu)造函數(shù)的作用就是初始化一個(gè)ZooKeeper連接并設(shè)置watcher。因此在ZookeeperWatcher初始化時(shí)創(chuàng)建的節(jié)點(diǎn),表示只要HBase在連接ZooKeeper時(shí)就會(huì)創(chuàng)建這些節(jié)點(diǎn)。
1、/hbase的子節(jié)點(diǎn):

2、HBase中的list命令和/hbase/table下的子節(jié)點(diǎn)對(duì)比:前者不包括-ROOT-和.META.表:

3、啟動(dòng)HBase時(shí),/hbase/unassigned節(jié)點(diǎn)的變化:

ZooKeeperListener.java
packageorg.apache.hadoop.hbase.zookeeper;
抽象類,實(shí)現(xiàn)HBase內(nèi)部ZooKeeper事件的監(jiān)聽。ZooKeeperWatcher會(huì)執(zhí)行適當(dāng)?shù)姆椒▉韺?shí)現(xiàn)該類。為了從watcher接收到事件,每個(gè)監(jiān)聽者必須要通過ZooKeeperWatcher注冊。子類需要重寫需要的方法。值得注意的是監(jiān)聽者的watcher在執(zhí)行這些方法時(shí)會(huì)引起阻塞,因此不能長期運(yùn)行這些方法。
在構(gòu)造函數(shù)中就初始化了一個(gè)ZooKeeperWatcher。
監(jiān)聽的事件包括nodeCreated(String path)、nodeDeleted(String path)、nodeDataChanged(String path)、nodeChildrenChanged(String path)。
ActiveMasterManager.java
作用:處理所有master方面的master選舉的事務(wù)。監(jiān)聽并回應(yīng)master znode的zookeeper通知,包括nodeCreated(節(jié)點(diǎn)創(chuàng)建)和nodeDeleted(節(jié)點(diǎn)刪除)。
包含阻斷方法,備master等待主master失敗。?
在HMaster構(gòu)造函數(shù)的blockUntilBecomingActiveMaster方法中實(shí)例化該類。
實(shí)現(xiàn)了抽象類ZooKeeperListener中的nodeCreated(節(jié)點(diǎn)創(chuàng)建)和nodeDeleted(節(jié)點(diǎn)刪除)方法。
HBase中使用zookeeper的場景(未完)
1、主備master切換時(shí)

Zookeeper交流遺留問題
1、Follower和Observer能否寫數(shù)據(jù),二者主要區(qū)別是什么?
ObserverRequestProcessor會(huì)將收到的任何修改狀態(tài)的請(qǐng)求都發(fā)送給leader。遇到以下操作時(shí),observer和follower都會(huì)發(fā)送請(qǐng)求給leader
switch(request.type) {
caseOpCode.sync:
zks.pendingSyncs.add(request);
zks.getFollower().request(request);
//zks.getObserver().request(request);
break;
caseOpCode.create:
caseOpCode.delete:
caseOpCode.setData:
caseOpCode.setACL:
caseOpCode.createSession:
caseOpCode.closeSession:
caseOpCode.multi:
zks.getFollower().request(request);
//zks.getObserver().request(request);
主要區(qū)別:Observer不參與leader選舉和投票。
Follower可以寫數(shù)據(jù),Observer在客戶端寫數(shù)據(jù)時(shí)不參與,主要通過sync操作更新數(shù)據(jù)。
二者的主要區(qū)別是Follower參與選舉和投票,Observer不參與選舉和投票。
投票在寫數(shù)據(jù)過程中的作用:客戶端發(fā)送寫數(shù)據(jù)操作時(shí),follower或者Observer將寫數(shù)據(jù)請(qǐng)求轉(zhuǎn)發(fā)給leader,然后leader發(fā)送給具有投票權(quán)(也就是follower和leader)的角色;當(dāng)這些節(jié)點(diǎn)有半數(shù)以上的節(jié)點(diǎn)反饋給leader投票,leader則認(rèn)為寫數(shù)據(jù)成功。
observer是zookeeper-3.3版本新添加的一個(gè)角色,,他們的引入是為了解決zookeeper集群擴(kuò)大后,由于網(wǎng)絡(luò)可靠性下降可能導(dǎo)致的拜占庭將軍問題。
2、寫數(shù)據(jù)的原子性如何保證?
ZooKeeper中讀寫數(shù)據(jù)都具有原子性。
讀數(shù)據(jù)的原子性是指讀某個(gè)節(jié)點(diǎn)的數(shù)據(jù)時(shí),會(huì)將該節(jié)點(diǎn)所有的數(shù)據(jù)都返回給客戶端。
寫數(shù)據(jù)的原子性是指寫數(shù)據(jù)不會(huì)部分失敗或部分成功。一個(gè)成功的寫操作必須保證被寫入到大部分zookeeper服務(wù)器的永久存儲(chǔ)上(不是上次說的所有服務(wù)器)。
3、/hbase/rs節(jié)點(diǎn)的子節(jié)點(diǎn)是持久節(jié)點(diǎn)還是臨時(shí)節(jié)點(diǎn)?
臨時(shí)節(jié)點(diǎn)??梢酝ㄟ^在shell腳本查看/hbase/rs節(jié)點(diǎn)的數(shù)據(jù)及其子節(jié)點(diǎn)的數(shù)據(jù),/hbase/rs是持久節(jié)點(diǎn),其子節(jié)點(diǎn)是臨時(shí)節(jié)點(diǎn),二者如下圖。
/hbase/rs是持久節(jié)點(diǎn):

這個(gè)znode[linux-jay1.jay,20020,1345715787547]是個(gè)臨時(shí)znode,當(dāng)該regionserver關(guān)閉后,這個(gè)znode會(huì)消失,那么設(shè)置了watcher的master就會(huì)第一時(shí)間感知到regionserver的退出。
備注:如果是持久節(jié)點(diǎn)ephemeralOwner的值為0。
Get的各個(gè)參數(shù)解釋:
czxid : The zxid of the change that caused this znode to be created.
mzxid : The zxid of the change that last modified this znode.
ctime : The time in milliseconds from epoch when this znode was created.
mtime : The time in milliseconds from epoch when this znode was last modified.
version : The number of changes to the data of this znode.
cversion : The number of changes to the children of this znode.
aversion : The number of changes to the ACL of this znode
ephemeralOwner
: The session id of the owner of this znode if the znode is an
ephemeral node. If it is not an ephemeral node, it will be zero.
dataLength : The length of the data field of this znode.
numChildren : The number of children of this znode.
4、sync操作的作用是什么?
sync操作的作用是使客戶端的znode視圖與ZooKeeper同步,由于讀操作可能會(huì)存在連接的某臺(tái)zookeeper服務(wù)器上的數(shù)據(jù)并不是最新數(shù)據(jù),因此zookeeper允許客戶端用sync操作自身更新(如何實(shí)現(xiàn)涉及到ZooKeeper內(nèi)核,目前還沒有看這部分內(nèi)容)。
5、watcher的設(shè)置是一次性的,為什么要如此設(shè)計(jì)?
Watch是由ZooKeeper服務(wù)的操作來設(shè)置,同時(shí)由服務(wù)的其他操作來觸發(fā),watcher只被觸發(fā)一次。比如一個(gè)客戶端對(duì)某個(gè)znode調(diào)用了exists操作并在這個(gè)節(jié)點(diǎn)上加了一個(gè)Watch,如果該節(jié)點(diǎn)不存在,則exists操作返回false。如果一段時(shí)間后,這個(gè)znode被另外一個(gè)客戶端創(chuàng)建了,該Watch將被觸發(fā),通知第一臺(tái)客戶端znode被創(chuàng)建的消息。
由于是針對(duì)操作而設(shè)置的,因此很容易區(qū)別上次交流時(shí)所說的狀態(tài)。ZooKeeper在讀操作exists、getChildren、getData時(shí)設(shè)置watch,這些操作都由寫操作create、delete和setData來觸發(fā)。
如此看來,并不是所有的操作都會(huì)觸發(fā)watch,也并不是所有的操作都會(huì)設(shè)置watch。而且通過znode的路徑可以確定是哪個(gè)znode發(fā)生了改變,通過操作的類型可以確定該節(jié)點(diǎn)發(fā)生了何種改變。個(gè)人認(rèn)為這樣設(shè)置的確增加了通用性,同時(shí)也減少了資源消耗。
另外:
ZooKeeper提供配置服務(wù)的手段是:用znode的路徑來記錄鍵,用znode的數(shù)據(jù)來存儲(chǔ)值,因此正好可以使用znode來存儲(chǔ)鍵值對(duì)。
比如,/hbase/root-region-server的路徑表示存儲(chǔ)的是-ROOT-表所在服務(wù)器的地址,然后用該znode的值來存儲(chǔ)其地址值
作者:絲絲雨涼
鏈接:http://www.itdecent.cn/p/67a817a157ee
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。