Zookeeper是动物管理员吗

背景

熟悉Hadoop的同学肯定听过这么一句话:“Zookeeper是动物管理员,管着大象(Hadoop)、蜜蜂(Hive)和小猪(Pig)”。刚开始接触到的时候感觉,哇,Zookeeper好厉害啊,都可以管理Hadoop、Hive、Pig了。但后面接触到Hive和Pig的时候,发现他们好像只跟MapReduce有关系啊,因此,我不禁有了以下的疑问。博客原文地址Zookeeper是动物管理员吗

Zookeeper到底是不是动物管理员?

这个问题的答案可以从Zookeeper的的官网标志图初探端倪。

Zookeeper slogan

由上图,Zookeeper是一个穿着工装,拿着铁锹的工人啊,这不符合管理员的形象吧,管理员不应该是西装革履的吗?好吧,有些牵强,那我们来看看keeper这个词的翻译,使用百度在线翻译的结果如下:

门将是什么鬼? 还好下面还有翻译,饲养员、保管人、负责人、监护人。这几个词好像都跟管理员有一些差距,有了初步的认识后,是时候深入Zookeeper的原理来进行分析了。

基本概念

这里我只做简单的介绍,更加详细的内容可以参看最后的参考博客。

角色

Zookeeper中的角色主要分类如下表

zookeeper roles

集群模型如下:

zookeeper service

结合角色说明表格和上图进行说明,Hadoop中使用Zookeeper的组件如YARN和HBase,都是上图中的client,client通过与server进行连接获取Zookeeper server的服务。那么通过什么方式连接呢?

会话(session)

会话记录client与server的连接,client不需要连接所有的server,只需要连接其中一个就可以获得一致性的读写服务。session对应到两种连接方式:心跳连接和watcher监听。

数据节点

上一节中说的一致性读写服务所操作的对象就是数据节点。Zookeeper的数据模型如下图:

image

ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每个ZNode都可以通过其路径唯一标识,图中每个节点左侧即为其路径唯一标识。

注:
这里的ZNode可以理解成既是Unix里的文件,又是Unix里的目录。因为每个ZNode不仅本身可以写数据(相当于Unix里的文件),还可以有下一级文件或目录(相当于Unix里的目录)。

在ZooKeeper中,ZNode可以分为持久节点和临时节点两类。

持久节点

所谓持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNode将一直保存在ZooKeeper上。

临时节点

临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。

Watcher

Watcher(事件监听器),是ZooKeeper中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。该机制是ZooKeeper实现分布式协调服务的重要特性。

管理者 or 协调者

通过Zookeeper的数据节点(临时节点特性)和watcher的组合,可以满足诸如服务发布/订阅、命名服务、master选举、分布式锁等功能。而Zookeeper之所以是keeper而不是manager,正是因为它在Hadoop生态中的两大功能是选举和元数据存储,才使得它有了分布式协调者的称号。

元数据指的是配置信息、服务注册列表等,这使得Zookeeper更像是一个分布式的注册表。当client需要使用Zookeeper时,如HBase Master需要选举一个主节点,那么他们就并发的去Zookeeper上创建一个临时节点(节点名称一样),Zookeeper的分布式锁可以保证只有一个client创建成功,最后创建成功的那个节点,就当选为主节点。

Zookeeper在Hadoop中的应用是HDFS和YARN的HA,在HBase中的应用有选举与主备切换、系统容错(RegionServer挂掉后,HMaster获知)、Region状态信息的管理。下面我们来看一下Zookeeper是如何让HMaster获知RegionServer挂掉的信息的。

当HBase启动时,每个RegionServer都会到ZooKeeper的/hbase/rs节点下创建一个信息节点(临时节点,下文中,我们称该节点为”rs状态节点”),例如/hbase/rs/[Hostname],同时,HMaster会对这个节点注册监听。当某个 RegionServer 挂掉的时候,ZooKeeper会因为在一段时间内无法接受其心跳(即 Session 失效),而删除掉该 RegionServer 服务器对应的 rs 状态节点。与此同时,HMaster 则会接收到 ZooKeeper 的 NodeDelete 通知,从而感知到某个节点断开,并立即开始容错工作。也就是说,Zookeeper是通过心跳机制来维护临时节点信息的,如果心跳发生了timeout,则Zookeeper删除该临时节点,然后通知注册过该临时节点监听的HMaster,所以Zookeeper默认临时节点删除后,该RegionServer处于无法工作状态,至于是网络延时原因还是该RegionServer确实挂掉了,Zookeeper不管。

结论

Zookeeper在Hadoop生态中十分重要,但它并没有上升到管理员的高度,Hadoop中使用Zookeeper服务的组件都有自己的master(NameNode、ResourManager、HMaster),各组件视自己的需求,交付给Zookeeper不同程度的权力。NameNode在实现HA的时候,需要用到Zookeeper的选举和watcher功能,因此交付给Zookeeper两个NameNode,让它来决定谁为Active;YARN的HA也是如此。HMaster交给Zookeeper的权力比较大,HMaster选举与主备切换、系统容错、RootRegion管理、Region状态管理和分布式SplitWAL任务管理等都交给了Zookeeper,让Zookeeper来管理HMaster的主备以及RegionServer信息等。Zookeeper相当于是古代的丞相,皇帝(NameNode、HMaster)给它多少权力,它就执行多大的功能。或许有一天,Zookeeper会成为Hadoop生态的“管仲”、“商鞅”,而那一天会不会实现,就要看Hadoop生态的发展了。。。

参考博客