一、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的相关信息 通过
[Bash shell] 纯文本查看 复制代码
zkCli.sh
上面命令,自动连接本地或则通过下面命令
[Bash shell] 纯文本查看 复制代码
zkCli.sh -server master:2181
指定服务器连接master。 进入后,我们通过下面命令
[Bash shell] 纯文本查看 复制代码
ls /
查看里面的存储内容
[Bash shell] 纯文本查看 复制代码
[zk: localhost:2181(CONNECTED) 1] ls /
[controller_epoch, controller, brokers, zookeeper, admin, isr_change_notification, consumers, config]
[Bash shell] 纯文本查看 复制代码
[zk: localhost:2181(CONNECTED) 2] ls /brokers/ids
命令为
[Bash shell] 纯文本查看 复制代码
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
[Bash shell] 纯文本查看 复制代码
zkCli.sh
或则指定server
[Bash shell] 纯文本查看 复制代码
zkCli.sh -server master:2181
master为hostname。 进入hdfs
[Bash shell] 纯文本查看 复制代码
bin/start-dfs.sh
进入之后,二者都可以进行shell操作,二者操作有一些相似之处。比如 查看文件都是用
[Bash shell] 纯文本查看 复制代码
ls /
对于zookeeper,和hdfs都是一样的。 查看路径相关信息stat
[Bash shell] 纯文本查看 复制代码
hdfs dfs -stat /home/hadoop/input
输出: 2017-05-11 16:00:27 Exit Code: Returns 0 on success and -1 on error.
[Bash shell] 纯文本查看 复制代码
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命令,二者皆有。当然也有不同的地方,更多可查看 HDFS的常用操作--hdfs下的文件操作常用命令总结 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协议定义如下: ClusterState协议
[Bash shell] 纯文本查看 复制代码
(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协议中函数的"组合"。