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所示的几类主要方法。

15.3.2 ZooKeeper API的简单使用 - 图1

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]