java代码中调用zookeeper

项目中使用了zookeeper管理hbase,昨天写了个小任务统计hbase里的数据,需要用zookeeper读取hbase的配置。

zookeeper的机制这一篇先不讲了,hadoop权威指南看到zookeeper再详细的讲。这里主要说一下如何用几行代码迅速的拿到zookeeper中的配置,进一步的是如何注册watcher。

首先是直接拿zookeeper数据

1
2
ZooKeeper zk = new ZooKeeper("host1:2181,host2:2181", 60 * 1000, null);
String = zk.getData(input, false, null));

new ZooKeeper的第一个参数是hosts的地址列表,第二个是timeout时间,第三个是watcher,我们的程序不需要watcher,就传了null

之后需要getData时第一个参数是path,就是zookeeper里的path,第二个是是否watcher,第三个参数我不知道是啥意思。

然后说一下利用listener和watcher监控数据变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//内部类
class ConfigWatcher extends ZooKeeperListener {
private String basePath;
public ConfigWatcher(ZooKeeperWatcher watcher, String base) {
super(watcher);
basePath = base;
}
public void start() throws KeeperException {
watcher.registerListener(this);
if (ZKUtil.watchAndCheckExists(watcher, basePath)) {
byte[] data = ZKUtil.getDataAndWatch(zkw, basePath);
//do Sth.
}
}
private void handle(String path) {
data = ZKUtil.getDataAndWatch(zkw, basePath);
//do Sth.
}
@Override
public void nodeCreated(String path) {
handle(path);
}
@Override
public void nodeDataChanged(String path) {
handle(path);
}
public void close() {
if (this.watcher != null) {
watcher.unregisterListener(this);
}
}
}

这个类继承了zookeeperListener,Listener有个私有变量watcher,start中他将watcher注册给自己,并且通过ZKUtil中的api获取数据。

该类重载了nodeCreated和nodeDataChanged,这样当node被创建和数据变化时会自动被调用,从而获得最新的数据。

传入的watcher这样初始化:

1
2
3
4
5
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", hosts);
conf.setInt("hbase.zookeeper.property.clientPort", port);
zkw = new ZooKeeperWatcher(conf, ConfigWatcher.class.getName(), null);
watcher = new ConfigWatcher(zkw, basePath);

通过设置conf并初始化ZooKeeperWatcher即可


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2015/11/11/java代码中调用zookeeper/