首页 > 编程知识 正文

Alex 的 Hadoop 菜鸟教程: 第9课 zookeeper 介绍和使用

时间:2023-05-06 10:12:05 阅读:28762 作者:491

原文地址: http://blog.csdn.net/ns rainbow/article/details/42836479最新课程请关注原作者博客,获得更好的显示体验

这篇文章声明了要基于Centos 6.x CDH 5.x zookeeper做什么。 查看上一个教程,您会发现hadoop自动故障恢复器在很多地方使用zookeeper,例如必须使用zookeeper,而Hbase注册服务器也必须使用zookeeper 其实不仅仅是hadoop,包括现在有名的Storm也在使用zookeeper。 zookeeper会做什么呢? ZooKeeper是一种分布式、开源的分布式APP应用程序协调服务。 ZooKeeper的目标是封装复杂、易出错的关键服务,为用户提供易于使用的界面和高效、功能稳定的系统

ZooKeeper包含一组提供Java和c接口的简单原语。

在Zookeeper中,znode是一个类似于Unix文件系统路径的节点,可以在该节点上存储或检索数据。 如果在创建znode时将Flag设置为EPHEMERAL,则创建此znode的节点和Zookeeper失去连接后,znode不再存在于Zookeeper中,并且Zookeeper使用Watcher识别事件信息当客户端收到连接超时、节点数据更改或子节点更改等事件信息时,可以调用相应的行为来处理数据。 Zookeeper的Wiki页面显示了如何使用Zookeeper处理事件通知、队列、首选队列、锁定、共享锁定、可撤销共享锁定和两级提交。

简单来说,通过在zookeeper中注册znode节点,可以完成两个操作。 对于分布式服务,可以通过zookeeper为管理节点提供桥梁。 对Hbase来说,向机智饼干添加regionserver时,不需要向master添加配置。 只要在regionserver上放置zookeeper的地址,master就会每隔几秒去一次zookeeper,自动使用是否有很多regionserver (如果有)。 主服务器和区域服务器已在zookeeper中注册。 因此,通过zookeeper也可以查看jdbc连接,以了解应该连接到哪个主节点。 zookeeper允许用户自动监视这些节点是否活着,而不是手动实现这些,因此zookeeper会询问节点是否“活着? 解决想知道”的问题。 的问题

快速开始服务器端安装,并将其安装在所有需要监视的计算机上

yum安装zookeeper-server

客户端yum install zookeeper-client配置编辑/etc/zookeeper/conf/zoo.cfg, 所有计算机上名为zoo.cfg的文件都是相同的maxclientcnxns=50 # thenumberofmillisecondsofeachtickticktime=2000 # thenumberofticksthattheininion 同步phasecantakeinitlimit=10 # thenumberofticksthatcanpassbetween # sendingarequestandgettinganacknowledgementsynng thedirectorywherethesnapshotisstored.datadir=/var/lib/zookeeeper # thepeper

tickTime的单位为毫秒,用作计算会话超时时间和心跳时间的最小单位。 这两个时间不是直接写毫秒数,而是用tickTime的倍数表示。 虽然不知道这样设计的好处在哪里,但至少用户可以通过简单地写倍数在dataDir中存储有关内存数据快照和事务的更新日志

客户端端口用于客户端的端口

在所有计算机上启动zookeeperservicezookeeper-serverstart

使用zookeeper-client进入客户端[ ZK : localhost :2181 (连接)0]

使用help命令查看是否有可用命令[ ZK : localhost :2181 (连接)0] help zookeeper-server host : portcmdargsconnecthost 3360 portgetportget ls path [ watch ] setpathdata [ version ] rmrpathdelquothdata

s] [-e] path data aclstat path [watch]close ls2 path [watch]history listquota pathsetAcl path aclgetAcl pathsync pathredo cmdnoaddauth scheme authdelete path [version]setquota -n|-b val path
我们来试试看最简单的 ls 命令 [zk: localhost:2181(CONNECTED) 1] ls /[hadoop-ha, hbase, zookeeper][zk: localhost:2181(CONNECTED) 2] ls /hadoop-ha[mycluster]

可以看到下面有三个节点,hadoop-ha 下面还有一个节点。这都是因为我之前的教程已经安装了hadoop和hbase所以会有这些节点。做到这里,我们明白了,zookeeper维持了一个类似文件夹结构的空间,在这个空间内存储的东西就是znode,znode可以有自己的子节点
创建节点
接下来,我们试试创建一个新的节点 [zk: localhost:2181(CONNECTED) 3] create /zk_test my_dataCreated /zk_test[zk: localhost:2181(CONNECTED) 4] ls /[hadoop-ha, hbase, zookeeper, zk_test]
这个zk_test 是我们要建立的节点名字,my_data 是节点的数据。 我们可以用get命令看下节点的数据
节点数据
[zk: localhost:2181(CONNECTED) 5] get /zk_testmy_datacZxid = 0x2200000019ctime = Sun Jan 18 02:30:56 PST 2015mZxid = 0x2200000019mtime = Sun Jan 18 02:30:56 PST 2015pZxid = 0x2200000019cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 7numChildren = 0
在讲解这些参数之前先介绍一下一个概念: ZooKeeper以多种方式跟踪时间 zxid:每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。版本号:对节点的每次修改将使得节点的版本号增加一。版本号有三种:version(znode数据修改的次数)、cversion(znode子节点修改的次数),以及aversion(znode的ACL修改次数)。tick:多服务器ZooKeeper中,服务器使用tick来定义状态上传、会话超时、节点间连接超时等事件的时序。tick仅被最小会话超时(2倍的tick时间)间接使用:如果客户端要求小于最小会话超时的时间,服务器将告知客户端,实际使用的是最小会话超时。真实时间:除了在创建和修改znode时将时间戳放入stat结构体中之外,ZooKeeper不使用真实时间,或者说时钟时间。 get获得的参数的意思是: czxid:创建节点的事务的zxidmzxid:对znode最近修改的zxidctime:以距离时间原点(epoch)的毫秒数表示的znode创建时间mtime:以距离时间原点(epoch)的毫秒数表示的znode最近修改时间pzxid:子节点的最后版本cversion:znode子节点修改次数dataVersion:数据的版本aclVersion:znode的ACL修改次数ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。dataLength:znode数据长度。numChildren:znode子节点个数。
修改节点
不需要完全看懂以上这些参数,我们可以试着修改一下数据再看 [zk: localhost:2181(CONNECTED) 6] set /zk_test junkcZxid = 0x2200000019ctime = Sun Jan 18 02:30:56 PST 2015mZxid = 0x220000001amtime = Sun Jan 18 02:55:35 PST 2015pZxid = 0x2200000019cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0[zk: localhost:2181(CONNECTED) 7] get /zk_testjunkcZxid = 0x2200000019ctime = Sun Jan 18 02:30:56 PST 2015mZxid = 0x220000001amtime = Sun Jan 18 02:55:35 PST 2015pZxid = 0x2200000019cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0
再对比一下之前的参数,会发现以下参数改变了 mZxid :变为另一个数据,表示最后修改的版本mtime:最后修改时间变了dataVersion:从0变成1,表示数据的版本增加了1dataLength:数据长度变化了 什么是ACL     ZooKeeper使用ACL控制对节点的访问。ACL的实现同Unix文件访问权限非常相似:采用权限位来定义允许/禁止的各种节点操作,以及位应用的范围。与标准Unix权限不同的是,ZooKeeper节点不由用户(文件所有者)、组和其他这三个标准范围来限制。ZooKeeper没有节点所有者的概念。取而代之的是,ACL指定一个ID集合,以及与这些ID相关联的权限。     还要注意的是,ACL仅仅用于某特定节点。特别是,ACL不会应用到子节点。比如说,/app只能被ip:172.16.16.1读取,/app/status可以被所有用户读取。ACL不是递归的。ZooKeeper支持可插入式鉴权模式。使用scheme:id的形式指定ID,其中scheme是id对应的鉴权模式。比如说,ip:172.16.16.1是地址为172.16.16.1的主机的ID。     客户端连接到ZooKeeper,验证自身的时候,ZooKeeper将所有对应客户端的ID都关联到客户端连接上。客户端试图存取节点的时候,ZooKeeper会在节点的ACL中校验这些ID。ACL由(scheme:expression,perms)对组成。expression的格式是特定于scheme的。比如说,(ip:19.22.0.0/16,READ)给予任何IP地址以19.22开头的客户端以READ权限。

只需要知道概念就行了,具体的使用等需要的时候再学习。
删除节点
[zk: localhost:2181(CONNECTED) 8] delete /zk_test[zk: localhost:2181(CONNECTED) 9] ls /[hadoop-ha, hbase, zookeeper]
可以看到节点被删除了
总结      其实这个教程只是让你知道了zookeeper是如何管理节点的,但是没有说明zookeeper是如何监听节点和标记节点的,因为那些有点复杂并且对我们普通开发者其实作用不太大,这些一般是 hadoop或者storm 的开发者需要考虑的问题。我们作为最终用户只需要对zookeeper是个怎样的东西,究竟是长什么样子有一个感性的认识就可以了。
参考资料 http://zookeeper.apache.org/doc/trunk/zookeeperStarted.htmlhttp://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#sc_zkDataModel_znodes
http://blog.163.com/wm_at163/blog/static/132173490201232423051163/


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。