您的位置:首页 > 运维架构

Hadoop学习笔记 ZooKeeper

2012-06-21 18:06 405 查看
Zookeeper是Hadoop的分布式协调服务。

Zookeeper是简单的,它的核心是一个精简的文件系统,它提供一些简单的操作和额外的抽象操作,如排序和通知。

Zookeeper表现力足够强,它的原语操作是一组丰富的构件,可用于实现很多协调数据结构和协议。如分布式队列,分布式锁和一组同级别的领导者选举等。

Zookeeper具有高可用性,它运行在一组机器之上,并且在设计上具有高可用性,可以帮助系统避免单点故障。

Zookeeper采用松耦合交互方式,参与者不需要彼此了解。

Zookeeper是一个资源库,它提供了一个关于通用协调模式实现和方法的开源共享存储库,能使程序员免于编写这类通用的协议。

Zookeeper也是高性能的,对于以写为主的基准吞吐量,已经超过 10000 ops,以读为主的话还要高好几倍。

Zookeeper可以被看成高可用的文件系统,但它没有文件和目录,因此可以看成一个由节点组成的目录树,节点统一称为znode,最多可以存储1M的内容。Znode的读写操作都是原语操作,即读写都是全部读或全部写,不存在读一部分和写一部分的操作,当然,也不能追加内容。因此,Zookeeper还有个组的概念,可以以组名命名父节点,成员作为子节点。

一个简单的例子:

public class CreateGroup implements Watcher {

private static final int SESSION_TIMEOUT = 5000;

private ZooKeeper zk;

private CountDownLatch connectedSignal = new CountDownLatch(1);

public void connect(String hosts) throws IOException, 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();

}

}

主要需要理解的一个是 Watcher接口,一个是connectedSignal。

Watcher对象主要接收Zookeeper的回调,以 获得各种事件的通知。它接口中只有一个方法,process(WatchedEvent event),根据event的可以做处理。

当一个Zookeeper实例被创建时,会启动一个线程连接到Zookeeper服务。由于构造函数是立即返回,因此使用新建的实例之前,要确保Zookeeper之间的连接已经建立。这时需要使用一个CountDownLatch类来完成这个工作。关于CountDownLatch的使用,可以参考这篇文章:浅析Java中CountDownLatch用法

Znode以某种方式变化时,观察机制可以让客户端得到通知。因此,可以在读操作如 exists/getChildren/getData上设置观察,写操作create/delete和setData会触发观察器,产生一个观察事件。

Zookeeper客户端API

Zookeeper提供两种API:同步执行的和异步执行的。

同步的直接返回Stat

public Stat exists(String path, Watcher watcher) throws KeeperException, InterruptedException

Stat是包含该znode元数据的对象。

异步接口使用回调实现:

public void exists(String path, Watcher watcher, StatCallback cb, Object ctx)

StatCallback接口有以下方法:

public void processResult(int rc, String path, Object ctx, Stat stat);

其中,rc参数是返回代码,对应KeeperException的代码,每个非零代码都代表一个异常。

异步API允许你一流线方式处理请求,这在某些情况下可以提供更好的吞吐量。对于以事件驱动模型编程来说,异步也更适合。

ACL

每个znode被创建时,都会带一个ACL列表,用于决定谁可以对他执行何种操作。ACL依赖于客户端的身份验证机制。Zookeeper提供三种身份验证模式:

Digest:用户名和密码

Host:主机名

IP:ip地址

每个ACL都是身份验证模式,符合该模式的身份和一组权限的组合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: