一、zookeeper在其它组件的作用
1.为什么会产生zookeeper
zookeeper是模仿的谷歌的Chubby来解决分布式一致性的问题。2006年的时候Google出了Chubby,2009年3年以后Yahoo在Apache上推出了类似的产品ZooKeeper.
ZooKeeper跟Chubby一样用来存放一些相互协作的信息(Coordination),这些信息比较小一般不会超过1M,在zookeeper中是以一种hierarchical tree的形式来存放,这些具体的Key/Value信息就store在tree node中。当有事件导致node数据,例如:变更,增加,删除时,Zookeeper就会调用 triggerWatch方法,判断当前的path来是否有对应的监听者(watcher),如果有watcher,会触发其process方法,执行process方法中的业务逻辑.
2.zookeeper的应用
zookeeper在kafka的作用
kafka将zookeeper做小型数据库这里我们进入zookeeper看下保存的kafka的相关信息
通过
zkCli.sh
上面命令,自动连接本地或则通过下面命令
zkCli.shzkCli.sh-server master:2181
指定服务器连接master。
进入后,我们通过下面命令
ls /
查看里面的存储内容
[zk: localhost:2181(CONNECTED) 1] ls / [controller_epoch, controller, brokers, zookeeper, admin, isr_change_notification, consumers, config]
[zk: localhost:2181(CONNECTED) 2] ls /brokers/ids
命令为
ls /brokers/ids
zookeeper在hbase中的作用:
1.选举
我们知道hbase通过zookeeper选举master,也就是说zookeeper提高了hbase集群的稳定性。换句话说,没有zookeeper,hbase稳定性大大降低,甚至不能启动。
2.存储
详解:
hbase在启动的时候,hmaster启动时候会将hbase 系统表-ROOT- 加载到 zookeeper cluster,通过zookeeper cluster可以获取当前系统表.META.的存储所对应的regionserver信息。
HBase中的znode
/hbase是集群的根znode,ZookeeperWatcher初始化时创建.
还有诸如/hbase/root-region-server,/hbase/master,大家可以在创建zookeeper后,进入zookeeper查看
Zookeeper在storm充当的作用
Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeeper上面写状态信息来分配任务,
supervisor,task通过从zookeeper中读状态来领取任务,同时supervisor, task也会定义发送心跳信息到zookeeper,
使得nimbus可以监控整个storm集群的状态,从而可以重启一些挂掉的task。
ZooKeeper 使得整个storm集群十分的健壮,任何一台工作机器挂掉都没有关系,只要重启然后从zookeeper上面重新获取状态信息就可以了。
下面一张图,说明了zookeeper的作用:保存了集群操作的状态
storm有哪些目录,这里简单列出来
Strom在Zookeeper中的目录结构
/assignments -> 任务分配信息
/storms -> 正在运行的topology的ID
/supervisors -> 所有的Supervisors的心跳信息
/workerbeats -> 所有的Worker的心跳
/errors -> 产生的出错信息
更多可以网上查询。
二、zookeeper与hdfs对比
上文看到zookeeper在其它大数据组件中的作用。如果我们初学,应该也知道,zookeeper在很多地方用到。那么zookeeper与hdfs有哪些异同。
1.二者都是分布式存储
1.zookeeper可以在多台机器存储数据,hdfs同样也是。如下为ZooKeeper数据模型的结构
可以看作是一棵树,每个节点称做一个ZNode
2.zookeeper一般存储小量数据,zookeeper一般以K,M为单位。hdfs则是存储大数据,以G,T,P等为单位。
2.shell命令相似之处
进入zookeeper
zkCli.sh
或则指定server
zkCli.sh -server master:2181
master为hostname。
进入hdfs
bin/start-dfs.sh
进入之后,二者都可以进行shell操作,二者操作有一些相似之处。比如
查看文件都是用
ls /
对于zookeeper,和hdfs都是一样的。
查看路径相关信息stat
hdfs dfs -stat /home/hadoop/input
输出:
2017-05-11 16:00:27
Exit Code:
Returns 0 on success and -1 on error.
stat /c/hfx/sw1
输出:
cZxid = 0x2000007df
ctime = Thu Mar 14 11:08:28 CST 2013
mZxid = 0x200000a87
mtime = Thu Mar 14 15:00:34 CST 2013
pZxid = 0x2000007df
cversion = 0
dataVersion = 608
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
要地说明cZxid表示创建该节点时候的zxid,mZxid表示当前的,zxid是用来为选举leader服务的
例如还有get命令,二者皆有。当然也有不同的地方,更多可查看
ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作
3.都有相关api
有了api,我们就可以按照自己的想法编程。很多初学者由于没有认识到这个问题,所以会有“部署hbase,不安装zookeeper是否可以,部署storm,不安装zookeeper是否可以”。这样肯定是不可以的。因为hbase,storm,kafka中都使用了zookeeper相关api,来完成它们各自的事情。如果不理解,可以查看第一篇:zookeeper思考与总结1:zookeeper在其它组件的作用
相关api,这里以storm为例:cluster.clj文件中,有关于storm操作zookeeper的主要函数.文件位置在
apache-storm-1.1.0-src\apache-storm-1.1.0\storm-core\src\clj\org\apache\storm
文件中函数主要定义在命名空间backtype.storm.cluster.
backtype.storm.cluster定义了两个重要protocol:ClusterState和StormClusterState。clojure中的protocol可以看成java中的接口,封装了一组方法。ClusterState协议中封装了一组与zookeeper进行交互的基础函数,如获取子节点函数,获取子节点数据函数等,ClusterState协议定义如下:
(defprotocol ClusterState (set-ephemeral-node [this path data]) (delete-node [this path]) (create-sequential [this path data]) ;; if node does not exist, create persistent with this data (set-data [this path data]) (get-data [this path watch?]) (get-version [this path watch?]) (get-data-with-version [this path watch?]) (get-children [this path watch?]) (mkdirs [this path]) (close [this]) (register [this callback]) (unregister [this id]))
StormClusterState协议封装了一组storm与zookeeper进行交互的函数,可以将StormClusterState协议中的函数看成ClusterState协议中函数的"组合"。