【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的值来存储其地址值

相关文章
相关标签/搜索