Hadoop ZooKeeper 学习

来源:互联网 发布:centos 7.2怎么样 编辑:程序博客网 时间:2024/05/18 01:31
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();}@Overridepublic void process(WatchedEvent event) { // Watcher interfaceif (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都是身份验证模式,符合该模式的身份和一组权限的组合。