通过Java API操作Zookeeper
我们已经详细介绍Zookeeper的常用方法。本节,我们主要是通过Java API来操作Zookeeper。首先,启动Zookeeper服务;其次,连接Zookeeper服务;最后,操作Zookeeper。(启动和连接Zookeeper服务的具体操作步骤,在此节不作重述)
1.添加依赖
首先,在HadoopDemo工程中添加Zookeeper相关依赖,代码如下:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
2.操作Zookeeper
在项目src文件夹下创建cn.itcast.zookeepe包,在这里创建ZookeeperTest.java文件,我们通过创建节点、获取节点、修改节点、判断节点是否存在以及删除节点等方法来操作Zookeeper。具体实现代码,如文件所示。
文件 ZookeeperTest.java
1 import org.apache.zookeeper.CreateMode;
2 import org.apache.zookeeper.WatchedEvent;
3 import org.apache.zookeeper.Watcher;
4 import org.apache.zookeeper.ZooDefs.Ids;
5 import org.apache.zookeeper.ZooKeeper;
6 public class ZookeeperTest {
7 public static void main(String[] args) throws Exception {
8 **//****步骤一:****创建Zookeeper****客户端**
9 //参数1:zk地址;参数2:会话超时时间(与系统默认一致);参数3:监视器
10 ZooKeeper zk = new ZooKeeper("hadoop01:2181,hadoop02:2181,\
11 hadoop03:2181", 30000, new Watcher() {
12 @Override
13 //监控所有被触发的事件(也就是在这里进行事件的处理)
14 public void process(WatchedEvent event) {
15 System.*out*.println("事件类型为: " + event.getType());
16 System.*out*.println("事件发生的路径: " + event.getPath());
17 System.*out*.println("通知状态为: " + event.getState());
18 }
19 });
20 **//****步骤二:** **创建目录节点**
21 //参数1:要创建的节点的路径;参数2:节点数据;参数3:节点权限;参数4:节点类型
22 zk.create("/testRootPath", "testRootData".getBytes(),\
23 Ids.*OPEN_ACL_UNSAFE*, CreateMode.*PERSISTENT*);
24 **//****步骤三:** **创建子目录节点**
25 zk.create("/testRootPath/testChildPathOne",
26 "testChildDataOne".getBytes(),
27 Ids.*OPEN_ACL_UNSAFE*,
28 CreateMode.*PERSISTENT*);
29 **//****步骤四:****获取目录节点数据**
30 //参数1:存储节点数据的路径;
31 //参数2:是否需要监控此节点(true/false)
32 //参数3:stat节点的统计信息(一般设置为null)
33 System.*out*.println("testRootData节点数据为:"+\
34 new String(zk.getData("/testRootPath", false, null)));
35 **//****步骤五:** **获取子目录节点数据**
36 System.*out*.println(zk.getChildren("/testRootPath", true));
37 **//****步骤六:** **修改子目录节点数据,使得监听触发**
38 //参数1:存储子目录节点数据的路径
39 //参数2:要修改的数据;
40 //参数3:预期要匹配的版本(设置为-1,则可匹配任何节点的版本)
41 zk.setData("/testRootPath/testChildPathOne",\
42 "modifyChildDataOne".getBytes(), -1);
43 **//****步骤七:****判断目录节点是否存在**
44 System.*out*.println("目录节点状态: [" + \
45 zk.exists("/testRootPath", true) + "]");
46 **//****步骤八:** **删除子目录节点**
47 zk.delete("/testRootPath/testChildPathOne", -1);
48 **//****步骤九:** **删除目录节点**
49 zk.delete("/testRootPath", -1);
50 zk.close();
51 }
52 }
通过执行文件的main方法,控制台打印输出的内容,如图1所示。
图1 Java API操作Zookeeper输出的内容