大数据技术之Zookeeper客户端命令行操作、节点类型、监听器原理(3)

目录

命令行语法

启动Zookeeper客户端

显示所有操作命令

查看当前znode中所包含的内容

查看当前节点详细数据

解释字段含义:

Zookeeper节点类型 

持久节点 (Persistent):

临时节点 (Ephemeral):

持久顺序节点 (Persistent Sequential):

临时顺序节点 (Ephemeral Sequential):

容器节点 (Container):

监听机制 (Watcher):

创建两个普通节点(持久节点 + 不带序号)

获得节点的值

创建带序号的节点(持久节点 + 带序号)

创建短暂节点(短暂节点 + 不带序号 or 带序号)

修改节点数据值

监听器原理

监听器原理流程

常见的监听

监听器示例

1. 节点的值变化监听

2. 节点的子节点变化监听(路径变化)

3. 节点删除与查看


命令行语法

命令说明示例
create创建一个节点,并设置其值create /path "initial value"
get获取指定路径下的节点数据和状态get /path
set设置指定路径下节点的数据set /path "new value"
ls列出指定路径下的所有子节点ls /path
delete删除指定路径下的节点delete /path
rmr递归删除指定路径下的所有子节点及自身rmr /path
stat显示指定节点的状态信息stat /path
close关闭客户端会话close
versions显示指定节点的版本号(Zookeeper 3.4.6 及以上支持)versions /path
wch订阅一个节点的watcher事件wch /path
uwch取消订阅一个节点的watcher事件uwch /path
cons显示客户端连接状态cons
conf获取或设置客户端的会话超时时间(毫秒)conf [timeout]

启动Zookeeper客户端

