整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

14.3 ZooKeeper 服务 14.3.1数据模型

hadoop 花牛 11℃ 0评论

ZooKeeper是一个具有髙可用性的高性能协调服务。在本节中,我们将从三个方面来了解这个服务:模型、操作和实现。

ZooKeeper维护着一个树形层次结构,树中的节点被称为znodeznode可以用于存储数据,并且有一个与之相关联的ACLZooKeeper被设计用来实现协调服务(这类服务通常使用小数据文件),而不是用于大容量数据存储,因此一个znode能存储的数据被限制在1MB以内。

ZooKeeper的数据访问具有原子性。客户端在读取一个zonde的数据时,要么读到所有的数据,要么读操作失败,不会只读到部分数据。同样,一个写操作将替换znode存储的所有数据。ZooKeeper会保证写操作不成功就失败,不会出现部分写之类的情况,也就是不会出现只保存客户端所写部分数据的情况。ZooKeeper不支持添加操作。这些特征都是与HDFS所不同的。HDFS被设计用于大容量数据存储,支持流式数据访问和添加操作。

znode通过路径被引用。像Unix中的文件系统路径一样,在ZooKeeper中路径被表示成用斜杠分隔的Unicode字符串。与Unix中的文件系统路径不 同的是,ZooKeeper中的路径必须是绝对路径,也就是说每条路径必须从一个斜杠字符开始。此外,所有的路径表示必须是规范的,即每条路径只有唯一的一种表示方式,不支持路径解析。例如,在Unix中,一个具有路径 /a/b的文件也可以通过路径/a/./b来表示,原因在于在Unix的路径中表示当前目录表示当前目录的—级目录)。在ZooKeeper中,

不具有这种特殊含义,这样表未的路径名是不合法的。

ZooKeepei中,路径由Unicode字符串构成,并且有一些限制(见 ZooKeeper的参考文档)。字符串“zookeeper”是一个保留词,不能将它作为路径表示中的一部分。需要特别指出的是,ZooKeeper使用/zooAeeper子树来保存管理信息,例如关于配额的信息。

注意,ZooKeeper的路径与URI不同,前者在Java API中通过java.lang.String来使用,而后者是通过 Hadoop Path 类(或 java.net.URI类)来使用。 

znode有一些性质非常适合用于构建分布式应用,我们将在接下来的几个小节中进行讨论。

1.短暂 znode

znode有两种类型:短暂的和持久的。znode的类型在创建时被确定并且之后不能再修改。在创建短暂znode的客户端会话结束时,ZooKeeper会将该短暂znode删除。相比之下,持久znode不依赖于客户端会话,只有当客户端(不一定是创建它的那个客户端)明确要删除该持久znode时才会被删除。

短暂znode不可以有子节点,即使是短暂子节点。 虽然每个短暂znode都会被绑定到一个客户端会话,但它们对所有的客户端还是可见的(当然,还是要符合其ACL的定义)。

对于那些需要知道特定时刻有哪些分布式资源可用的应用来说,使用短暂znode是一种理想的选择。本章前面的例子就使用了短暂znode来实现一个组成员管理服务,让任何进程都知道在特定的时刻有哪些组成员可用。

2.顺序号

顺序(sequentia丨)znode是指名称中包含ZooKeeper指定顺序号的znode。如果在创建znode时设置了顺序标识,那么该Mode名称之后便会附加一个值,这个值是由一个单调递增的计数器(由父节点维护)所添加的。

例如,如果一个客户端请求创建一个名为/a/b-的顺序znode,则所创建znode的名字可能是/a/b-3。®如果稍后,另外一个名为/a/b-的顺序znode被创建,计数器会给出一个更大的值来保证znode名称的唯一性,例如,/a/b-5.在JavaAPI中,顺序znode的实际路径会作为create()调用的返回值被传回客户端。

在一个分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端就可以通过顺序号来推断事件的顺序。14.4.3节介绍了如何使用顺序znode来实现共享锁。

3.观察

znode以某种方式发生变化时,“观察”(watch)机制可以让客户端得到通知。可以针对ZooKeeper服务的操作来设置观察,该服务的其他操作可以触发观察。例如,客户端可以对一个znode调用exists操作,同时设定一个观察。如果这个znode不存在,则客户端所调用的exists操作将返回false。如果一段时间之后,另外一个客户端创建了这个znode,则这个观察会被触发,通知前一个客户端这个znode被创建。在下一小节中,将完整介绍哪些操作会触发其他操作。

观察只能被触发一次。为了能够多次收到通知,客户端需要重新注册所需的观察。在前面的例子中,如果客户端希望收到更多znode是否存在的通知(例如在这个znode被删除时也能收到通知),则需要再次调用exists操作来设定一个新的观察。

14.4.1节中,将有一个例子来演示如何使用观察来更新集群的配置。

转载请注明:全栈大数据 » 14.3 ZooKeeper 服务 14.3.1数据模型

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址