Impala и HBase

Impala позволяет выполнять SQL-запросы к таблицам HBase. С точки зрения пользователя Impala, имеющего опыт работы с РСУБД, HBase — это хранилище ключ/значение, где значение состоит из нескольких полей. Ключ сопоставляется с одним столбцом таблицы Impala, а остальные поля значения сопоставляются с другими столбцами таблицы Impala. Поскольку Impala и Hive используют одну и ту же базу данных Metastore, после создания таблицы в Hive вы можете выполнять запросы к ней через Impala.

Пример использования таблицы HBase

Пример ниже показывает, как работать с таблицами HBase. В этом примере используется таблица HBase people_ages из статьи Массовая загрузка с использованием встроенных задач MapReduce.

  1. Чтобы использовать таблицу HBase в Impala, необходимо создать внешнюю таблицу в командной строке Hive.

    Укажите следующие опции:

    • Выражение STORED BY с обработчиком хранилища org.apache.hadoop.hive.hbase.HBaseStorageHandler.

    • Выражение TBLPROPERTIES для сопоставления созданной таблицы с таблицей, существующей в HBase. Свойство hbase.mapred.output.outputtable необходимо указать, если планируется добавлять данные в таблицу.

    • Столбец, соответствующий ключу строки HBase, должен иметь тип STRING.

      $ sudo -u hive hive
      CREATE EXTERNAL TABLE hbase_people_ages (name string, age int)
      STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,basic:age")
      TBLPROPERTIES ("hbase.table.name" = "people_ages", "hbase.mapred.output.outputtable" = "people_ages");
  2. После создания новой таблицы через Hive выполните оператор INVALIDATE METADATA в impala-shell, чтобы Impala получила информацию о новой таблице.

    $ impala-shell
    INVALIDATE METADATA hbase_people_ages;
  3. Вставьте новую строку в таблицу:

    INSERT INTO hbase_people_ages VALUES ('Gary Morgan', 35), ('Jim Brian', 48);
  4. Выполните выборку данных:

    SELECT * from hbase_people_ages WHERE name LIKE 'Gar%';

    Результат:

    +------------------+-----+
    | name             | age |
    +------------------+-----+
    | Garcia Nathaniel | 61  |
    | Gardner Helena   | 54  |
    | Garner Andre     | 37  |
    | Garner Juan      | 28  |
    | Garner Mark      | 47  |
    | Garrett Isabelle | 52  |
    | Garrett Steven   | 24  |
    | Garrett Willie   | 42  |
    | Gary Morgan      | 35  |
    | Garza Manuel     | 30  |
    | Garza Paul       | 51  |
    +------------------+-----+
    Fetched 11 row(s) in 5.74s

Для эффективных запросов используйте выражение WHERE, чтобы найти одно значение ключа или диапазон значений ключа. Старайтесь избегать запросов, выполняющих полное сканирование таблицы. Это эффективно для обычных таблиц Impala, но неэффективно в HBase.

ПРИМЕЧАНИЕ
Синтаксис INSERT …​ VALUES Impala подходит для таблиц HBase, поскольку вставка одной строки является эффективной операцией для таблицы HBase. Когда используется синтаксис INSERT …​ SELECT, HBase сохраняет только последнюю версию строки для каждого уникального ключа. Если оператор INSERT …​ SELECT копирует несколько строк, содержащих одно и то же значение ключа, запрос возвращает только одну строку с каждым значением ключевого столбца. Хотя в Impala нет оператора UPDATE, вы можете получить тот же результат, выполнив оператор INSERT с тем же значением ключа.

Обзор производительности

