Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Использование коннектора PXF HBase для чтения данных из таблиц HBase в Greengage DB

Антон Монаков

Apache HBase — распределенная версионируемая нереляционная база данных экосистемы Hadoop.

Основные концепции HBase:

  • Таблица HBase — это многомерная структура, состоящая из одного или нескольких столбцов и строк данных.

  • Столбец HBase включает в себя два компонента: семейство столбцов и квалификатор столбца, которые разделяются двоеточием (:). При создании таблицы HBase указывается полный набор семейств столбцов.

  • Строка HBase состоит из ключа строки и одного или нескольких значений столбцов. Ключ строки является уникальным идентификатором строки таблицы.

  • Ячейка HBase состоит из строки (семейство столбцов, квалификатор столбца, значение столбца) и временной метки. Значение столбца и временная метка ячейки представляют собой версию значения ячейки.

Для получения дополнительной информации об HBase обратитесь к Apache HBase Reference Guide.

Создание внешней таблицы с использованием протокола PXF

Чтобы создать внешнюю таблицу Greengage DB для чтения данных из таблицы HBase, используется следующий синтаксис:

CREATE EXTERNAL TABLE <table_name>
    ( <column_name> <data_type> [, ...] | LIKE <other_table> )

    LOCATION ('pxf://<hbase_table_name>?PROFILE=hbase[&SERVER=<server_name>]')
    FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
Ключевое слово Значение

<table_name>

Имя создаваемой таблицы

<column_name>

Имя создаваемого столбца

<data_type>

Тип данных создаваемого столбца

LIKE <other_table>

Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения

<hbase_table_name>

Имя таблицы HBase, из которой происходит чтение данных

PROFILE=hbase

Для чтения данных из таблицы HBase используется профиль hbase

SERVER=<server_name>

Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию

FORMAT 'CUSTOM'

Для чтения данных из таблицы HBase используется кастомный формат со встроенной кастомной функцией форматирования для операций чтения (pxfwritable_import)

Сопоставление типов данных

HBase основан на работе с байтами: данные всех типов хранятся как массив байтов. Для представления данных HBase в Greengage DB необходимо выбрать тип данных столбца Greengage DB, соответствующий содержимому квалификаторов столбцов HBase. Внешнюю таблицу Greengage DB можно создать, ссылаясь как на все квалификаторы столбцов таблицы HBase, так и на их подмножество. Обратите внимание, что PXF не поддерживает сложные объекты HBase.

PXF поддерживает прямое или непрямое сопоставление между столбцом таблицы Greengage DB и квалификатором столбца HBase. Практический пример создания внешней таблицы Greengage DB с использованием обоих методов сопоставления приведен в разделе Пример.

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

Прямое сопоставление имен столбцов внешней таблицы Greengage DB с квалификаторами HBase определяется с помощью заключенных в кавычки имен квалификаторов HBase, уточненных семейством столбцов (<семейство столбцов>:<квалификатор столбца>). При чтении данных таблицы коннектор PXF HBase передает эти имена столбцов в HBase без изменений.

Непрямое сопоставление столбцов с помощью таблицы поиска

Непрямое сопоставление имен столбцов внешней таблицы Greengage DB с квалификаторами HBase указывается с помощью таблицы поиска, созданной в HBase. Эта таблица поиска сопоставляет пару <семейство столбцов>:<квалификатор столбца> произвольному псевдониму имени столбца, указанному при создании внешней таблицы Greengage DB.

Непрямое сопоставление позволяет создать короткий текстовый псевдоним для пары <семейство столбцов>:<квалификатор столбца> HBase и является более надежным подходом, чем прямое:

  • Имена квалификаторов HBase могут быть очень длинными, но при этом Greengage DB накладывает ограничение в 63 символа на размер имени столбца.

  • Имена квалификаторов HBase могут содержать двоичные или непечатаемые символы, но при этом имена столбцов Greengage DB ограничены стандартными текстовыми символами.

Таблица поиска HBase PXF должна называться pxflookup и содержать единственное семейство столбцов с именем mapping. Таблица заполняется следующим образом:

  • Ключ строки указывает имя таблицы HBase.

  • Квалификатор семейства столбцов mapping указывает имя столбца Greengage DB, а значение — идентифицирует пару <семейство столбцов>:<квалификатор столбца> HBase, для которой создается псевдоним.

Ключ строки

Ключ строки таблицы HBase является уникальным идентификатором строки таблицы. PXF позволяет получить к нему доступ из запроса к внешней таблице Greengage DB с помощью зарезервированного имени столбца recordkey. Если столбец recordkey указан, PXF возвращает ключ записи таблицы HBase для каждой строки. Затем вы можете использовать его в выражении WHERE, чтобы отфильтровать таблицу HBase по диапазону значений ключа строки. Чтобы включить pushdown предикатов на столбец recordkey, определите его тип как TEXT.

Практический пример получения ключа строки во внешней таблице Greengage DB приведен в разделе Пример.

Пример

