Работа с znodes
В данной статье описаны основные операции с ZooKeeper znodes. Все команды, упомянутые в статье, предназначены для выполнения в оболочке ZooKeeper CLI. Для запуска ZooKeeper CLI используйте скрипт /usr/lib/zookeeper/bin/zkCli.sh.
Шаг 1. Создание znode
Для создания znode используйте команду create, после которой укажите полный путь к новому znode, а затем введите данные для сохранения в этом znode. Существуют следующие типы znode (при их создании могут потребоваться дополнительные флаги в команде create):
-
Постоянный (persistent). Команда
createне требует дополнительного флага (тип по умолчанию):create /z_persistent "Test configuration"Вывод:
Created /z_persistent
-
Последовательный (sequential). Используйте флаг
-sпосле ключевого словаcreate:create -s /z_sequential "Test configuration 2"ПРИМЕЧАНИЕZooKeeper добавляет 10-значный постфикс к заданному названию znode. Это изменение гарантирует уникальность названия последовательного znode.
Вывод:
Created /z_sequential0000000004
-
Эфемерный (ephemeral). Используйте флаг
-eпосле ключевого словаcreate:create -e /z_ephemeral "Test configuration 3"Вывод:
Created /z_ephemeral
Шаг 2. Получение данных znode
Для получения данных от заданного znode воспользуйтесь командой get и укажите полный путь к znode:
get /z_persistent
Вывод:
Test configuration
Чтобы увидеть не только данные, хранимые в указанном znode, но также его метаданные (stat), используйте флаг -s:
get -s /z_persistent
Вывод:
Test configuration cZxid = 0x40000000f ctime = Mon Jun 22 07:35:48 UTC 2026 mZxid = 0x40000000f mtime = Mon Jun 22 07:35:48 UTC 2026 pZxid = 0x40000000f cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 18 numChildren = 0
Ниже приведены примеры получения данных от двух других znode.
|
ВАЖНО
|
[zk: localhost:2181(CONNECTED) 0] get -s /z_sequential0000000004 Test configuration 2 cZxid = 0x400000010 ctime = Mon Jun 22 07:35:57 UTC 2026 mZxid = 0x400000010 mtime = Mon Jun 22 07:35:57 UTC 2026 pZxid = 0x400000010 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 20 numChildren = 0 [zk: localhost:2181(CONNECTED) 16] get -s /z_ephemeral Test configuration 3 cZxid = 0x40000001e ctime = Mon Jun 22 08:22:12 UTC 2026 mZxid = 0x40000001e mtime = Mon Jun 22 08:22:12 UTC 2026 pZxid = 0x40000001e cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x100000041f80008 dataLength = 20 numChildren = 0
Шаг 3. Запись данных в znode
Для обновления данных в заданном znode введите команду set, полный путь к этому znode и затем данные для сохранения:
set /z_persistent "The test configuration has been updated with the command set"
После этого команда get вернет обновленные данные из znode:
get -s /z_persistent
Вывод:
The test configuration has been updated with the command set cZxid = 0x40000000f ctime = Mon Jun 22 07:35:48 UTC 2026 mZxid = 0x40000001f mtime = Mon Jun 22 08:26:32 UTC 2026 pZxid = 0x40000000f cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 0
Шаг 4. Создание дочерних узлов znode
Для добавления дочерних узлов к определенному znode используйте стандартную команду create и укажите путь к родительскому узлу вместо корневого пути /:
create /z_persistent/child1 "Test child 1"
Приведенные ниже примеры команд создают дочерние узлы в родительском znode z_persistent:
-
Создайте первый дочерний узел:
create /z_persistent/child1 "Test child 1"Вывод:
Created /z_persistent/child1
-
Создайте второй дочерний узел:
create /z_persistent/child2 "Test child 2"Вывод:
Created /z_persistent/child2
Шаг 5. Получение дочерних узлов znode
Чтобы получить список дочерних узлов для определенного znode, введите команду ls и после нее укажите полный путь к родительскому znode:
ls /z_persistent
Вывод:
[child2, child1]
Для получения дочерних znode корневого узла используйте путь /:
ls /
Полученный список:
[arenadata, hadoop-ha, z_ephemeral, z_persistent, z_sequential0000000004, zookeeper]
Кроме того, можно использовать флаг -s для получения не только списка дочерних узлов заданного znode, но также и его метаданных:
ls -s /
Вывод:
[arenadata, hadoop-ha, z_persistent, z_sequential0000000004, zookeeper] cZxid = 0x0 ctime = Thu Jan 01 00:00:00 UTC 1970 mZxid = 0x0 mtime = Thu Jan 01 00:00:00 UTC 1970 pZxid = 0x400000023 cversion = 9 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 5
Шаг 6. Получение метаданных znode
Для получения метаданных заданного znode, входящих в структуру stat, введите команду stat и полный путь к этому znode. В отличие от команды get -s, вывод содержит метаданные, но не сами данные:
stat /z_persistent
Результат выполнения команды для znode, созданных на предыдущих шагах, показан ниже:
[zk: localhost:2181(CONNECTED) 37] stat /z_persistent cZxid = 0x40000000f ctime = Mon Jun 22 07:35:48 UTC 2026 mZxid = 0x40000001f mtime = Mon Jun 22 08:26:32 UTC 2026 pZxid = 0x400000021 cversion = 2 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 2 [zk: localhost:2181(CONNECTED) 38] stat /z_sequential0000000004 cZxid = 0x400000010 ctime = Mon Jun 22 07:35:57 UTC 2026 mZxid = 0x400000010 mtime = Mon Jun 22 07:35:57 UTC 2026 pZxid = 0x400000010 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 20 numChildren = 0 [zk: localhost:2181(CONNECTED) 39] stat /z_ephemeral cZxid = 0x400000024 ctime = Mon Jun 22 08:49:41 UTC 2026 mZxid = 0x400000024 mtime = Mon Jun 22 08:49:41 UTC 2026 pZxid = 0x400000024 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x100000041f80009 dataLength = 20 numChildren = 0
Шаг 7. Отслеживание изменений в znode
Средства наблюдения в ZooKeeper (watch) позволяют клиенту получать уведомления об изменениях в наблюдаемых znode.
Для добавления watch используйте флаг -w с командами get, stat и ls.
Примеры создания объекта watch:
get -w /z_persistent (1)
stat -w /z_persistent (2)
ls -w /z_persistent (3)
| 1 | Создание watch для отслеживания данных znode. |
| 2 | Создание watch для отслеживания метаданных znode. |
| 3 | Создание watch для отслеживания изменений в дочерних узлах znode. |
|
ПРИМЕЧАНИЕ
Объект watch в ZooKeeper срабатывает только один раз. При изменении данных в znode соответствующий объект watch генерирует уведомление и удаляется. Чтобы получать уведомления о последующих обновлениях znode, необходимо создать новый объект watch. |
При установке наблюдателя watch вывод такой же, как и при обычном вызове команды, например:
[zk: localhost:2181(CONNECTED) 2] get /z_persistent -w The test configuration has been updated with the command set
Теперь измените данные в znode с помощью команды set:
set /z_persistent "Updated"
ZooKeeper возвращает не только обычный вывод команды, но также уведомление, сообщающее клиенту о произошедшем изменении в наблюдаемом znode:
WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/z_persistent
Шаг 8. Удаление znode
Для окончательного удаления znode введите команду deleteall и укажите путь к znode:
deleteall /z_persistent
После выполнения команды znode и все дочерние узлы более недоступны:
[zk: localhost:2181(CONNECTED) 5] get /z_persistent Node does not exist: /z_persistent [zk: localhost:2181(CONNECTED) 6] get /z_persistent/child1 Node does not exist: /z_persistent/child1
В завершение проверьте автоматическое удаление эфемерных узлов при закрытии соединения с клиентом. Для этого прервите текущую сессию с помощью команды quit и откройте новую сессию с помощью скрипта zkCli.sh. После этого командой ls / проверьте список дочерних узлов корневого znode. Вы получите следующий результат:
-
Постоянный znode
/z_persistentотсутствует, так как был удален ранее. -
Последовательный znode
/z_sequential0000000004доступен. -
Эфемерный znode
/z_ephemeralудален автоматически.
ls /
Вывод:
[arenadata, hadoop-ha, z_sequential0000000004, zookeeper]