Работа с Znodes
Шаг 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.
ВАЖНО
|
[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 /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]