Использование коннектора 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; выборка и вставка данных в сторонние таблицы не поддерживаются.
Протокол |
Более ранняя |
Более ранняя |
Требуемая |
Нет |
Нет |
Настройка коннектора PXF Iceberg
Для того чтобы использовать коннектор PXF Iceberg с внешними таблицами, необходимо создать конфигурацию сервера, как описано в статье Настройка PXF-сервера в документации PXF, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
На мастер-хосте Greengage DB войдите под пользователем
gpadmin. -
Измените текущий каталог на $PXF_BASE/servers и создайте каталог конфигурации сервера (например, с именем iceberg):
$ mkdir $PXF_BASE/servers/iceberg $ cd $PXF_BASE/servers/iceberg -
В каталоге конфигурации сервера создайте файл 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> -
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Параметры конфигурации сервера
| Опция | Параметр конфигурации сервера | Описание |
|---|---|---|
uri |
iceberg.param.uri |
URI каталога Iceberg |
catalog_type |
iceberg.config.catalog.type |
Тип каталога Iceberg ( |
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 с помощью сторонних таблиц необходимо создать обертку сторонних данных.
-
На мастер-хосте 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)
-
Создайте расширение, регистрирующее обертку
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 с использованием внешних и сторонних таблиц.
Использование каталога REST
Подготовка исходных данных
-
Подключитесь к REST-каталогу Iceberg и создайте тестовую базу данных:
CREATE DATABASE IF NOT EXISTS customers; -
Создайте тестовую таблицу:
CREATE TABLE customers.data ( id INT, first_name VARCHAR(20), last_name VARCHAR(20) ); -
Заполните созданную таблицу тестовыми данными:
INSERT INTO customers.data VALUES (1, 'John', 'Doe'), (2, 'Jane', 'Doe'); -
Выполните запрос к созданной таблице:
SELECT * FROM customers.data;Вывод должен выглядеть следующим образом:
1 John Doe 2 Jane Doe Time taken: 0.26 seconds, Fetched 2 row(s)
Создание читающей внешней таблицы
-
На мастер-хосте 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'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r_rest;Вывод должен выглядеть следующим образом:
id | first_name | last_name ----+------------+----------- 1 | John | Doe 2 | Jane | Doe (2 rows)
Создание пишущей внешней таблицы
-
На мастер-хосте 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'); -
Вставьте данные в созданную таблицу:
INSERT INTO customers_w_rest ( id, first_name, last_name ) VALUES (3, 'Bob', 'Brown'), (4, 'Jane', 'Smith'); -
Подключитесь к 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);
Создание сторонней таблицы
-
На мастер-хосте Greengage DB создайте сторонний сервер, использующий обертку сторонних данных
iceberg_pxf_fdwи ссылающийся на REST-каталог Iceberg:CREATE SERVER iceberg_rest_server FOREIGN DATA WRAPPER iceberg_pxf_fdw OPTIONS (uri 'http://iceberg-rest:8181'); -
Создайте сопоставление пользователя, которое будет обрабатывать аутентификацию на 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'); -
Создайте стороннюю таблицу, чья структура совпадает со структурой таблицы
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'); -
Выполните запрос к созданной сторонней таблице:
SELECT * FROM customers_f_rest;Вывод должен выглядеть следующим образом:
id | first_name | last_name ----+------------+----------- 1 | John | Doe 2 | Jane | Doe (2 rows)
-
Вставьте данные в созданную стороннюю таблицу:
INSERT INTO customers_f_rest ( id, first_name, last_name ) VALUES (3, 'Bob', 'Brown'), (4, 'Jane', 'Smith'); -
Выполните повторный запрос к созданной сторонней таблице:
SELECT * FROM customers_f_rest;Вывод должен выглядеть следующим образом:
id | first_name | last_name ----+------------+----------- 1 | John | Doe 2 | Jane | Doe 3 | Bob | Brown 4 | Jane | Smith (4 rows)
-
Подключитесь к 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
Подготовка исходных данных
-
На хосте HiveClient запустите командную строку Hive:
$ hive -
Создайте таблицу Hive
customersв базе данныхdefaultдля хранения тестового набора данных. ВыражениеSTORED BY ICEBERGуказывает, что таблица создается в формате Iceberg:CREATE TABLE customers ( id INT, first_name STRING, last_name STRING ) STORED BY ICEBERG; -
Заполните созданную таблицу тестовыми данными:
INSERT INTO customers ( id, first_name, last_name ) VALUES (1, 'John', 'Doe'), (2, 'Jane', 'Doe'); -
Выполните запрос к созданной таблице, чтобы убедиться, что данные загружены:
SELECT * FROM customers;Вывод должен выглядеть следующим образом:
+---------------+-----------------------+----------------------+ | customers.id | customers.first_name | customers.last_name | +---------------+-----------------------+----------------------+ | 1 | John | Doe | | 2 | Jane | Doe | +---------------+-----------------------+----------------------+ 2 rows selected (0.171 seconds)
Создание читающей внешней таблицы
-
На мастер-хосте 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'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r_hive;Вывод должен выглядеть следующим образом:
id | first_name | last_name ----+------------+----------- 1 | John | Doe 2 | Jane | Doe (2 rows)
Создание пишущей внешней таблицы
-
На мастер-хосте 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'); -
Вставьте данные в созданную таблицу:
INSERT INTO customers_w_hive ( id, first_name, last_name ) VALUES (3, 'Bob', 'Brown'), (4, 'Jane', 'Smith'); -
На хосте 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);
Создание сторонней таблицы
-
На мастер-хосте 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'); -
Создайте сопоставление пользователя, которое будет обрабатывать аутентификацию на сервере Iceberg Hive Metastore. В выражении
SERVERукажите ранее созданный серверiceberg_hive_server:CREATE USER MAPPING FOR CURRENT_USER SERVER iceberg_hive_server; -
Создайте стороннюю таблицу, чья структура совпадает со структурой таблицы
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'); -
Выполните запрос к созданной сторонней таблице:
SELECT * FROM customers_f_hive;Вывод должен выглядеть следующим образом:
id | first_name | last_name ----+------------+----------- 1 | John | Doe 2 | Jane | Doe (2 rows)
-
Вставьте данные в созданную стороннюю таблицу:
INSERT INTO customers_f_hive ( id, first_name, last_name ) VALUES (3, 'Bob', 'Brown'), (4, 'Jane', 'Smith'); -
На хосте 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);