Работа с znodes

ПРИМЕЧАНИЕ

Перед выполнением последующих команд рекомендуем ознакомиться с информацией о 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_sequential0000000007
  • Эфемерный (ephemeral). Используйте флаг -e после ключевого слова create:

    create -e /z_ephemeral "Test configuration 3"

    Вывод на экран:

    Created /z_ephemeral

Шаг 2. Получение данных znode

Для получения данных от заданного znode воспользуйтесь командой get и укажите полный путь к znode:

get /z_persistent

Вывод на экран содержит не только данные, хранимые в указанном znode, но также его метаданные из структуры stat:

Test configuration
cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x2000000019
mtime = Wed Dec 15 11:15:27 UTC 2021
pZxid = 0x2000000019
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 18
numChildren = 0

Ниже приведены примеры получения данных от двух других znodes.

ВАЖНО

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

[zk: localhost:2181(CONNECTED) 7]get /z_sequential0000000007
Test configuration 2
cZxid = 0x200000001c
ctime = Wed Dec 15 11:17:47 UTC 2021
mZxid = 0x200000001c
mtime = Wed Dec 15 11:17:47 UTC 2021
pZxid = 0x200000001c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
[zk: localhost:2181(CONNECTED) 8]get /z_ephemeral
Test configuration 3
cZxid = 0x200000001d
ctime = Wed Dec 15 11:18:35 UTC 2021
mZxid = 0x200000001d
mtime = Wed Dec 15 11:18:35 UTC 2021
pZxid = 0x200000001d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100005560090006
dataLength = 20
numChildren = 0
ПРИМЕЧАНИЕ
Начиная с версии ZooKeeper 3.5 команда get /znode не выводит данные о znode для нод-контейнеров. В этом случае используйте команду get -s /znode.

Шаг 3. Запись данных в znode

Для обновления данных в заданном znode введите команду set, полный путь к этому znode и затем данные для сохранения:

set /z_persistent "The test configuration has been updated with the command set"

Пример вывода:

cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x200000001e
mtime = Wed Dec 15 11:24:46 UTC 2021
pZxid = 0x2000000019
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 60
numChildren = 0

После этого команда get вернет обновленные данные из znode:

get /z_persistent

Вывод на экран:

The test configuration has been updated with the command set
cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x200000001e
mtime = Wed Dec 15 11:24:46 UTC 2021
pZxid = 0x2000000020
cversion = 2
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 60
numChildren = 2

Шаг 4. Создание дочерних узлов znode

Для добавления дочерних узлов к определенному znode используйте стандартную команду create и задайте путь к родительскому узлу вместо корневого пути /:

create /z_persistent/child1 "Test child 1"

Приведенные ниже примеры команд создают дочерние узлы в родительском узле 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]

Для получения списка дочерних узлов корневого узла используйте путь /:

ls /

Полученный список:

[zookeeper, Arenadata.Hadoop-1.solr.server, z_sequential0000000007, hadoop-ha, z_ephemeral, hbase, z_persistent]

Кроме того, можно использовать команду ls2 для получения не только списка дочерних узлов заданного znode, но также и его метаданных.

ls2 /

Вывод на экран:

[zookeeper, Arenadata.Hadoop-1.solr.server, hadoop-ha, z_ephemeral, z_sequential0000000007, hbase, z_persistent]
cZxid = 0x0
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x2000000030
cversion = 17
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 7

Шаг 6. Получение метаданных znode

Для получения метаданных заданного znode, входящих в структуру stat, введите команду stat и полный путь к этому znode. В отличие от команды get, вывод содержит метаданные, но не сами данные:

stat /z_persistent

Вывод на экран:

cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x200000001e
mtime = Wed Dec 15 11:24:46 UTC 2021
pZxid = 0x2000000020
cversion = 2
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 60
numChildren = 2
[zk: localhost:2181(CONNECTED) 15] stat /z_sequential0000000007
cZxid = 0x200000001c
ctime = Wed Dec 15 11:17:47 UTC 2021
mZxid = 0x200000001c
mtime = Wed Dec 15 11:17:47 UTC 2021
pZxid = 0x200000001c
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 20
numChildren = 0
[zk: localhost:2181(CONNECTED) 16] stat /z_ephemeral
cZxid = 0x200000001d
ctime = Wed Dec 15 11:18:35 UTC 2021
mZxid = 0x200000001d
mtime = Wed Dec 15 11:18:35 UTC 2021
pZxid = 0x200000001d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100005560090006
dataLength = 20
numChildren = 0

Шаг 7. Наблюдение за изменениями в znode

Средства наблюдения в ZooKeeper позволяют клиенту получать уведомления об изменениях в наблюдаемых узлах. Добавьте watch с помощью команды get и дополнительного аргумента, задающего название watcher.

РЕКОМЕНДАЦИЯ

Можно добавлять watch с помощью команд: get, stat, ls и ls2.

get /z_persistent 1

Вывод на экран такой же, как и при обычном вызове команды get:

The test configuration has been updated with the command set
cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x200000001e
mtime = Wed Dec 15 11:24:46 UTC 2021
pZxid = 0x2000000020
cversion = 2
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 60
numChildren = 2

Теперь проверьте настройку, изменив данные в узле с помощью команды set:

set /z_persistent "Updated"

Вывод на экран содержит не только обычный вывод этой команды, но также уведомление, сообщающее клиенту о произошедшем изменении в налюдаемом znode:

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/z_persistent
cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x2000000021
mtime = Wed Dec 15 11:37:02 UTC 2021
pZxid = 0x2000000020
cversion = 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2

Учитывайте, что каждый watch срабатывает только один раз. При следующем выполнении команды set уведомление не будет послано, если клиент не настроит новый watch перед выполнением этой команды.

[zk: localhost:2181(CONNECTED) 24] set /z_persistent "Updated 2"
cZxid = 0x2000000019
ctime = Wed Dec 15 11:15:27 UTC 2021
mZxid = 0x2000000022
mtime = Wed Dec 15 11:37:51 UTC 2021saying
pZxid = 0x2000000020
cversion = 2
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 2

Шаг 8. Удаление znode

Для окончательного удаления znode введите команду rmr и после нее путь к этому узлу.

rmr /z_persistent

Если теперь попробовать получить данные от znode, которого уже нет, или его дочерних узлов, вывод на экран будет свидетельствовать о его удалении:

  • Проверка родительского узла:

    get /z_persistent

    Вывод на экран:

    Node does not exist: /z_persistent
  • Проверка дочернего узла:

    get /z_persistent/child1

    Вывод на экран:

    Node does not exist: /z_persistent/child1

В завершение проверьте автоматическое удаление эфемерных узлов при закрытии соединения с клиентом. Для этого закройте текущий сеанс с помощью команды quit и начните новый сеанс с помощью скрипта zkCli.sh. После этого командой ls / проверьте список дочерних узлов корневого znode. Вы получите следующий результат:

  • Постоянный znode /z_persistent удален, так как мы удалили его ранее.

  • Последовательный znode /z_sequential0000000007 доступен.

  • Эфемерный znode /z_ephemeral удален автоматически.

ls /

Вывод на экран:

[zookeeper, Arenadata.Hadoop-1.solr.server, z_sequential0000000007, hadoop-ha, hbase]
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней