Hbase依赖于zookeeper进行集群管理,如HMaster的高可用,HMaster对HRegionServer的管理,看看Hbase与zookeeper的之间交互的工作机制。之前写过HMaster高可用方式,这里看看HMaster还有哪里工作机制依赖于zookeeper。

进击的buger:我对Hbase的一些理解——HMaster主从备份原理​zhuanlan.zhihu.com

this.zooKeeper = new ZooKeeperWatcher(conf, MASTER + ":" + isa.getPort(), this, true);

HMaster是在构造函数中开始建立与Zookeeper之间的连接,通过ZooKeeperWatcher管理监听Zookeeper上面的节点。节点如下:

baseZNode(根目录)-/hbase
metaServerZNode(元数据服务器地址)-/hbase/meta-region-server
rsZNode-/hbase/rs
drainingZNode-/hbase/draining
masterAddressZNode(HMsater地址)-/hbase/master
backupMasterAddressesZNode(备用HMaster地址)-/hbase/backup-masters
clusterStateZNode(集群状态)-/hbase/running
tableZNode(数据表信息)-/hbase/table
clusterIdZNode(集群ID)-/hbase/hbaseid
splitLogZNode-/hbase/splitWAL
balancerZNode-/hbase/balancer
recoveringRegionsZNode
namespaceZNode(命名空间)-/hbase/namespace
masterMaintZNode

创建完并对节点赋值后,就在开始追踪节点的状态了,主要ZooKeeperNodeTracker完成对zookeeper上面节点的追踪,以ClusterStatusTracker为例。

public ClusterStatusTracker(ZooKeeperWatcher watcher, Abortable abortable) {super(watcher, watcher.clusterStateZNode, abortable);}

ClusterStatusTracker构造初始化时传入了ZooKeeperWatcher和Abortable对象。调用super(watcher, watcher.clusterStateZNode, abortable)中watcher.clusterStateZNode设置了要追踪的节点。

public ZooKeeperNodeTracker(ZooKeeperWatcher watcher, String node,Abortable abortable) {super(watcher);this.node = node;this.abortable = abortable;this.data = null;}

ZooKeeperNodeTracker继承至ZooKeeperListener,ZooKeeperListener是最基础的zookeeper节点监听器,只有一个ZooKeeperWatcher属性,定义了一些方法规范。

this.clusterStatusTracker.start();

之后调用start方法开始追踪。start方法的内容由ZooKeeperNodeTracker定义。

public synchronized void start() {this.watcher.registerListener(this);try {if(ZKUtil.watchAndCheckExists(watcher, node)) {byte [] data = ZKUtil.getDataAndWatch(watcher, node);if(data != null) {this.data = data;} else {// It existed but now does not, try again to ensure a watch is setLOG.debug("Try starting again because there is no data from " + node);start();}}} catch (KeeperException e) {abortable.abort("Unexpected exception during initialization, aborting", e);}}

代码内容如下:

this.watcher.registerListener(this);

往ZooKeeperWatcher对象注册监听器,这个监听器就是clusterStatusTracker。ZooKeeperWatcher内部有个一个private final List<ZooKeeperListener> listeners =
new CopyOnWriteArrayList<ZooKeeperListener>()属性,就是将clusterStatusTracker添加进去。

if(ZKUtil.watchAndCheckExists(watcher, node)) {byte [] data = ZKUtil.getDataAndWatch(watcher, node);if(data != null) {this.data = data;} else {// It existed but now does not, try again to ensure a watch is setLOG.debug("Try starting again because there is no data from " + node);start();}

接下来判断是否有这个节点,没有则退出,有则获取节点数据,获取不到则继续获取。到这里就追踪器就启动完成了。那是如何追踪到节点的状态的呢,主要是在ZooKeeperWatcher进行判断的。zookeeper的watcher具有回调功能,因为ZooKeeperWatcher实现了watcher的process方法,当节点发生变化时,便会调用ZooKeeperWatcher的process方法。

/*** Method called from ZooKeeper for events and connection status.* <p>* Valid events are passed along to listeners.  Connection status changes* are dealt with locally.*/@Overridepublic void process(WatchedEvent event) {LOG.debug(prefix("Received ZooKeeper Event, " +"type=" + event.getType() + ", " +"state=" + event.getState() + ", " +"path=" + event.getPath()));switch(event.getType()) {// If event type is NONE, this is a connection status changecase None: {connectionEvent(event);break;}// Otherwise pass along to the listenerscase NodeCreated: {for(ZooKeeperListener listener : listeners) {listener.nodeCreated(event.getPath());}break;}case NodeDeleted: {for(ZooKeeperListener listener : listeners) {listener.nodeDeleted(event.getPath());}break;}case NodeDataChanged: {for(ZooKeeperListener listener : listeners) {listener.nodeDataChanged(event.getPath());}break;}case NodeChildrenChanged: {for(ZooKeeperListener listener : listeners) {listener.nodeChildrenChanged(event.getPath());}break;}}}

当传回来WatchedEvent,便会调用ZooKeeperWatcher中注册的所有的Tracker,如clusterStatusTracker,调用相应的方法进行处理。至此,Hbase对zookeeper上节点状态变化的追踪原理基本如上所述。

hbase 和 zookeeper建立连接_我对Hbase的一些理解——HMaster与Zookeeper之间的交互机制...相关推荐

  1. ElasticJob源码部分解读-Zookeeper建立连接

    private static CoordinatorRegistryCenter createRegistryCenter() {CoordinatorRegistryCenter regCenter ...

  2. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)...

    需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...

  3. ftp无法与服务器建立连接_建立与Oracle数据库服务器连接的两种连接模式

    建立与Oracle数据库服务器连接的两种连接模式(专用服务器与共享服务器) 在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式.在Orac ...

  4. tableau无法建立连接_欧普照明利用 Tableau 解放数字化人才,助力企业数字化转型...

    欧普照明是一家集研发.生产销售.服务于一体的综合性照明企业,创立于 1996 年, 2016 年正式挂牌上市.公司现有员工 6000 多人,产品涵盖 LED 及传统光源.灯具.电工电器.厨卫吊顶产品等 ...

  5. tableau无法建立连接_外部服务连接疑难解答 - Tableau

    本主题描述 Tableau 连接到外部分析扩展程序服务时可能会收到的错误. 注意:Tableau 技术支持人员无法协助编写.调整外部脚本或排除其问题. 与任何分析扩展程序通信时可能会发生的错误 错误消 ...

  6. 网络适配器无法建立连接_「图」KB4515384更新令人抓狂:网络适配器又无法启用...

    适用于Windows 10 May 2019(Version 1903)的累积更新KB4515384于今年9月10日发布,重点修复了Cortana进程CPU占用率过高的问题,并引入了其他的常规修复.在 ...

  7. tableau无法建立连接_的Tableau错误连接到本地MySQL数据库

    Windows Server 2008的 的Tableau桌面7.0 本地MySQL使用XAMPP的Tableau错误连接到本地MySQL数据库 当试图使用的Tableau Desktop中的原生My ...

  8. mysql无法建立连接_【MySql】mysql无法建立连接或建立连接失败原因分析

    此文章试用与:用root账号登陆没问题,但是用程序连接就会有问题的coder. 我的数据库配置文件是: jdbcDriverClassName=com.mysql.jdbc.Driver jdbcUr ...

  9. cnpm 网络不能连接_(二十七)通俗易懂理解——Resnet残差网络

    Resnet看相关的文章都比较容易理解,本文主要转自两篇对该内容有较为全面解释和理解的文章. 1. 引言 网络的深度为什么重要? 因为CNN能够提取low/mid/high-level的特征,网络的层 ...

最新文章

  1. python 柱状图宽度设置_Python matplotlib 柱状图实例
  2. tomcat请求数据的编码设置
  3. How to change max_allowed_packet size
  4. qemu+linux+x86+64,kvm 内部错误:无法找到适合 x86_64 的模拟器
  5. Something about Giraffe (II)
  6. 同步I/O 和 异步I/O
  7. Linux 目录配置标准:FHS
  8. tf.global_variables_initializer()什么时候用?
  9. Linux-定时任务(Crontab)基本用法
  10. ubuntu mysql 5.0_ubuntu server 8.04 下的mysql5.0的集群实验
  11. UI自动化之-使用DD_XOFT实现带有安全控件、U盾的输入
  12. UNIX环境高级编程-#include “apue.h“
  13. cnPuTTY 0.77.0.1—PuTTY Release 0.77中文版本简单说明~~
  14. 什么是pc104(转自孙新贺的博客)
  15. 有哪些可以用来制作历史时间轴的软件?
  16. 颜色选择器(拾色器)
  17. Nero刻录软件超级实用技巧大搜罗
  18. 电流(或电压)的平均值与有效值
  19. hdu3966树链剖分 分析
  20. Java POI解析Word提取数据存储在Excel

热门文章

  1. CSS和HTML的基础知识(一)——HTML常用标签的简介及用法
  2. CLR via C# 内存管理读书记
  3. SAP 设置或取消仓库不参与MRP运算(转)
  4. python中circle函数_从Python3.6 Zelle Graphics中的另一个函数调用circle函数
  5. java查询数据库数据放到Excel下载
  6. 第三次小组实践作业小组每日进度汇报:2017-12-3
  7. 洛谷——P2820 局域网
  8. 18000 Two String 暴力。——— 读题
  9. SQL Server 数据库操作类
  10. Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据...