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

Использование коннектора PXF Iceberg для чтения и записи данных в формате Iceberg между Greengage DB и каталогами Hive Metastore и REST

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

Apache Iceberg — формат данных с открытым исходным кодом, предназначенный для больших аналитических таблиц. Он поддерживает SQL-команды и позволяет выполнять одновременные операции чтения и записи с использованием нескольких движков запросов, включая Spark, Trino, Flink, Presto, Hive и Impala.

Коннектор PXF Iceberg поддерживает следующие функции:

  • Чтение и запись данных в каталогах Hive Metastore и REST.

  • Чтение данных в форматах Parquet, ORC и Avro.

  • Запись данных в формате Parquet.

  • Чтение и запись данных в выделенные ветки и теги Iceberg.

  • Проекция столбцов.

  • Pushdown предикатов.

ПРИМЕЧАНИЕ

Для сторонних таблиц поддерживается протокол master commit, который позволяет исполнителям и мастеру обмениваться метаданными. Метаданные агрегируются из всех сегментов и запись транзакции затем завершается через один HTTP-запрос к серверу PXF. Для включения протокола необходимо добавить опцию ext_protocol_version со значением v1 в определение обертки сторонних данных.

В этой статье описывается настройка и использование коннектора PXF Iceberg для чтения и записи данных в формате Iceberg в каталогах REST и Hive Metastore с использованием внешних и сторонних таблиц, а также приводятся практические примеры.

Примечания по совместимости

Для корректной работы коннектора PXF Iceberg требуется Greengage DB 6.31.0 или более поздней версии и PXF 6.16.0 или более поздней версии.

Для предыдущих версий Greengage DB, PXF и расширения pxf_fdw предоставляется уровень совместимости, в рамках которого работа с данными Iceberg возможна с рядом ограничений.

Версия PXF Версия pxf_fdw Версия Greengage DB Ошибка во время выполнения при работе с Iceberg Поддержка Iceberg

Требуемая

Требуемая

Требуемая

Нет

Да

Более ранняя

Более ранняя

Более ранняя

Нет

Нет

Требуемая

Более ранняя

Более ранняя

Нет

Нет

Требуемая

Требуемая

Более ранняя

Нет

Поддерживаются создание, выборка и вставка данных в сторонние таблицы Iceberg. Протокол master commit не поддерживается: создаются несколько снимков для разных экземпляров PXF

Более ранняя

Требуемая

Более ранняя

Да

Поддерживается только создание сторонних таблиц Iceberg; выборка и вставка данных в сторонние таблицы не поддерживаются. Протокол iceberg недоступен

Более ранняя

Требуемая

Требуемая

Да

Поддерживается только создание сторонних таблиц Iceberg; выборка и вставка данных в сторонние таблицы не поддерживаются. Протокол iceberg недоступен

Более ранняя

Более ранняя

Требуемая

Нет

Нет

Настройка коннектора PXF Iceberg

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

  1. На мастер-хосте Greengage DB войдите под пользователем gpadmin.

  2. Измените текущий каталог на $PXF_BASE/servers и создайте каталог конфигурации сервера (например, с именем iceberg):

    $ mkdir $PXF_BASE/servers/iceberg
    $ cd $PXF_BASE/servers/iceberg
  3. В каталоге конфигурации сервера создайте файл iceberg-site.xml и укажите требуемые свойства в зависимости от используемого внешнего хранилища данных.

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <property>
            <name>iceberg.param.s3.endpoint</name>
            <value>http://minio:9000</value>
            <description>S3 endpoint</description>
        </property>
        <property>
            <name>iceberg.param.s3.path-style-access</name>
            <value>true</value>
            <description>S3 path style access</description>
        </property>
        <property>
            <name>iceberg.param.s3.access-key-id</name>
            <value>admin</value>
            <description>S3 access key id</description>
        </property>
        <property>
            <name>iceberg.param.s3.secret-access-key</name>
            <value>minioadmin</value>
            <description>S3 secret access key</description>
        </property>
        <property>
            <name>iceberg.param.client.region</name>
            <value>us-east-1</value>
            <description>AWS region</description>
        </property>
        <property>
            <name>iceberg.param.uri</name>
            <value>http://iceberg-rest:8181</value>
            <description>Catalog uri</description>
        </property>
        <property>
            <name>iceberg.config.catalog.name</name>
            <value>iceberg_rest_s3</value>
            <description>Catalog name</description>
        </property>
        <property>
            <name>iceberg.config.catalog.type</name>
            <value>REST</value>
            <description>Catalog type</description>
        </property>
    </configuration>
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <property>
            <name>iceberg.param.uri</name>
            <value>thrift://hive-metastore:9083</value>
            <description>Catalog uri</description>
        </property>
        <property>
            <name>iceberg.config.catalog.name</name>
            <value>iceberg_hive</value>
            <description>Catalog name</description>
        </property>
        <property>
            <name>iceberg.config.catalog.type</name>
            <value>HIVE_METASTORE</value>
            <description>Catalog type</description>
        </property>
    </configuration>
  4. Синхронизируйте конфигурацию между хостами кластера Greengage DB:

    $ pxf cluster sync

Параметры конфигурации сервера

Опция Параметр конфигурации сервера Описание

uri

iceberg.param.uri

URI каталога Iceberg

catalog_type

iceberg.config.catalog.type

Тип каталога Iceberg (REST или HIVE_METASTORE)

catalog_name

iceberg.config.catalog.name

Имя каталога Iceberg

ref

 — 

Имя ветки или тега Iceberg. При чтении данных должно указываться имя существующего тега или ветки

fragmentSize

 — 

Целевой размер фрагмента в байтах

s3_endpoint

iceberg.param.s3.endpoint

S3-эндпойнт (для хранилища S3)

s3_path_style_access

iceberg.param.s3.path-style-access

Path-style адресация S3 (для хранилища S3)

s3_access_key_id

iceberg.param.s3.access-key-id

Идентификатор ключа доступа для аутентификации в S3 (для хранилища S3)

s3_secret_access_key

iceberg.param.s3.secret-access-key

Ключ доступа для аутентификации в S3 (для хранилища S3)

aws_region

iceberg.param.client.region

Регион AWS (для хранилища S3)

Создание обертки сторонних данных Iceberg

Для работы с данными Iceberg с помощью сторонних таблиц необходимо создать обертку сторонних данных.

  1. На мастер-хосте Greengage DB просмотрите список доступных для установки расширений:

    SELECT * FROM pg_available_extensions WHERE name LIKE '%pxf_fdw%';

    Вывод должен содержать pxf_fdw:

         name     | default_version | installed_version |               comment
    
    --------------+-----------------+-------------------+-----------------------------------------
     pxf_fdw      | 1.0             |                   | PXF Foreign Data Wrapper for Greengage
     (1 row)
  2. Создайте расширение, регистрирующее обертку pxf_fdw в базе данных, в которой его предполагается использовать:

    CREATE EXTENSION pxf_fdw;

    Затем убедитесь, что обертка iceberg_pxf_fdw доступна:

    SELECT * FROM pg_catalog.pg_foreign_data_wrapper;

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

         fdwname     | fdwowner | fdwhandler | fdwvalidator | fdwacl |                  fdwoptions
    -----------------+----------+------------+--------------+--------+-----------------------------------------------
     jdbc_pxf_fdw    |       10 |      24609 |        24610 |        | {protocol=jdbc,"mpp_execute=all segments"}
     hdfs_pxf_fdw    |       10 |      24609 |        24610 |        | {protocol=hdfs,"mpp_execute=all segments"}
     hive_pxf_fdw    |       10 |      24609 |        24610 |        | {protocol=hive,"mpp_execute=all segments"}
     hbase_pxf_fdw   |       10 |      24609 |        24610 |        | {protocol=hbase,"mpp_execute=all segments"}
     s3_pxf_fdw      |       10 |      24609 |        24610 |        | {protocol=s3,"mpp_execute=all segments"}
     gs_pxf_fdw      |       10 |      24609 |        24610 |        | {protocol=gs,"mpp_execute=all segments"}
     adl_pxf_fdw     |       10 |      24609 |        24610 |        | {protocol=adl,"mpp_execute=all segments"}
     wasbs_pxf_fdw   |       10 |      24609 |        24610 |        | {protocol=wasbs,"mpp_execute=all segments"}
     file_pxf_fdw    |       10 |      24609 |        24610 |        | {protocol=file,"mpp_execute=all segments"}
     iceberg_pxf_fdw |       10 |      24609 |        24610 |        | {protocol=iceberg,"mpp_execute=all segments"}
    (10 rows)

Примеры

Эти примеры демонстрируют настройку и использование коннектора PXF Iceberg для чтения и записи данных в формате Iceberg в каталогах REST и Hive Metastore с использованием внешних и сторонних таблиц.

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

Для выполнения практических примеров подключитесь к мастер-хосту 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;

Для того чтобы создавать сторонние таблицы, зарегистрируйте обертку сторонних данных Iceberg в базе данных customers:

CREATE FOREIGN DATA WRAPPER iceberg_pxf_fdw
    HANDLER pxf_fdw_handler
    VALIDATOR pxf_fdw_validator
    OPTIONS (protocol 'iceberg', mpp_execute 'all segments');

Использование каталога REST

Подготовка исходных данных

  1. Подключитесь к REST-каталогу Iceberg и создайте тестовую базу данных:

    CREATE DATABASE IF NOT EXISTS customers;
  2. Создайте тестовую таблицу:

    CREATE TABLE customers.data (
        id INT,
        first_name VARCHAR(20),
        last_name VARCHAR(20)
    );
  3. Заполните созданную таблицу тестовыми данными:

    INSERT INTO customers.data 
        VALUES (1, 'John', 'Doe'),
               (2, 'Jane', 'Doe');
  4. Выполните запрос к созданной таблице:

    SELECT * FROM customers.data;

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

    1       John    Doe
    2       Jane    Doe
    Time taken: 0.26 seconds, Fetched 2 row(s)

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

  1. На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на ранее созданную таблицу Iceberg customers.data. В выражении LOCATION укажите PXF-профиль iceberg и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_import — встроенную кастомную функцию форматирования для операций чтения:

    CREATE EXTERNAL TABLE customers_r_rest (
        id INT, 
        first_name TEXT, 
        last_name TEXT
        )
        LOCATION ('pxf://customers.data?PROFILE=iceberg&SERVER=iceberg')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
  2. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_r_rest;

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

     id | first_name | last_name
    ----+------------+-----------
      1 | John       | Doe
      2 | Jane       | Doe
    (2 rows)

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

  1. На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, ссылающуюся на ранее созданную таблицу Iceberg customers.data. В выражении LOCATION укажите PXF-профиль iceberg и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_export — встроенную кастомную функцию форматирования для операций записи:

    CREATE WRITABLE EXTERNAL TABLE customers_w_rest (
        id INT, 
        first_name TEXT, 
        last_name TEXT
        )
        LOCATION ('pxf://customers.data?PROFILE=iceberg&SERVER=iceberg')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export');
  2. Вставьте данные в созданную таблицу:

    INSERT INTO customers_w_rest (
        id,
        first_name,
        last_name
        )
        VALUES (3, 'Bob', 'Brown'),
               (4, 'Jane', 'Smith');
  3. Подключитесь к REST-каталогу Iceberg и выполните запрос к таблице customers.data:

    SELECT * FROM customers.data;

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

    1       John    Doe
    2       Jane    Doe
    3       Bob     Brown
    4       Jane    Smith
    Time taken: 0.168 seconds, Fetched 4 row(s)

    Затем удалите добавленные строки, чтобы вернуть тестовую таблицу в исходное состояние:

    DELETE FROM customers.data WHERE id IN (3,4);

Создание сторонней таблицы

  1. На мастер-хосте Greengage DB создайте сторонний сервер, использующий обертку сторонних данных iceberg_pxf_fdw и ссылающийся на REST-каталог Iceberg:

    CREATE SERVER iceberg_rest_server
        FOREIGN DATA WRAPPER iceberg_pxf_fdw
        OPTIONS (uri 'http://iceberg-rest:8181');
  2. Создайте сопоставление пользователя, которое будет обрабатывать аутентификацию на REST-сервере Iceberg. В выражении SERVER укажите ранее созданный сервер iceberg_rest_server; в выражении OPTIONS укажите параметры аутентификации: идентификатор ключа доступа (s3_access_key_id) и ключ доступа (s3_secret_access_key):

    CREATE USER MAPPING FOR CURRENT_USER 
        SERVER iceberg_rest_server
        OPTIONS (s3_access_key_id 'admin', 
                 s3_secret_access_key 'password');
  3. Создайте стороннюю таблицу, чья структура совпадает со структурой таблицы customers.data, изначально созданной в REST-каталоге Iceberg. В выражении SERVER укажите ранее созданный сервер iceberg_rest_server; в выражении OPTIONS укажите имя ранее созданной таблицы customers.data:

    CREATE FOREIGN TABLE customers_f_rest (
        id INT,
        first_name TEXT,
        last_name TEXT
        )
        SERVER iceberg_rest_server
        OPTIONS (resource 'customers.data');
  4. Выполните запрос к созданной сторонней таблице:

    SELECT * FROM customers_f_rest;

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

     id | first_name | last_name
    ----+------------+-----------
      1 | John       | Doe
      2 | Jane       | Doe
    (2 rows)
  5. Вставьте данные в созданную стороннюю таблицу:

    INSERT INTO customers_f_rest (
        id,
        first_name,
        last_name
        )
        VALUES (3, 'Bob', 'Brown'),
               (4, 'Jane', 'Smith');
  6. Выполните повторный запрос к созданной сторонней таблице:

    SELECT * FROM customers_f_rest;

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

     id | first_name | last_name
    ----+------------+-----------
      1 | John       | Doe
      2 | Jane       | Doe
      3 | Bob        | Brown
      4 | Jane       | Smith
    (4 rows)
  7. Подключитесь к REST-каталогу Iceberg и выполните запрос к таблице customers.data:

    SELECT * FROM customers.data;

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

    1       John    Doe
    2       Jane    Doe
    3       Bob     Brown
    4       Jane    Smith
    Time taken: 0.194 seconds, Fetched 4 row(s)

    Затем удалите добавленные строки, чтобы вернуть тестовую таблицу в исходное состояние:

    DELETE FROM customers.data WHERE id IN (3,4);

Использование каталога Hive Metastore

Подготовка исходных данных

  1. На хосте HiveClient запустите командную строку Hive:

    $ hive
  2. Создайте таблицу Hive customers в базе данных default для хранения тестового набора данных. Выражение STORED BY ICEBERG указывает, что таблица создается в формате Iceberg:

    CREATE TABLE customers (
        id INT,
        first_name STRING,
        last_name STRING 
        )
        STORED BY ICEBERG;
  3. Заполните созданную таблицу тестовыми данными:

    INSERT INTO customers (
        id,
        first_name,
        last_name
        )
        VALUES (1, 'John', 'Doe'),
               (2, 'Jane', 'Doe');
  4. Выполните запрос к созданной таблице, чтобы убедиться, что данные загружены:

    SELECT * FROM customers;

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

    +---------------+-----------------------+----------------------+
    | customers.id  | customers.first_name  | customers.last_name  |
    +---------------+-----------------------+----------------------+
    | 1             | John                  | Doe                  |
    | 2             | Jane                  | Doe                  |
    +---------------+-----------------------+----------------------+
    2 rows selected (0.171 seconds)

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

  1. На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на ранее созданную таблицу Iceberg default.customers. В выражении LOCATION укажите PXF-профиль iceberg и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_import — встроенную кастомную функцию форматирования для операций чтения:

    CREATE EXTERNAL TABLE customers_r_hive (
        id INT, 
        first_name TEXT, 
        last_name TEXT
        )
        LOCATION ('pxf://default.customers?PROFILE=iceberg&SERVER=iceberg')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
  2. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_r_hive;

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

     id | first_name | last_name
    ----+------------+-----------
      1 | John       | Doe
      2 | Jane       | Doe
    (2 rows)

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

  1. На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, ссылающуюся на ранее созданную таблицу Iceberg default.customers. В выражении LOCATION укажите PXF-профиль iceberg и конфигурацию сервера. В выражении FORMAT укажите pxfwritable_export — встроенную кастомную функцию форматирования для операций записи:

    CREATE WRITABLE EXTERNAL TABLE customers_w_hive (
        id INT, 
        first_name TEXT, 
        last_name TEXT
        )
        LOCATION ('pxf://default.customers?PROFILE=iceberg&SERVER=iceberg')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export');
  2. Вставьте данные в созданную таблицу:

    INSERT INTO customers_w_hive (
        id,
        first_name,
        last_name
        )
        VALUES (3, 'Bob', 'Brown'),
               (4, 'Jane', 'Smith');
  3. На хосте HiveClient выполните запрос к таблице Iceberg customers:

    SELECT * FROM customers;

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

    +---------------+-----------------------+----------------------+
    | customers.id  | customers.first_name  | customers.last_name  |
    +---------------+-----------------------+----------------------+
    | 1             | John                  | Doe                  |
    | 2             | Jane                  | Doe                  |
    | 3             | Bob                   | Brown                |
    | 4             | Jane                  | Smith                |
    +---------------+-----------------------+----------------------+
    4 rows selected (0.371 seconds)

    Затем удалите добавленные строки, чтобы вернуть тестовую таблицу в исходное состояние:

    DELETE FROM customers WHERE id IN (3,4);

Создание сторонней таблицы

  1. На мастер-хосте Greengage DB создайте сторонний сервер, использующий обертку сторонних данных iceberg_pxf_fdw и ссылающийся на Hive Metastore-каталог Iceberg. В выражении OPTIONS присвойте параметру catalog_type значение HIVE_METASTORE и укажите URI сервера Hive Metastore и имя Iceberg-каталога Hive Metastore:

    CREATE SERVER iceberg_hive_server
        FOREIGN DATA WRAPPER iceberg_pxf_fdw
        OPTIONS (catalog_type 'HIVE_METASTORE', 
                 uri 'thrift://hive-metastore:9083', 
                 catalog_name 'iceberg_hive');
  2. Создайте сопоставление пользователя, которое будет обрабатывать аутентификацию на сервере Iceberg Hive Metastore. В выражении SERVER укажите ранее созданный сервер iceberg_hive_server:

    CREATE USER MAPPING FOR CURRENT_USER
        SERVER iceberg_hive_server;
  3. Создайте стороннюю таблицу, чья структура совпадает со структурой таблицы default.customers, изначально созданной в Hive Metastore-каталоге Iceberg. В выражении SERVER укажите ранее созданный сервер iceberg_hive_server; в выражении OPTIONS укажите имя ранее созданной таблицы default.customers:

    CREATE FOREIGN TABLE customers_f_hive (
        id INT, 
        first_name TEXT, 
        last_name TEXT
        )
        SERVER iceberg_hive_server
        OPTIONS (resource 'default.customers');
  4. Выполните запрос к созданной сторонней таблице:

    SELECT * FROM customers_f_hive;

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

     id | first_name | last_name
    ----+------------+-----------
      1 | John       | Doe
      2 | Jane       | Doe
    (2 rows)
  5. Вставьте данные в созданную стороннюю таблицу:

    INSERT INTO customers_f_hive (
        id,
        first_name,
        last_name
        )
        VALUES (3, 'Bob', 'Brown'),
               (4, 'Jane', 'Smith');
  6. На хосте HiveClient выполните запрос к таблице customers:

    SELECT * FROM customers;

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

    +---------------+-----------------------+----------------------+
    | customers.id  | customers.first_name  | customers.last_name  |
    +---------------+-----------------------+----------------------+
    | 1             | John                  | Doe                  |
    | 2             | Jane                  | Doe                  |
    | 3             | Bob                   | Brown                |
    | 4             | Jane                  | Smith                |
    +---------------+-----------------------+----------------------+
    4 rows selected (0.132 seconds)

    Затем удалите добавленные строки, чтобы вернуть тестовую таблицу в исходное состояние:

    DELETE FROM customers WHERE id IN (3,4);