zookeeper3.3.3初探【安装+APIs创建一个znode】

来源:互联网 发布:linux下安装配置jdk 编辑:程序博客网 时间:2024/04/30 02:26

zookeeper安装很简单

1、下载http://mirror.bit.edu.cn/apache/zookeeper/

2、解压tar -xzvf zookeeper-3.3.5.tar.gz

3、vim ~/.bashrc中添加环境变量

export ZOOKEEPER_HOME=/home/ckl/hadoop-0.20.2/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME

4、修改zookeeper/conf/下的zoo.cfg(这个文件由zoo_sample.cfg重命名而来)

tickTime=5000
dataDir=/home/ckl/hadoop-0.20.2/zookeeper/data
clientPort=2181

5、重启终端,执行zk_Server.sh start

6、成功启动后执行zkCli.sh

7、下面利用eclipse新建一个工程zkTest,导入zookeeper下的jarAPI包,新建一个class ConnectionWatcher 用于连接zookeeper

import java.io.IOException;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.Watcher.Event.KeeperState;import org.apache.zookeeper.ZooDefs.Ids;public class ConnectionWatcher implements Watcher{private static final int SESSION_TIMEOUT=5000;public ZooKeeper zk; public CountDownLatch connectedSignal=new CountDownLatch(1);//需要等待1public void connect(String hosts)throws IOException,InterruptedException{zk=new ZooKeeper(hosts,SESSION_TIMEOUT,this);connectedSignal.await();//在使用zookeeper对象前,等待连接建立。这里利用Java的CountDownLatch类//(java.util.concurrent.CountDownLatch)来阻塞,直到zookeeper实例准备好。}public void close()throws InterruptedException{zk.close();}public void create(String groupName)throws KeeperException,InterruptedException{String path="/"+groupName;String createdPath=zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println("Created"+createdPath);}@Overridepublic void process(WatchedEvent event) {if(event.getState()==KeeperState.SyncConnected){//在收到连接事件KeeperState.SyncConnected时,connectedSignal被创建时,计数为1,代表需要在 //释放所有等待线程前发生事件的数量。在调用一次countDown()方法后,此计数器会归零,await操作返回。connectedSignal.countDown();}}//public static void main(String[]args)throws Exception{//ConnectionWatcher cg=new ConnectionWatcher();//cg.connect(args[0]);//cg.create(args[1]);//cg.close();//}}

8、继承上述类,实现创建znode,加入group,列出group的成员

import java.util.List;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.ZooDefs.Ids;public class ZnodesManage extends ConnectionWatcher{/** * 创建znode */public void create(String groupName)throws KeeperException,InterruptedException{String path="/"+groupName;String createdPath=zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println("Created "+createdPath);}/** * 创建子znode */public void join(String groupName,String memberName)throws KeeperException,InterruptedException{String path="/"+groupName+"/"+memberName;//类似于创建子目录String createPath=zk.create(path, null,Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//永久znode,若为EPHEMERAL则当前会话结束(程序运行完)会create的znode也会删除System.out.println("Created "+createPath);}public void list(String groupName)throws KeeperException,InterruptedException{String path="/"+groupName;try{List<String>children=zk.getChildren(path, false);//获取子znode列表System.out.println(children.size());if(children.isEmpty()){System.out.printf("%s中没有子znode\n",groupName);System.exit(1);}for(String child : children){System.out.println(child);}}catch (KeeperException.NoNodeException e) {// TODO: handle exceptionSystem.out.printf("%s znode不存在",groupName);System.exit(1);}}public static void main(String[]args)throws Exception{ZnodesManage cg=new ZnodesManage();cg.connect("localhost");cg.create("zoo");//创建一个znodecg.join("zoo","duck");//创建三个子znodecg.join("zoo","goat");cg.join("zoo","cow");cg.list("zoo");//列出zoo下的znodecg.close();//关闭连接}}