Начало работы с HBase shell

Простейшим способом начать работу в HBase является использование утилиты Hbase shell. Она представляет собой консоль JRuby, доступную на любом узле кластера HBase непосредственно после его размещения. Для перехода в интерактивный режим работы с этой консолью выполните следующую команду:

$ hbase shell

Командная строка shell позволяет ввести команду после символа приглашения >.

Приглашение к вводу команды в HBase 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. Изменение структуры таблицы

Изменение структуры таблицы выполняют в три стадии:

  1. С помощью команды disable сделать таблицу недоступной для других операций.

  2. Используя команду alter, внести необходимые изменения в структуру таблицы.

  3. С помощью команда enable сделать таблицу вновь доступной для всех операций.

ПРИМЕЧАНИЕ

В последних версиях HBase можно изменять структуру таблиц без предварительного применения команды disable. Однако, учитывая проблемы прошлых версий, используйте эту возможность осторожно и тестируйте процедуру прежде, чем применять ее в рабочей (production) базе данных.

Следующая цепочка команд делает таблицу 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. Удаление таблицы

Удаление таблицы требует следующих операций:

  1. С помощью команды disable сделать таблицу недоступной для других операций.

  2. Используя команду drop, удалить таблицу.

Следующая цепочка команд делает таблицу недоступной и затем удаляет ее:

disable 'articles'
drop 'articles'

С помощью команды exists убедитесь, что таблица больше не существует:

exists 'articles'

Вывод на консоль:

Table articles does not exist
Took 0.0047 seconds
=> false
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней