Начало работы с HBase shell
Простейшим способом начать работу в HBase является использование утилиты HBase shell. Она представляет собой консоль JRuby, доступную на любом узле кластера HBase непосредственно после его размещения. Для перехода в интерактивный режим работы с этой консолью выполните следующую команду:
$ hbase shell
Командная строка shell позволяет ввести команду после символа приглашения >
.
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/lib/phoenix/phoenix-5.0.0-HBase-2.0-client.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/lib/phoenix/phoenix-5.0.0-HBase-2.0-hive.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/lib/phoenix/phoenix-5.0.0-HBase-2.0-pig.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/lib/phoenix/phoenix-5.0.0-HBase-2.0-thin-client.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] HBase Shell Use "help" to get list of supported commands. Use "exit" to quit this interactive shell. Version 2.0.2, rUnknown, Thu Apr 15 20:20:26 UTC 2021 Took 0.0024 seconds hbase(main):001:0>
Чтобы завершить сеанс работы с HBase shell, выполните команду выхода:
exit
Ниже приведены некоторые операции работы с данными. Они основаны на примерах, описанных в разделе Модель данных HBase. Полный список этих и других команд shell с описанием их параметров приведен в разделе Команды HBase shell.
ПРИМЕЧАНИЕ
Прежде чем начать выполнение команд, рекомендуем вам ознакомиться с разделом Модель данных HBase. |
Шаг 1. Создание таблицы
Команда создания таблицы начинается с ключевого слова create
, за которым следует название таблицы в кавычках, а затем информация о семействах колонок (column families) в этой таблице. Для задания семейства колонок используйте один из следующих подходов:
-
Ввести только название семейства в кавычках без какой-либо иной информации.
-
В фигурных скобках задать несколько атрибутов семейства, используя для каждого атрибута пару ключ/значение.
Используйте следующую команду для создания таблицы articles
c двумя семействами колонок: basic
и tags
. Задайте каждое семейство с помощью двух атрибутов: названия и максимального количества хранимых версий значений. В следующем примере каждая колонка в этих семействах будет хранить до пяти версий значений:
create 'articles', {NAME => 'basic', VERSIONS => 5}, {NAME => 'tags', VERSIONS => 5}
Вывод на консоль приведен ниже:
Created table articles Took 1.6225 seconds => Hbase::Table - articles
Step 2. Получение информации о таблице
Чтобы проверить, существует ли таблица с заданным названием, и получить информацию о ней, используйте следующие команды:
-
exists. Эта команда проверяет, существует ли таблица с заданным названием:
exists 'articles'
Вывод на консоль приведен ниже:
Table articles does exist Took 0.0705 seconds => true
Если таблица с заданным названием, например
not_existed
, отсутствует, команда вернет следующее сообщение:Table not_existed does not exist Took 0.0076 seconds => false
-
list. Данная команда выведет на консоль название таблицы, если таблица с заданным названием существует:
list 'articles'
Вывод на консоль:
TABLE articles 1 row(s) Took 0.3102 seconds => ["articles"]
Если таблица с заданным названием отсутствует, команда вернет следующее сообщение:
TABLE 0 row(s) Took 0.0064 seconds => []
-
describe. Эта команда проверяет наличие таблицы и, если она существует, отображает информацию о семействах колонок этой таблицы:
describe 'articles'
Вывод на консоль:
Table articles is ENABLED articles COLUMN FAMILIES DESCRIPTION {NAME => 'basic', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => ' false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false' , IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '6553 6'} {NAME => 'tags', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'f alse', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 '} 2 row(s) Took 0.1100 seconds
Если таблица с заданным названием отсутствует, команда вернет следующее сообщение:
ERROR: Table not_existed does not exist. Describe the named table. For example: hbase> describe 't1' hbase> describe 'ns1:t1' Alternatively, you can use the abbreviated 'desc' for the same thing. hbase> desc 't1' hbase> desc 'ns1:t1' Took 0.0159 seconds
Шаг 3. Запись данных в таблицу
Команда записи данных в таблицу начинается с ключевого слова put
, за которым следует название таблицы, ключ строки (row key), название колонки и данные. Название колонки состоит из двух частей, разделенных двоеточием — названия семейства и квалификатора колонки (column qualifier). Названия семейств колонок фиксированы. Это означает, что они должны задаваться при создании таблицы. Квалификаторы колонок не фиксированы, так что их можно добавлять в процессе записи новых данных в ранее созданную таблицу.
Приведенные ниже команды записывают данные в таблицу articles
в строку с ключом article1
. Они записывают данные во вновь добавленные колонки author
и header
в семействе basic
, а также в колонки arch
, concepts
и tutorials
в семействе tags
. Записываемые данные занимают последнюю позицию в перечне аргументов команды. HBase автоматически генерирует временные метки для этих новых данных.
put 'articles', 'article1', 'basic:author', 'Test author'
put 'articles', 'article1', 'basic:header', 'Test article'
put 'articles', 'article1', 'tags:arch', true
put 'articles', 'article1', 'tags:concepts', true
put 'articles', 'article1', 'tags:tutorials', true
Следующие команды также записывают данные в таблицу articles
, но в строку с другим ключом — article2
. Как вы заметили, нет необходимости записывать данные только в ячейки с ранее определенными квалификаторами колонок — используйте те, которые необходимы, независимо от того, существуют такие колонки или еще нет:
put 'articles', 'article2', 'basic:author', 'Test author2'
put 'articles', 'article2', 'basic:header', 'Test article2'
put 'articles', 'article2', 'tags:ref', true
Вывод на консоль:
Took 0.0051 seconds
Шаг 4. Считывание заданной строки таблицы
HBase предоставляет различные команды для чтения строк таблицы, как описано в следующих секциях.
Чтение целой строки
Для чтения заданной строки из таблицы используйте команду get
, а в качестве аргументов задайте последовательно название таблицы и ключ строки. Например, следующая команда считывает все ячейки строки с ключом article1
из таблицы articles
:
get 'articles', 'article1'
Команда возвращает все данные из всех колонок, которые использует заданная строка. В выводе на консоль каждая ячейка представлена значением и соответствующей отметкой о времени (timestamp) записи этого значения.
COLUMN CELL basic:author timestamp=1637054560096, value=Test author basic:header timestamp=1637054560118, value=Test article tags:arch timestamp=1637054560141, value=true tags:concepts timestamp=1637054560160, value=true tags:tutorials timestamp=1637054564066, value=true 1 row(s) Took 0.0442 seconds
Вывод на консоль той же команды для строки с ключом article2
представлен ниже:
COLUMN CELL basic:author timestamp=1637054576501, value=Test author2 basic:header timestamp=1637054576516, value=Test article2 tags:ref timestamp=1637054577512, value=true 1 row(s) Took 0.0099 seconds
По умолчанию команда get
показывает только последние версии данных, хотя таблица может хранить до пяти значений с различными версиями, как мы определили при создании таблицы. Если вы добавите новое значение в ячейку, то команда get
вернет это новое значение, поскольку с ним связана наиболее поздняя временная отметка в данной ячейке.
Следующий пример демонстрирует добавление нового значения в колонку basic:header
строки с ключом article1
:
put 'articles', 'article1', 'basic:header', 'Test article. Version 2'
get 'articles', 'article1'
Последующая команда get
выведет следующую информацию на экран:
COLUMN CELL basic:author timestamp=1637054560096, value=Test author basic:header timestamp=1637055836875, value=Test article. Version 2 tags:arch timestamp=1637054560141, value=true tags:concepts timestamp=1637054560160, value=true tags:tutorials timestamp=1637054564066, value=true 1 row(s) Took 0.0066 seconds
В следующем примере добавим третью версию значения в колонку basic:header
строки с ключом article1
:
put 'articles', 'article1', 'basic:header', 'Test article. Version 3'
get 'articles', 'article1'
Вывод команды get
на консоль:
COLUMN CELL basic:author timestamp=1637054560096, value=Test author basic:header timestamp=1637056832082, value=Test article. Version 3 tags:arch timestamp=1637054560141, value=true tags:concepts timestamp=1637054560160, value=true tags:tutorials timestamp=1637054564066, value=true 1 row(s) Took 0.0064 seconds
Чтение заданной колонки
Для чтения заданной колонки в некоторой строке добавьте название этой колонки после названия таблицы и ключа строки в команде get
. Как обычно, название колонки состоит из названия семейства и квалификатора колонки, разделенных двоеточием.
Следующая команда считывает последнее значение, добавленное в колонку basic:header
строки с ключом article1
.
get 'articles', 'article1', 'basic:header'
Вывод на консоль:
COLUMN CELL basic:header timestamp=1637056832082, value=Test article. Version 3 1 row(s) Took 0.0227 seconds
Из данного результата следует, что команда возвращает последнее добавленное значение. Для получения значения другой версии задайте в фигурных скобках соответствующую временную метку совместно с названием колонки:
get 'articles', 'article1', {COLUMN => 'basic:header', TIMESTAMP => 1637054560118}
Вывод на консоль:
COLUMN CELL basic:header timestamp=1637054560118, value=Test article 1 row(s) Took 0.0171 seconds
Шаг 5. Сканирование данных таблицы
Команда scan
позволяет считать все строки таблицы.
Сканирование всех колонок
Для считывания всех колонок всех строк таблицы введите ключевое слово scan
и название таблицы после него. Следующая команда возвращает полное содержимое таблицы articles
с последними версиями значений:
scan 'articles'
Вывод на консоль:
ROW COLUMN+CELL article1 column=basic:author, timestamp=1637054560096, value=Test author article1 column=basic:header, timestamp=1637056832082, value=Test article. Version 3 article1 column=tags:arch, timestamp=1637054560141, value=true article1 column=tags:concepts, timestamp=1637054560160, value=true article1 column=tags:tutorials, timestamp=1637054564066, value=true article2 column=basic:author, timestamp=1637054576501, value=Test author2 article2 column=basic:header, timestamp=1637054576516, value=Test article2 article2 column=tags:ref, timestamp=1637054577512, value=true 2 row(s) Took 0.0204 seconds
Для получения значений определенного количества последних версий, не только последней, укажите требуемое количество версий, как в следующей команде:
scan 'articles', {VERSIONS => 5}
Вывод на консоль:
ROW COLUMN+CELL article1 column=basic:author, timestamp=1637054560096, value=Test author article1 column=basic:header, timestamp=1637056832082, value=Test article. Version 3 article1 column=basic:header, timestamp=1637055836875, value=Test article. Version 2 article1 column=basic:header, timestamp=1637054560118, value=Test article article1 column=tags:arch, timestamp=1637054560141, value=true article1 column=tags:concepts, timestamp=1637054560160, value=true article1 column=tags:tutorials, timestamp=1637054564066, value=true article2 column=basic:author, timestamp=1637054576501, value=Test author2 article2 column=basic:header, timestamp=1637054576516, value=Test article2 article2 column=tags:ref, timestamp=1637054577512, value=true 2 row(s) Took 0.0138 seconds
Сканирование заданной колонки
Для считывание только одной колонки по всем строкам таблицы задайте в фигурных скобках название требуемой колонки после ключевого слова scan
и названия таблицы. Следующая команда считывает все значения колонки basic:author
из таблицы articles
:
scan 'articles', {COLUMN => 'basic:author'}
Вывод на консоль:
ROW COLUMN+CELL article1 column=basic:author, timestamp=1637054560096, value=Test author article2 column=basic:author, timestamp=1637054576501, value=Test author2 2 row(s) Took 0.0101 seconds
Для считывания нескольких версий значений из заданной колонки укажите требуемое количество версий, как в следующей команде:
scan 'articles', {COLUMN => 'basic:header', VERSIONS => 5}
Вывод на консоль:
ROW COLUMN+CELL article1 column=basic:header, timestamp=1637056832082, value=Test article. Version 3 article1 column=basic:header, timestamp=1637055836875, value=Test article. Version 2 article1 column=basic:header, timestamp=1637054560118, value=Test article article2 column=basic:header, timestamp=1637054576516, value=Test article2 2 row(s) Took 0.0298 seconds
Шаг 6. Удаление ячейки из таблицы
Для удаления заданной ячейки из таблицы введите ключевое слово delete
и затем название таблицы, ключ строки, название колонки и, при необходимости, временную метку. Если последний аргумент не указан, то команда удалит последнюю версию ячейки, не затрагивая более ранние версии. Задание временной метки приводит к удалению версии ячейки, соответствующей этой метке.
Следующая команда удаляет последнюю версию ячейки из колонки basic:header
в строке с ключом article1
:
delete 'articles', 'article1', 'basic:header'
Вывод на консоль:
Took 0.0122 seconds
Выполните команду get
для проверки:
get 'articles', 'article1', {COLUMN => 'basic:header'}
Вывод на консоль содержит предыдущую версию ячейки:
COLUMN CELL basic:header timestamp=1637055836875, value=Test article. Version 2 1 row(s) Took 0.0239 seconds
Считывание всех версий ячейки также подтверждает, что значение Test article. Version 3
было удалено:
get 'articles', 'article1', {COLUMN => 'basic:header', VERSIONS => 5}
Вывод на консоль:
COLUMN CELL basic:header timestamp=1637055836875, value=Test article. Version 2 basic:header timestamp=1637054560118, value=Test article 1 row(s) Took 0.0077 seconds
Шаг 7. Изменение структуры таблицы
Изменение структуры таблицы выполняют в три стадии:
-
С помощью команды
disable
сделать таблицу недоступной для других операций. -
Используя команду
alter
, внести необходимые изменения в структуру таблицы. -
С помощью команда
enable
сделать таблицу вновь доступной для всех операций.
ПРИМЕЧАНИЕ
В последних версиях HBase можно изменять структуру таблиц без предварительного применения команды |
Следующая цепочка команд делает таблицу articles
недоступной, добавляет в нее новое семейство колонок temp
и затем делает таблицу опять доступной:
disable 'articles'
alter 'articles', {NAME => 'temp', VERSIONS => 3}
enable 'articles'
Вывод команды alter
на консоль:
Updating all regions with the new schema... All regions updated. Done. Took 1.4006 seconds
Убедитесь, что семейство колонок temp
добавлено в таблицу articles
, путем выполнения команды describe
:
describe 'articles'
Вывод на консоль:
Table articles is ENABLED articles COLUMN FAMILIES DESCRIPTION {NAME => 'basic', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => ' false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false' , IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '6553 6'} {NAME => 'tags', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'f alse', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 '} {NAME => 'temp', VERSIONS => '3', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'f alse', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 '} 3 row(s) Took 0.0224 seconds
Шаг 8. Удаление таблицы
Удаление таблицы требует следующих операций:
-
С помощью команды
disable
сделать таблицу недоступной для других операций. -
Используя команду
drop
, удалить таблицу.
Следующая цепочка команд делает таблицу недоступной и затем удаляет ее:
disable 'articles'
drop 'articles'
С помощью команды exists
убедитесь, что таблица больше не существует:
exists 'articles'
Вывод на консоль:
Table articles does not exist Took 0.0047 seconds => false