轉自:http://support.huawei.com/ecommunity/bbs/10242721.htmlhtml
HBase部署相對是一個較大的動做,其依賴於zookeeper cluster,hadoop HDFS。java
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函數
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 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節點的變化:
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)。
做用:處理全部master方面的master選舉的事務。監聽並回應master znode的zookeeper通知,包括nodeCreated(節點建立)和nodeDeleted(節點刪除)。
包含阻斷方法,備master等待主master失敗。?
在HMaster構造函數的blockUntilBecomingActiveMaster方法中實例化該類。
實現了抽象類ZooKeeperListener中的nodeCreated(節點建立)和nodeDeleted(節點刪除)方法。
一、主備master切換時
應用場景 |
使用類 |
調用函數 |
備註 |
|||
Master啓動 |
HMaster |
HMaster(構造函數) |
鏈接zookeeper |
|||
主備master切換 |
HMaster |
becomeActiveMaster(MonitoredTask startupStatus) |
註冊一個Listener |
|||
|
|
HConnectionImplementation |
|
(見hbase.zookeeper源碼-Bene.xlsx中的sheet2)
一、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的值來存儲其地址值