Этот пример демонстрирует, как настроить и использовать коннектор PXF HBase для чтения данных из таблицы HBase во внешнюю таблицу Greengage DB.

Предварительные требования

Для выполнения практических примеров подключитесь к мастер-хосту Greengage DB как gpadmin с помощью psql, как описано в статье Подключение к Greengage DB с использованием psql. Затем создайте тестовую базу данных customers и подключитесь к ней:

DROP DATABASE IF EXISTS customers;
CREATE DATABASE customers;
\c customers

Чтобы создать внешнюю таблицу с использованием протокола PXF, предварительно зарегистрируйте в БД расширение PXF, как описано в разделе Регистрация PXF в БД документации PXF:

CREATE EXTENSION pxf;

Конфигурирование коннектора PXF HBase

Для того чтобы подключиться к HDFS с помощью PXF, необходимо создать конфигурацию сервера, как описано в статье Настройка коннекторов PXF Hadoop документации PXF, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:

  1. Подключитесь к мастер-хосту Greengage DB как gpadmin.

  2. Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера Hadoop с именем hadoop:

    $ mkdir $PXF_BASE/servers/hadoop
    $ cd $PXF_BASE/servers/hadoop
  3. Скопируйте файлы конфигурации core-site.xml, hdfs-site.xml, mapred-site.xml и yarn-site.xml с хоста NameNode кластера Hadoop на текущий хост:

    $ scp hdfsuser@namenode:/etc/hadoop/conf/core-site.xml .
    $ scp hdfsuser@namenode:/etc/hadoop/conf/hdfs-site.xml .
    $ scp hdfsuser@namenode:/etc/hadoop/conf/mapred-site.xml .
    $ scp hdfsuser@namenode:/etc/hadoop/conf/yarn-site.xml .
  4. Скопируйте файл конфигурации HBase hbase-site.xml с хоста NameNode кластера Hadoop на текущий хост:

    $ scp hdfsuser@namenode:/etc/hbase/conf/hbase-site.xml .
  5. Для того чтобы коннектор PXF HBase поддерживал pushdown предикатов, скопируйте файл $PXF_HOME/share/pxf-hbase-*.jar на каждый хост кластера HBase. Убедитесь, что местоположение присутствует в пути к классам HBase. Например:

    $ scp $PXF_HOME/share/pxf-hbase-lib-6.15.0-SNAPSHOT.jar hdfsuser@namenode:/usr/lib/hbase/lib
  6. Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:

    $ pxf cluster sync
    $ pxf cluster restart

Создание читающей внешней таблицы

  1. На хосте HBase запустите оболочку HBase:

    $ hbase shell
  2. Выполните команду для создания HBase-таблицы и наполнения ее тестовыми данными. HBase-таблица с именем customers создается в пространстве имен по умолчанию и содержит семейства столбцов name и contact:

    create 'customers', 'name', 'contact'
    put 'customers', '1', 'name:first_name', 'John'
    put 'customers', '1', 'name:last_name', 'Doe'
    put 'customers', '1', 'contact:email', 'john.doe@example.com'
    put 'customers', '1', 'contact:address', '123 Elm Street'
    put 'customers', '2', 'name:first_name', 'Jane'
    put 'customers', '2', 'name:last_name', 'Smith'
    put 'customers', '2', 'contact:email', 'jane.smith@example.com'
    put 'customers', '2', 'contact:address', '456 Oak Street'
    put 'customers', '3', 'name:first_name', 'Bob'
    put 'customers', '3', 'name:last_name', 'Brown'
    put 'customers', '3', 'contact:email', 'bob.brown@example.com'
    put 'customers', '3', 'contact:address', '789 Pine Street'
    put 'customers', '4', 'name:first_name', 'Rob'
    put 'customers', '4', 'name:last_name', 'Stuart'
    put 'customers', '4', 'contact:email', 'rob.stuart@example.com'
    put 'customers', '4', 'contact:address', '119 Willow Street'
  3. Опционально, выполните запрос к таблице customers, чтобы просмотреть данные:

    scan 'customers'

    Вывод должен выглядеть следующим образом:

    ROW                                    COLUMN+CELL
     1         column=contact:address, timestamp=2026-03-13T09:50:53.882, value=123 Elm Street
     1         column=contact:email, timestamp=2026-03-13T09:50:53.855, value=john.doe@example.com
     1         column=name:first_name, timestamp=2026-03-13T09:50:53.826, value=John
     1         column=name:last_name, timestamp=2026-03-13T09:50:53.838, value=Doe
     2         column=contact:address, timestamp=2026-03-13T09:50:53.928, value=456 Oak Street
     2         column=contact:email, timestamp=2026-03-13T09:50:53.918, value=jane.smith@example.com
     2         column=name:first_name, timestamp=2026-03-13T09:50:53.895, value=Jane
     2         column=name:last_name, timestamp=2026-03-13T09:50:53.908, value=Smith
     3         column=contact:address, timestamp=2026-03-13T09:50:53.984, value=789 Pine Street
     3         column=contact:email, timestamp=2026-03-13T09:50:53.960, value=bob.brown@example.com
     3         column=name:first_name, timestamp=2026-03-13T09:50:53.940, value=Bob
     3         column=name:last_name, timestamp=2026-03-13T09:50:53.950, value=Brown
     4         column=contact:address, timestamp=2026-03-13T09:50:54.048, value=119 Willow Street
     4         column=contact:email, timestamp=2026-03-13T09:50:54.024, value=rob.stuart@example.com
     4         column=name:first_name, timestamp=2026-03-13T09:50:54.002, value=Rob
     4         column=name:last_name, timestamp=2026-03-13T09:50:54.013, value=Stuart
    4 row(s)
  4. На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на HBase-таблицу customers с помощью прямого сопоставления столбцов. Для перечисления столбцов таблицы используйте заключенные в кавычки имена квалификаторов HBase, уточненные именами семейства столбцов (<семейство столбцов>:<квалификатор столбца>). В выражении LOCATION укажите PXF-профиль hbase и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_import — встроенную кастомную функцию форматирования для операций чтения:

    CREATE EXTERNAL TABLE customers_direct (
        "name:first_name" TEXT,
        "name:last_name" TEXT,
        "contact:address" TEXT,
        "contact:email" TEXT
        )
        
        LOCATION ('pxf://customers?PROFILE=hbase&SERVER=hadoop')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
  5. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_direct;

    Вывод должен выглядеть следующим образом:

     name:first_name | name:last_name |  contact:address  |     contact:email
    -----------------+----------------+-------------------+------------------------
     John            | Doe            | 123 Elm Street    | john.doe@example.com
     Jane            | Smith          | 456 Oak Street    | jane.smith@example.com
     Bob             | Brown          | 789 Pine Street   | bob.brown@example.com
     Rob             | Stuart         | 119 Willow Street | rob.stuart@example.com
    (4 rows)
  6. На хосте HBase используйте оболочку HBase для создания таблицы сопоставления PXF и наполнения ее данными. Данные поиска сопоставляют псевдонимы столбцов именам квалификаторов столбцов HBase, уточненным именами семейства столбцов (<семейство столбцов>:<квалификатор столбца>):

    create 'pxflookup', 'mapping'
    put 'pxflookup', 'customers', 'mapping:first_name', 'name:first_name'
    put 'pxflookup', 'customers', 'mapping:last_name', 'name:last_name'
    put 'pxflookup', 'customers', 'mapping:address', 'contact:address'
    put 'pxflookup', 'customers', 'mapping:email', 'contact:email'
  7. Опционально, выполните запрос к таблице pxflookup, чтобы просмотреть данные:

    scan 'pxflookup'

    Вывод должен выглядеть следующим образом:

    ROW                                    COLUMN+CELL
     customers         column=mapping:address, timestamp=2026-03-16T10:10:15.674, value=contact:address
     customers         column=mapping:email, timestamp=2026-03-16T10:10:18.028, value=contact:email
     customers         column=mapping:first_name, timestamp=2026-03-16T10:10:15.592, value=name:first_name
     customers         column=mapping:last_name, timestamp=2026-03-16T10:10:15.641, value=name:last_name
    1 row(s)
  8. На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на HBase-таблицу customers с помощью непрямого сопоставления столбцов. Для перечисления столбцов таблицы используйте псевдонимы столбцов. В выражении LOCATION укажите PXF-профиль hbase и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_import — встроенную кастомную функцию форматирования для операций чтения:

    CREATE EXTERNAL TABLE customers_lookup (
        first_name TEXT,
        last_name TEXT,
        address TEXT,
        email TEXT
        )
        
        LOCATION ('pxf://customers?PROFILE=hbase&SERVER=hadoop')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
  9. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_lookup;

    Вывод должен выглядеть следующим образом:

     first_name | last_name |      address      |         email
    ------------+-----------+-------------------+------------------------
     John       | Doe       | 123 Elm Street    | john.doe@example.com
     Jane       | Smith     | 456 Oak Street    | jane.smith@example.com
     Bob        | Brown     | 789 Pine Street   | bob.brown@example.com
     Rob        | Stuart    | 119 Willow Street | rob.stuart@example.com
    (4 rows)
  10. Добавьте в таблицу customers_lookup столбец recordkey типа TEXT, чтобы получить ключи строк:

    ALTER EXTERNAL TABLE customers_lookup 
        ADD COLUMN recordkey TEXT;
  11. Выполните запрос к внешней таблице:

    SELECT * FROM customers_lookup;

    Вывод должен выглядеть следующим образом:

     first_name | last_name |      address      |         email          | recordkey
    ------------+-----------+-------------------+------------------------+-----------
     John       | Doe       | 123 Elm Street    | john.doe@example.com   |         1
     Jane       | Smith     | 456 Oak Street    | jane.smith@example.com |         2
     Bob        | Brown     | 789 Pine Street   | bob.brown@example.com  |         3
     Rob        | Stuart    | 119 Willow Street | rob.stuart@example.com |         4
    (4 rows)