Impala использует клиентский API HBase через собственный интерфейс Java (JNI) для запроса данных, хранящихся в HBase. Эта операция не читает HFiles напрямую. Дополнительная нагрузка соединения делает важным выбор того, какие данные хранить в HBase. Также необходимо создавать запросы, которые могут эффективно извлекать данные HBase. Для этого необходимо учитывать следующие рекомендации:

  • Используйте таблицу HBase для запросов, возвращающих одну строку или небольшой диапазон строк, а не для запросов, выполняющих полное сканирование всей таблицы. Если запрос ссылается на таблицу HBase и не содержит выражение WHERE, это явный признак неэффективности запроса.

  • HBase может обеспечить приемлемую производительность для хранения небольших многомерных таблиц. Таблица должна быть достаточно небольшой, чтобы полное сканирование таблицы для каждого запроса было эффективным. HDFS также подходит для многомерных таблиц, которым не требуется поддержка запросов на обновление, удаление или вставку небольшого количества строк.

  • Предикаты запроса применяются к ключам строк в качестве начального и конечного значения, тем самым ограничивая область конкретного поиска. Если поле ключа строки не сопоставлено со столбцом типа STRING, операции сравнения не работают.

  • Если предикаты используются для неключевых столбцов, Impala возвращает больше строк, чем HBase, который может использовать фильтр SingleColumnValueFilter. Когда предикат ключа строки соответствует одной строке, HBase находит и возвращает эту строку. Если используется предикат для неключевого поля и ему соответствует только одна строка, HBase сканирует всю таблицу, чтобы найти эту строку.

  • По соображениям производительности важно объявить ключевой столбец как STRING в операторе CREATE EXTERNAL TABLE. Вы также можете определить другие столбцы с типами INT или BOOLEAN как STRING. В этом случае Impala сможет более эффективно оптимизировать работу с этими данными. За дополнительной информацией обратитесь к разделу Interpreting EXPLAIN Output for HBase Queries статьи Using Impala to Query HBase Tables.

Случаи использования

Ниже приведены типичные случаи использования Impala для выполнения запросов к таблицам HBase:

  • Хранение быстро увеличивающихся счетчиков. Например, количество просмотров веб-страницы, количество пользовательских подключений или голосов за публикацию в социальных сетях. HBase эффективен для сбора данных такого типа: механизм хранения только для добавления эффективен для записи каждого изменения на диск, а запрос всегда возвращает самое последнее значение.

  • Хранение таблиц с большим количеством столбцов (wide tables). Такие таблицы включают множество столбцов (тысячи), которые содержат характеристики сущности, например, пользователя онлайн-сервиса. Очень часто в этих таблицах большинство значений столбцов NULL, 0, FALSE, пустые строки, другие пустые значения или значения-заполнители. Например, пользователь может никогда не использовать некоторые возможности сайта, не заполнить специальное поле в профиле или не посещать определенную часть сайта. Типичный запрос к таблице этого типа — получение одной строки со всей информацией об объекте, а не вычисление суммы, среднего значения или фильтрация миллионов строк, как в таблицах Impala.

Ограничения интеграции Impala и HBase

Интеграция Impala с HBase имеет следующие ограничения:

  • Если вы выполняете команду DROP TABLE для таблицы, управляемой Impala, которая сопоставлена с таблицей HBase, базовая таблица в HBase не удаляется.

  • Оператор INSERT OVERWRITE недоступен для таблиц HBase. Чтобы добавить новые данные или изменить существующую строку, вставьте новую строку. Для изменения существующей строки используйте то же значение ключа.

  • Если вы выполняете оператор CREATE TABLE LIKE для таблицы, сопоставленной с таблицей HBase, новая таблица также получает имя базовой таблицы HBase. Таким образом, новая таблица является псевдонимом старой, а не новой таблицей с идентичной структурой столбцов.

  • Копирование данных в таблицу HBase с использованием синтаксиса INSERT …​ SELECT Impala может привести к появлению меньшего количества новых строк, чем в наборе результатов запроса SELECT. Если набор результатов содержит несколько строк с одинаковым значением для ключевого столбца, каждая строка перезаписывает предыдущую с тем же значением ключа. Поскольку порядок вставленных строк непредсказуем, не следует полагаться на этот метод для сохранения последней версии определенного значения ключа.

  • Поскольку сложные типы данных (ARRAY, STRUCT и MAP) в настоящее время поддерживаются только в таблицах Parquet, нельзя использовать эти типы в таблицах HBase, обрабатываемых через Impala.

  • Оператор LOAD DATA нельзя использовать с таблицами HBase.

  • Выражение TABLESAMPLE оператора SELECT не может быть применено к таблицам HBase.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней