Работа с znodes

В данной статье описаны основные операции с ZooKeeper znodes. Все команды, упомянутые в статье, предназначены для выполнения в оболочке ZooKeeper CLI. Для запуска ZooKeeper CLI используйте скрипт /usr/lib/zookeeper/bin/zkCli.sh.

ПРИМЕЧАНИЕ

Перед выполнением последующих команд рекомендуем ознакомиться с информацией о znodes и watches.

Шаг 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.

ВАЖНО

Применяя команду get к последовательным znode, вводите их полные названия, включая 10-значный суффикс, который ZooKeeper назначил автоматически. Это правило также действует для команд set и deleteall.

[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]
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней