整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

14.2.2. 创建组

hadoop 花牛 11℃ 0评论

让我们通过写一段程序的方式来介绍ZooKeeper的Java API,这段示例程序用于创建组名为/zooznode,参见范例14-1

范例14-1.该程序在Zookeeper中新建表示组的znode

public class CreateGroup implements Watcher {
    private static final int SESSION_TIMEOUT = 5000;
    private ZooKeeper zk;
    private CountDownLatch connectedSignal = new CountDownLatch(l);
    public void connect(String hosts) throws IOExgeption, InterruptedException {
        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
        connectedSignal.await();
    }
    @Override
    public void process(WatchedEvent event) {
        // Watcher interface
        if (event.getState() == KeeperState.SyncConnected) {
            connectedSignal.countDown();
        }
    }
    public void create(String groupName) throws KeeperException, InterruptedException {
        String path = "/" + groupName;
        String createdPath = zk.create(path, null/*data*/, Ids.OPEN_ACL__UNSAFE, CreateMode.PERSISTENT);
        System.out.println("Created " + createdPath);
    }
    public void close() throws InterruptedException {
        zk.close();
    }
    public static void main(String[] args) throws Exception {
        CreateGroup createGroup = new CreateGroup();
        createGroup.connect(args[0]);
        createGroup.create(args[1]);
        createGroup.close();
    }
}

main()方法执行时,创建了一个CreateGroup的实例然后调用了这个实例的connect()方法。connect方法实例化了一个新的ZooKeeper类的对象,这个类是客户端API中的主要类,用于维护客户端和ZooKeeper服务之间的连接。ZooKeeper类的构造函数有三个参数:第一个参数是ZooKeeper服务的主机地址(可指定端口,默认端口是2181); 第二个参数是以毫秒为单位的会话超时参数(这里我们设成5),后文中将给出该参数的详细解释;第三个参数是一个Watcher对象的实例。Watcher对象接收来自于ZooKeeper的回调,以获得各种事件的通知。在这个例子中,CreateGroup是一个Watcher对象,因此我们将它传递给ZooKeeper构造函数。

当一个ZooKeeper的实例被创建时,会启动一个线程连接到ZooKeeper服务。由于对构造函数的调用是立即返回的,因此在使用新建的ZooKeeper对象前一定要等待其与ZooKeeper服务之间成功建立连接。我们使用Java的CountDownLatch(位于java.util.concurrent包中)来阻止使用新建的ZooKeeper对象,直到这个ZooKeeper对象已经准备就绪。Watcher类被用于获取ZooKeeper对象是否准备就绪的信息,在它的接口中只有一个方法:

public void process(WatchedEvent event);

当客户端已经与ZooKeeper服务建立连接后,Watcherprocess()方法会被调用,参数是一个用于表示该连接的事件。在接收到一个连接事件(Watcher.Event.KeeperState 的牧举型值 SyncConnected 来表示)时,我们通过调用CountDownLatchcountDown()方法来递减它的计数器。锁存器(latch)被创建时带有一个值为1的计数器,用于表示在它释放所有等待线程之前需要发生的事件数。在调用一次countDown()方法之后,计数器的值变为0,则await()方法返回。

现在connect()方法已经返回,下一个执行的是CreateGroupcreate()方法。在这个方法中,我们使用ZooKeeper实例中的create()方法来创建一个新的ZooKeeperznode。所需的参数包括:路径(用字符串表示)、znode的内容(字节数组,本例中使用空值)、访问控制列表(简称ACL,本例中使用了完全开放的ACL,允许任何客户端对znode进行读写)和创建znode的类型。

有两种类型的znode:短暂的(ephemeral)和持久的(persistent)。创建znode的客户端断开连接时,无论客户端是明确断开还是因为任何原因而终止,短暂znode都会被ZooKeeper服务删除。与之相反,当客户端断开连接时,持久znode不会被删除。我们希望代表一个组的znode存活的时间应当比创建程序的生命周期要长,因此在本例中我们创建了一个持久的znode

create()方法的返回值是ZooKeeper所创建的节点路径,我们用这个返回值来打印一条表示节点路径被成功创建的消息。当我们査看"顺序znode"(sequential znode)时,会发现create()方法返回的路径与传递给该方法的路径不同。

为了观察程序的执行,我们需要在本地机器上运行ZooKeeper,然后可以输入以下命令:

% export CLASSPATH=chl4/target/classes/:
$ZOOKEEPER_INSTALL/*:$ZOOKEEPER_INSTALL/lib/*:\$ZOOKEEPER-INSTALL/conf
% java CreateGroup localhost zoo
Created /zoo

转载请注明:全栈大数据 » 14.2.2. 创建组

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址