Работа с 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 чтобы сообщить о ней