[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkCli.sh -server hadoop12:2181

显示所有操作命令

[zk: hadoop12:2181(CONNECTED) 1] help

查看当前znode中所包含的内容

[zk: hadoop12:2181(CONNECTED) 0] ls /
[zookeeper]

查看当前节点详细数据

[zk: hadoop12:2181(CONNECTED) 5] ls -s /
[zookeeper] 
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
解释字段含义:
  1. czxid: 创建节点的事务 zxid

    每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改的总次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
  2. ctime: znode 被创建的毫秒数(从 1970 年开始)

  3. mzxid: znode 最后更新的事务 zxid

  4. mtime: znode 最后修改的毫秒数(从 1970 年开始)

  5. pZxid: znode 最后更新的子节点 zxid

  6. cversion: znode 子节点变化号,znode 子节点修改次数

  7. dataversion: znode 数据变化号

  8. aclVersion: znode 访问控制列表的变化号

  9. ephemeralOwner: 如果是临时节点,这是 znode 拥有者的 session id。如果不是临时节点则是 0。

  10. dataLength: znode 的数据长度

  11. numChildren: znode 子节点数量

Zookeeper节点类型 

Zookeeper提供了几种不同类型的节点(称为znode),每种类型的节点都有其特定的行为和用途。下面是Zookeeper中节点类型的概述:

持久节点 (Persistent):

  • 当创建一个持久节点时,它会一直存在于Zookeeper中,直到被显式地删除。
  • 即使客户端与Zookeeper服务器断开连接,该节点也不会被删除。

临时节点 (Ephemeral):

  • 临时节点的存在依赖于创建它的客户端会话。
  • 如果客户端会话结束(例如客户端崩溃或主动关闭连接),临时节点将被自动删除。
  • 临时节点不能有子节点。

持久顺序节点 (Persistent Sequential):

  • 这种类型的节点是持久节点的一种变体,但它在创建时会在节点名称后自动添加一个递增的数字序号。
  • 序号是由父节点维护的一个单调递增的计数器。
  • 节点创建后,即使客户端与Zookeeper服务器断开连接,该节点仍然存在,除非被显式删除。

临时顺序节点 (Ephemeral Sequential):

  • 这种类型的节点结合了临时节点和持久顺序节点的特点。
  • 在创建时,节点名称后会自动添加一个递增的数字序号。
  • 如果客户端会话结束,该节点将被自动删除。

除了这些基本类型之外,还有一些额外的概念需要注意:

容器节点 (Container):

这是一种特殊类型的节点,主要用于装载子节点。当容器节点下面没有子节点时,该节点未来会被Zookeeper自动清除。

监听机制 (Watcher):

Zookeeper允许客户端注册监听器(watcher),以监控节点的变化。监听器可以针对节点的数据更改、子节点的添加或删除等事件进行注册。

创建两个普通节点(持久节点 + 不带序号)

[zk: localhost:2181(CONNECTED) 3] create /sanguo "diaochan"
Created /sanguo
​
[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei"
Created /sanguo/shuguo

获得节点的值

[zk: localhost:2181(CONNECTED) 5] get -s /sanguo
diaochan
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000003
mtime = Wed Aug 29 00:03:23 CST 2018
pZxid = 0x100000004
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
​
[zk: localhost:2181(CONNECTED) 6] get -s /sanguo/shuguo
liubei
cZxid = 0x100000004
ctime = Wed Aug 29 00:04:35 CST 2018
mZxid = 0x100000004
mtime = Wed Aug 29 00:04:35 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

创建带序号的节点(持久节点 + 带序号)

先创建一个普通的根节点 /sanguo/weiguo

[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"
Created /sanguo/weiguo

创建带序号的节点

[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000000
​
[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/zhangliao "zhangliao"
Created /sanguo/weiguo/zhangliao0000000001
​
[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/xuchu "xuchu"
Created /sanguo/weiguo/xuchu0000000002

创建短暂节点(短暂节点 + 不带序号 or 带序号)

创建短暂的不带序号的节点

[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo

创建短暂的带序号的节点

[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo

在当前客户端是能查看到的

[zk: localhost:2181(CONNECTED) 3] ls /sanguo
[wuguo, wuguo0000000001, shuguo]

退出当前客户端然后再重启客户端

[zk: localhost:2181(CONNECTED) 12] quit

再次查看根目录下短暂节点已经删除

[zk: localhost:2181(CONNECTED) 0] ls /sanguo
[shuguo]

修改节点数据值

[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"

监听器原理

Zookeeper 提供了一种机制,允许客户端注册监听器以跟踪感兴趣的目录节点的变化。当目录节点发生变化(如数据改变、节点删除或子节点的增加或删除)时,Zookeeper 会通知客户端。这种监听机制确保了 Zookeeper 保存的任何数据的任何改变都能快速响应到监听了该节点的应用程序。

监听器原理流程

  1. Main()线程
  2. 创建Zookeeper客户端
    1. 创建两个线程:一个负责网络连接通信(connect),一个负责监听(listener)。
  3. 通过connect线程将注册的监听事件发送给Zookeeper。
  4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
  5. Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
  6. listener线程内部调用了process()方法。

常见的监听

监听节点数据的变化

get path [watch]

监听子节点增减的变化

ls path [watch]

监听器示例

1. 节点的值变化监听

在 hadoop14 主机上注册监听 /sanguo 节点数据变化

[zk: localhost:2181(CONNECTED) 26] get -w /sanguo

在 hadoop13 主机上修改 /sanguo 节点的数据

[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"

观察 hadoop14 主机收到数据变化的监听

WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo

注意:在 hadoop13 再多次修改 /sanguo 的值,hadoop14 上不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。

2. 节点的子节点变化监听(路径变化)

在 hadoop14 主机上注册监听 /sanguo 节点的子节点变化

[zk: localhost:2181(CONNECTED) 1] ls -w /sanguo
[shuguo, weiguo]

在 hadoop13 主机 /sanguo 节点上创建子节点 

[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"
Created /sanguo/jin

观察 hadoop14 主机收到子节点变化的监听 

WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo

注意:节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。

3. 节点删除与查看

删除节点

[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin

递归删除节点

​​​​​​​[zk: localhost:2181(CONNECTED) 15] deleteall /sanguo/shuguo

查看节点状态 

[zk: localhost:2181(CONNECTED) 17] stat /sanguo
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000011
mtime = Wed Aug 29 00:21:23 CST 2018
pZxid = 0x100000014
cversion = 9
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1

  • 30
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值