2020-07-07

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)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容