【HBase】zookeeper在HBase中的應用

轉自:http://support.huawei.com/ecommunity/bbs/10242721.htmlhtml

 

Zookeeper在HBase中的應用

       HBase部署相對是一個較大的動做,其依賴於zookeeper cluster,hadoop HDFS。java

        http://images.cnblogs.com/cnblogs_com/reckzhou/201203/201203221739575422.jpg

       Zookeeper做用在於:node

                一、hbase regionserver 向zookeeper註冊,提供hbase regionserver狀態信息(是否在線)。linux

                二、hmaster啓動時候會將hbase系統表-ROOT- 加載到 zookeeper cluster,經過zookeeper cluster能夠獲取當前系統表.META.的存儲所對應的regionserver信息。shell

 

zookeeper是hbase集羣的"協調器"。因爲zookeeper的輕量級特性,所以咱們能夠將多個hbase集羣共用一個zookeeper集羣,以節約大量的服務器。多個hbase集羣共用zookeeper集羣的方法是使用同一組ip,修改不一樣hbase集羣的"zookeeper.znode.parent"屬性,讓它們使用不一樣的根目錄。好比cluster1使用/hbase-c1,cluster2使用/hbase-c2,等等。apache

 

        HMaster主要做用在於,經過HMaster維護系統表-ROOT-,.META.,記錄regionserver所對應region變化信息。此外還負責監控處理當前hbase cluster中regionserver狀態變化信息。服務器

        hbase regionserver則用於多個/單個維護region。網絡

        region則對應爲hbase數據表的表分區數據維護。session

        

參考: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. 每個Master、RS和客戶端進程都會建立一個zookeeperwatcher的實例。

一、初始化ZooKeeper鏈接和watcher

①      設置節點名稱

②      ZKUtil.connet

③      若是鏈接成功,則新建一些節點,如ZKUtil.createAndFailSilent(this, baseZNode); 若是節點存在,則再也不建立。不加watch。此處建立的是持久性節點,並具備open access性。

HBase中的znode

/hbase   baseZNode

Node name (fault)

節點分類

 

ZookeeperWatcher初始化時建立

/hbase

baseZNode

集羣的根znode

/hbase/root-region-server

rootServerZNode

包含-ROOT- region的服務器位置的節點

 

/hbase/rs

rsZNode

RS的臨時節點

/hbase/draining

drainingZNode

draining RS 臨時節點

/hbase/master

masterAddressZNode

currently active master

在hbase.master.Hmaster中建立

/hbase/backup-masters

backupMasterAddressesZNode

backup master directory, if not the active master

/hbase/shutdown

clusterStateZNode

znode containing the current cluster state

 

/hbase/unassigned

assignmentZNode

region transitioning and assignment

√在rs啓動時會建立該節點的子節點。ZKAssign會操做此節點,並建立子節點來指示rs的狀態。

/hbase/table

tableZNode

table disabling/enabling

/hbase/hbaseid

clusterIdZNode

containing the unique cluster ID

 

/hbase/splitlog

splitLogZNode

log splitting work assignment

 

ZooKeeperWatcher的構造函數的做用就是初始化一個ZooKeeper鏈接並設置watcher。所以在ZookeeperWatcher初始化時建立的節點,表示只要HBase在鏈接ZooKeeper時就會建立這些節點。

 

一、  /hbase的子節點:

二、  HBase中的list命令和/hbase/table下的子節點對比:前者不包括-ROOT-和.META.表:

 

三、  啓動HBase時,/hbase/unassigned節點的變化:

 

 

 

ZooKeeperListener.java

package org.apache.hadoop.hbase.zookeeper;

抽象類,實現HBase內部ZooKeeper事件的監聽。ZooKeeperWatcher會執行適當的方法來實現該類。爲了從watcher接收到事件,每一個監聽者必需要經過ZooKeeperWatcher註冊。子類須要重寫須要的方法。值得注意的是監聽者的watcher在執行這些方法時會引發阻塞,所以不能長期運行這些方法。

在構造函數中就初始化了一個ZooKeeperWatcher。

 

監聽的事件包括nodeCreated(String path)、nodeDeleted(String path)、nodeDataChanged(String path)、nodeChildrenChanged(String path)。

ActiveMasterManager.java

做用:處理全部master方面的master選舉的事務。監聽並回應master znode的zookeeper通知,包括nodeCreated(節點建立)和nodeDeleted(節點刪除)。

包含阻斷方法,備master等待主master失敗。?

在HMaster構造函數的blockUntilBecomingActiveMaster方法中實例化該類。

 

實現了抽象類ZooKeeperListener中的nodeCreated(節點建立)和nodeDeleted(節點刪除)方法。

 

 

