15.3.2 ZooKeeper API的简单使用
1.ZooKeeper API简介
ZooKeeper API共包含五个包,分别为:org.apache.zookeeper、org.apache.zookeeper.data、org.apache.zookeeper.server、org.apache.zookeeper.server.quorum和org.apache.zookeeper.server.upgrade。其中org.apache.zookeeper包含ZooKeeper类,它是我们编程时最常用的类文件。
这个类是ZooKeeper客户端库的主要类文件。如果要使用ZooKeeper服务,应用程序首先必须创建一个Zookeeper实例,这时就需要使用此类。一旦客户端和ZooKeeper服务建立起了连接,ZooKeeper系统将会给此连接会话分配一个ID值,并且客户端将会周期性地向服务器发送心跳来维持会话的连接。只要连接有效,客户端就可以调用ZooKeeper API来做相应的处理。
ZooKeeper类提供了表15-3所示的几类主要方法。
2.ZooKeeper API的使用
这里通过一个例子来简单介绍如何使用ZooKeeper API编写自己的应用程序,见代码清单15-6。
代码清单15-6 ZooKeeper API的使用
package cn.edu.ruc.cloudcomputing.book.chapter14;
1 import java.io.IOException;
2
3 import org.apache.zookeeper.CreateMode;
4 import org.apache.zookeeper.KeeperException;
5 import org.apache.zookeeper.Watcher;
6 import org.apache.zookeeper.ZooDefs.Ids;
7 import org.apache.zookeeper.ZooKeeper;
8
9 public class demo{
10//会话超时时间,设置为与系统默认时间一致
11 private static final int SESSION_TIMEOUT=30000;
12
13//创建ZooKeeper实例
14 ZooKeeper zk;
15
16//创建Watcher实例
17 Watcher wh=new Watcher(){
18 public void process(org.apache.zookeeper.WatchedEvent event)
19{
20 System.out.println(event.toString());
21}
22};
23
24//初始化ZooKeeper实例
25 private void createZKInstance()throws IOException
26{
27 zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT, this.wh);
28
29}
30
31 private void ZKOperations()throws IOException, InterruptedException, Keepe
rException
32{
33 System.out.println("\n1.创建ZooKeeper节点(znode:zoo2,数据:myData2,
权限:OPEN_ACL_UNSAFE,节点类型:Persistent");
34 zk.create("/zoo2","myData2".getBytes(),Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
35
36 System.out.println("\n2.查看是否创建成功:");
37 System.out.println(new String(zk.getData("/zoo2",false, null)));
38
39 System.out.println("\n3.修改节点数据");
40 zk.setData("/zoo2","shenlan211314".getBytes(),-1);
41
42 System.out.println("\n4.查看是否修改成功:");
43 System.out.println(new String(zk.getData("/zoo2",false, null)));
44
45 System.out.println("\n5.删除节点");
46 zk.delete("/zoo2",-1);
47
48 System.out.println("\n6.查看节点是否被删除:");
49 System.out.println("节点状态:["+zk.exists("/zoo2",false)+"]");
50}
51
52 private void ZKClose()throws InterruptedException
53{
54 zk.close();
55}
56
57 public static void main(String[]args)throws IOException, InterruptedExce
ption, KeeperException{
58 demo dm=new demo();
59 dm.createZKInstance();
60 dm.ZKOperations();
61 dm.ZKClose();
62}
63}
此类包含两个主要的ZooKeeper函数,分别为createZKInstance()和ZKOperations()。其中createZKInstance()函数负责对ZooKeeper实例zk进行初始化。ZooKeeper类有两个构造函数,这里使用“ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)”对其进行初始化。因此,我们需要提供初始化所需的连接字符串信息、会话超时时间,以及一个watcher实例。第17行到第23行的代码是程序所构造的一个watcher实例,它能够输出所发生的事件。
ZKOperations()函数是我们所定义的对节点的一系列操作。它包括:创建ZooKeeper节点(第33行到第34行代码)、查看节点(第36行到第37行代码)、修改节点数据(第39行到第40行代码)、查看修改后节点数据(第42行到第43行代码)、删除节点(第45行到第46行代码)、查看节点是否存在(第48行到第49行代码)。另外,需要注意的是,在创建节点的时候,需要提供节点的名称、数据、权限,以及节点类型。此外,使用exists函数时,如果节点不存在则返回一个null值。关于ZooKeeper API的更多详细信息,大家可以查看ZooKeeper的API文档,如下所示:
http://hadoop.apache.org/zookeeper/docs/r3.4.3/api/index.html
代码清单15-6中程序运行的结果如下所示。
1创建ZooKeeper节点(znode:zoo2,数据:myData2,权限:OPEN_ACL_UNSAFE,节点类型:
Persistent
11/01/18 05:07:16 INFO zookeeper.ClientCnxn:Socket connection established to
localhost/127.0.0.1:2181,initiating session
11/01/18 05:07:16 INFO zookeeper.ClientCnxn:Session establishment complete on
server localhost/127.0.0.1:2181,sessionid=0x12d97fd5d39000a, negotiated
timeout=30000
WatchedEvent state:SyncConnected type:None path:null
2查看是否创建成功:
myData2
3修改节点数据
4查看是否修改成功:
shenlan211314
5删除节点
6查看节点是否被删除:
节点状态:[null]