HBase中使用zookeeper的場景(未完)

一、主備master切換時

應用場景

使用類

調用函數

備註

Master啓動

HMaster

HMaster(構造函數)

鏈接zookeeper

主備master切換

HMaster

becomeActiveMaster(MonitoredTask startupStatus)

註冊一個Listener

client鏈接HBase

 

HConnectionManager

 

 

HConnectionImplementation

 

(見hbase.zookeeper源碼-Bene.xlsx中的sheet2)

Zookeeper交流遺留問題

一、Follower和Observer可否寫數據,兩者主要區別是什麼?

           ObserverRequestProcessor會將收到的任何修改狀態的請求都發送給leader。遇到如下操做時,observer和follower都會發送請求給leader

switch (request.type) {

                case OpCode.sync:

                    zks.pendingSyncs.add(request);

                    zks.getFollower().request(request);

//              zks.getObserver().request(request);

                    break;

                case OpCode.create:

                case OpCode.delete:

                case OpCode.setData:

                case OpCode.setACL:

                case OpCode.createSession:

                case OpCode.closeSession:

                case OpCode.multi:

                    zks.getFollower().request(request);

//             zks.getObserver().request(request);

 

主要區別:Observer不參與leader選舉和投票。

Follower能夠寫數據,Observer在客戶端寫數據時不參與,主要經過sync操做更新數據。

 兩者的主要區別是Follower參與選舉和投票,Observer不參與選舉和投票。

  投票在寫數據過程當中的做用:客戶端發送寫數據操做時,follower或者Observer將寫數據請求轉發給leader,而後leader發送給具備投票權(也就是follower和leader)的角色;當這些節點有半數以上的節點反饋給leader投票,leader則認爲寫數據成功。

observer是zookeeper-3.3版本新添加的一個角色,,他們的引入是爲了解決zookeeper集羣擴大後,因爲網絡可靠性降低可能致使的拜占庭將軍問題。

二、寫數據的原子性如何保證?

ZooKeeper中讀寫數據都具備原子性。

讀數據的原子性是指讀某個節點的數據時,會將該節點全部的數據都返回給客戶端。

寫數據的原子性是指寫數據不會部分失敗或部分紅功。一個成功的寫操做必須保證被寫入到大部分zookeeper服務器的永久存儲上(不是上次說的全部服務器)。

 

三、/hbase/rs節點的子節點是持久節點仍是臨時節點?

       臨時節點。能夠經過在shell腳本查看/hbase/rs節點的數據及其子節點的數據,/hbase/rs是持久節點,其子節點是臨時節點,兩者以下圖。

       /hbase/rs是持久節點:

      

   這個znode[linux-jay1.jay,20020,1345715787547]是個臨時znode,當該regionserver關閉後,這個znode會消失,那麼設置了watcher的master就會第一時間感知到regionserver的退出。

備註:若是是持久節點ephemeralOwner 的值爲0。

Get的各個參數解釋:

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.

四、sync操做的做用是什麼?

sync操做的做用是使客戶端的znode視圖與ZooKeeper同步,因爲讀操做可能會存在鏈接的某臺zookeeper服務器上的數據並非最新數據,所以zookeeper容許客戶端用sync操做自身更新(如何實現涉及到ZooKeeper內核,目前尚未看這部份內容)。

五、watcher的設置是一次性的,爲何要如此設計?

Watch是由ZooKeeper服務的操做來設置,同時由服務的其餘操做來觸發,watcher只被觸發一次。好比一個客戶端對某個znode調用了exists操做並在這個節點上加了一個Watch,若是該節點不存在,則exists操做返回false。若是一段時間後,這個znode被另一個客戶端建立了,該Watch將被觸發,通知第一臺客戶端znode被建立的消息。

因爲是針對操做而設置的,所以很容易區別上次交流時所說的狀態。    ZooKeeper在讀操做exists、getChildren、getData時設置watch,這些操做都由寫操做create、delete和setData來觸發。

 如此看來,並非全部的操做都會觸發watch,也並非全部的操做都會設置watch。並且經過znode的路徑能夠肯定是哪一個znode發生了改變,經過操做的類型能夠肯定該節點發生了何種改變。我的認爲這樣設置的確增長了通用性,同時也減小了資源消耗。

另外

ZooKeeper提供配置服務的手段是:用znode的路徑來記錄鍵,用znode的數據來存儲值,所以正好可使用znode來存儲鍵值對。

好比,/hbase/root-region-server的路徑表示存儲的是-ROOT-表所在服務器的地址,而後用該znode的值來存儲其地址值

相關文章
相關標籤/搜索