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

Использование коннектора PXF object store для чтения и записи данных в формате ORC между Greengage DB и S3

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

Формат файлов Optimized Row Columnar (ORC) используется для колоночного хранения данных и обеспечивает лучшее сжатие и производительность по сравнению с форматами text и RCFile. ORC поддерживает типы данных и специально разработан для рабочих нагрузок Hadoop. В файле ORC хранится как тип данных, так и информация о его кодировании.

В файле ORC все столбцы в пределах одной группы строк данных, также известной как страйп (stripe), хранятся на диске вместе. Колоночная структура формата позволяет выполнять проецирование столбцов при операциях чтения, что помогает избежать доступа к ненужным столбцам во время запроса. ORC также поддерживает pushdown предикатов с использованием встроенных индексов на уровне файла, страйпа и строки, перенося операцию фильтрации на фазу загрузки данных. Коннектор поддерживает версии файлов ORC v0 и v1.

В этой статье описывается настройка и использование коннектора PXF object store для чтения и записи данных ORC в объектном хранилище с использованием внешних таблиц, а также приводятся практические примеры.

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

Для чтения и записи примитивных типов ORC в Greengage DB необходимо сопоставить значения данных со столбцами Greengage DB того же типа.

Сопоставление при чтении

Для чтения примитивных типов ORC в Greengage DB необходимо сопоставить значения данных со столбцами Greengage DB того же типа, используя следующее сопоставление.

Физический тип данных ORC Логический тип данных ORC Тип данных PXF / Greengage DB

binary

decimal

NUMERIC

binary

timestamp

TIMESTAMP

byte[]

string

TEXT

byte[]

char

BPCHAR

byte[]

varchar

VARCHAR

byte[]

binary

BYTEA

Double

float

REAL

Double

double

FLOAT8

Integer

boolean (1 бит)

BOOLEAN

Integer

tinyint (8 бит)

SMALLINT

Integer

smallint (16 бит)

SMALLINT

Integer

int (32 бита)

INTEGER

Integer

bigint (64 бита)

BIGINT

Integer

date

DATE

PXF поддерживает составной тип list для некоторой части скалярных типов. Составные типы map, union и struct не поддерживаются.

Составной тип данных ORC Тип данных PXF / Greengage DB

array<string>

TEXT[]

array<char>

BPCHAR[]

array<varchar>

VARCHAR[]

array<binary>

BYTEA[]

array<float>

REAL[]

array<double>

FLOAT8[]

array<boolean>

BOOLEAN[]

array<tinyint>

SMALLINT[]

array<smallint>

SMALLINT[]

array<int>

INTEGER[]

array<bigint>

BIGINT[]

Сопоставление при записи

При записи данных ORC в PXF используется следующее сопоставление типов данных.

Тип данных PXF / Greengage DB Логический тип данных ORC Физический тип данных ORC

NUMERIC

decimal

binary

TIMESTAMP (1)

timestamp

binary

TIMESTAMPTZ

timestamp с местным часовым поясом

timestamp

TEXT

string

byte[]

BPCHAR

char

byte[]

VARCHAR

varchar

byte[]

BYTEA

binary

byte[]

REAL

float

Double

FLOAT8

double

Double

BOOLEAN

boolean (1 бит)

Integer

SMALLINT

tinyint (8 бит)

Integer

SMALLINT

smallint (16 бит)

Integer

INTEGER

int (32 бита)

Integer

BIGINT

bigint (64 бита)

Integer

DATE

date

Integer

UUID

string

byte[]

  1. С помощью свойства pxf.orc.write.timezone.utc конфигурационного файла pxf-site.xml сервера PXF можно выбрать, как PXF должен записывать во внешний источник данные типа TIMESTAMP. По умолчанию тип TIMESTAMP записывается во всемирном координированном времени (UTC). Для записи данных типа TIMESTAMP в формате местного часового пояса виртуальной машины Java (JVM), используемой PXF, укажите для pxf.orc.write.timezone.utc значение false.

ПРИМЕЧАНИЕ

Подробная информация о конфигурировании сервера PXF приведена в статье Настройка PXF-сервера документации PXF.

PXF поддерживает запись данных ORC составного типа list в случае одномерных массивов всех вышеперечисленных примитивных типов. Составные типы map, union, struct и пользовательские схемы не поддерживаются.

Тип данных PXF / Greengage DB Составной тип данных ORC

NUMERIC[]

array<decimal>

TIMESTAMP[]

array<timestamp>

TEXT[]

array<string>

BPCHAR[]

array<char>

VARCHAR[]

array<varchar>

BYTEA[]

array<binary>

REAL[]

array<float>

FLOAT8[]

array<double>

BOOLEAN[]

array<boolean>

SMALLINT[]

array<tinyint>

SMALLINT[]

array<smallint>

INTEGER[]

array<int>

BIGINT[]

array<bigint>

DATE[]

array<date>

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

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

CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
    ( <column_name> <data_type> [, ...] | LIKE <other_table> )
    LOCATION ('pxf://<path_to_data>?PROFILE=<objstore>:orc[&<custom_option>=<value>[...]]')
    FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'|'pxfwritable_export')
    [DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
Ключевое слово Значение

<table_name>

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

<column_name>

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

<data_type>

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

LIKE <other_table>

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

<path_to_data>

Путь к каталогу или файлу в объектном хранилище. Если в конфигурации сервера <server_name> указано свойство pxf.fs.basePath, значение <path_to_data> трактуется как относительный путь к указанному базовому пути. В противном случае путь считается абсолютным. Значение пути не должно содержать символ $

PROFILE=<objstore>:orc

Профиль указывается в виде пары <objstore>:orc, где <objstore> — префикс объектного хранилища.

Поддерживаются следующие префиксы <objstore> и соответствующие объектные хранилища:

  • wasbs — Azure Blob Storage

  • adl — Azure Data Lake

  • gs — Google Cloud Storage

  • s3 — Amazon S3, MinIO и прочие S3-совместимые объектные хранилища

FORMAT 'CUSTOM'

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

DISTRIBUTED BY

При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных

<custom_option>

Одна из опций, описанных ниже, указываемая в строке LOCATION

SERVER=<server_name>

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

IGNORE_MISSING_PATH

Действие, которое необходимо выполнить, если <path_to_data> отсутствует или указан неверно. Если установлено значение false (по умолчанию), возвращается ошибка. Если установлено значение true, PXF игнорирует ошибку и возвращает пустой фрагмент. Применяется только для читающих внешних таблиц; в случае пишущих внешних таблиц игнорируется

MAP_BY_POSITION

Указывает, должны ли столбцы сопоставляться по их порядку. Значение по умолчанию — false: PXF сопоставляет столбец ORC столбцу Greengage DB по имени

COMPRESSION_CODEC

Кодек сжатия, используемый при записи данных: lz4, lzo, zstd, snappy, zlib или none.

Если сжатия данных не требуется, следует явно указать значение none. В противном случае выполняется сжатие с помощью кодека Zlib

Условия переполнения числовых данных

Для записи числовых данных в формат данных ORC через коннектор PXF используется класс HiveDecimal, в котором как точность, так и масштаб числового типа ограничены максимальным значением 38. При определении столбца внешней таблицы с типом NUMERIC без указания точности и масштаба PXF неявно сопоставляет столбец типу DECIMAL(38, 18).

PXF обрабатывает следующие условия переполнения числовых данных:

  • Столбец внешней таблицы определен с типом NUMERIC, при этом общее количество цифр значения превышает максимально допустимую точность в 38, например 1234567890123456789012345678901234567890.12345, в котором общее количество цифр — 45.

  • Столбец внешней таблицы определен с типом NUMERIC(<precision>) и точностью (<precision>), превышающей 38, например NUMERIC(55).

  • Столбец внешней таблицы определен с типом NUMERIC, при этом количество цифр в целой части значения превышает 20 (38-18), например 123456789012345678901234567890.12345, в котором количество цифр целой части — 30.

Если определяется столбец с типом NUMERIC(<precision>, <scale>), в котором количество цифр в целой части значения превышает величину <precision>-<scale>, PXF возвращает ошибку. Например, определен столбец NUMERIC(20,4) со значением 12345678901234567.12, в котором количество цифр целой части равно 17, что превышает 20-4=16.

При обнаружении переполнения числовых данных PXF выполняет одно из следующих действий: округляет значение (по умолчанию), возвращает ошибку или игнорирует переполнение. Выполняемое действие указывается с помощью свойства pxf.orc.write.decimal.overflow конфигурационного файла pxf-site.xml сервера PXF.

Значение Действие PXF

round

Действие по умолчанию. При обнаружении переполнения PXF пытается округлить значение для соответствия требованиям точности и масштаба перед записью и возвращает ошибку, если округление не удалось. Это может потенциально привести к неполному набору данных во внешней системе

error

PXF возвращает ошибку при обнаружении переполнения, и транзакция прерывается

ignore

PXF возвращает предупреждение и пытается округлить значение для соответствия требованиям точности и масштаба; если округление не удалось, записывается значение NULL

ПРИМЕЧАНИЕ

Подробная информация о конфигурировании сервера PXF приведена в статье Настройка PXF-сервера документации PXF.

Примеры

Эти примеры демонстрируют настройку и использование коннектора PXF object store для чтения и записи данных ORC в объектном хранилище с помощью внешних таблиц.

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

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

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

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

  2. Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера S3 с именем s3. Скопируйте необходимый для используемого объектного хранилища файл конфигурации сервера из $PXF_HOME/templates в $PXF_BASE/servers/s3. В примере используется файл конфигурации на основе шаблона minio-site.xml.

    $ mkdir $PXF_BASE/servers/s3
    $ cd $PXF_BASE/servers/s3
    $ cp $PXF_HOME/templates/minio-site.xml .

    В файле конфигурации укажите необходимые данные для подключения к объектному хранилищу:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <property>
            <name>fs.s3a.endpoint</name>
            <value>storage.example.com</value>
        </property>
        <property>
            <name>fs.s3a.access.key</name>
            <value>${ACCESS_KEY}</value>
        </property>
        <property>
            <name>fs.s3a.secret.key</name>
            <value>${SECRET_KEY}</value>
        </property>
        <property>
            <name>fs.s3a.fast.upload</name>
            <value>true</value>
        </property>
        <property>
            <name>fs.s3a.path.style.access</name>
            <value>true</value>
        </property>
    </configuration>
    ПРИМЕЧАНИЕ

    Обратите внимание, что учетные данные для подключения к объектному хранилищу указываются в виде переменных окружения ACCESS_KEY и SECRET_KEY.

    Установить значения этих переменных можно следующим образом:

    $ export ACCESS_KEY=<access_key>
    $ export SECRET_KEY=<secret_key>

    Учетные данные в файле конфигурации можно указать и в виде обычного текста, но в целях безопасности рекомендуется использовать переменные окружения.

  3. Синхронизируйте конфигурацию между хостами кластера Greengage DB:

    $ pxf cluster sync

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

  1. В каталоге /tmp на локальной машине подготовьте набор тестовых данных.

    1. Создайте файл с именем customers.json и следующим содержимым:

      {"id": 1,"name": "John Doe","ordered_items":["laptop", "monitor"]}
      {"id": 2,"name": "Jane Smith","ordered_items":["keyboard", "mouse", "pad"]}
      {"id": 3,"name": "Bob Brown","ordered_items":["headphones", "laptop"]}
      {"id": 4,"name": "Alice Green","ordered_items":["webcam", "microphone", "mouse"]}

      В файле используются следующие имена полей и типы данных:

      • id — INT;

      • name — TEXT;

      • ordered_items — TEXT[].

    2. Загрузите последнюю версию JAR-файла ORC Java tools из Maven Central в каталог /tmp и преобразуйте файл customers.json в формат ORC:

      $ curl -O https://repo1.maven.org/maven2/org/apache/orc/orc-tools/2.2.2/orc-tools-2.2.2-uber.jar
      $ java -jar /tmp/orc-tools-2.2.2-uber.jar convert /tmp/customers.json \
          --schema 'struct<id:int,name:string,ordered_items:array<string>>' \
          -o /tmp/customers.orc
  2. Добавьте сгенерированный файл ORC в бакет customers на хосте S3.

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

    CREATE EXTERNAL TABLE customers_r (
            id INT,
            name TEXT,
            ordered_items TEXT[]
        )
        LOCATION('pxf://customers/customers.orc?PROFILE=s3:orc&SERVER=s3')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
  4. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_r;

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

      id |    name     |       ordered_items
    ----+-------------+---------------------------
      1 | John Doe    | {laptop,monitor}
      2 | Jane Smith  | {keyboard,mouse,pad}
      3 | Bob Brown   | {headphones,laptop}
      4 | Alice Green | {webcam,microphone,mouse}
    (4 rows)
  5. Выполните запрос, возвращающий строки столбца ordered_items, содержащие значения laptop или monitor:

    SELECT * FROM customers_r WHERE ordered_items && '{"laptop", "monitor"}';

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

     id |   name    |    ordered_items
    ----+-----------+---------------------
      1 | John Doe  | {laptop,monitor}
      3 | Bob Brown | {headphones,laptop}
    (2 rows)
  6. Выполните запрос, возвращающий строки столбца ordered_items, первое значение которых — headphones:

    SELECT * FROM customers_r WHERE ordered_items[1] = 'headphones';

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

     id |   name    |    ordered_items
    ----+-----------+---------------------
      3 | Bob Brown | {headphones,laptop}
    (1 row)

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

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

    CREATE WRITABLE EXTERNAL TABLE customers_w (
            id INT,
            name TEXT, 
            ordered_items TEXT[]    
        )
        LOCATION ('pxf://customers/customers_w?PROFILE=s3:orc&SERVER=s3&COMPRESSION_CODEC=none')
        FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export');
  2. Вставьте тестовые данные в таблицу customers_w:

    INSERT INTO customers_w 
    VALUES (1, 'Bob Brown', ARRAY['monitor', 'webcam']),
           (2, 'John Doe', ARRAY['keyboard', 'microphone']),
           (3, 'Alice Green', ARRAY['headphones', 'pad']),
           (4, 'Jane Smith', ARRAY['laptop', 'mouse']);
  3. Скопируйте каталог customers_w из бакета S3 в каталог /tmp на локальной машине и просмотрите содержимое файлов:

    $ java -jar /tmp/orc-tools-2.2.2-uber.jar meta -d /tmp/customers_w

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

    Processing data file file:/tmp/customers_w/204-0000000021_0.orc [length: 600]
    {"id":2,"name":"John Doe","ordered_items":["keyboard","microphone"]}
    ______________________________________________________________________________
    Processing data file file:/tmp/customers_w/204-0000000021_1.orc [length: 587]
    {"id":1,"name":"Bob Brown","ordered_items":["monitor","webcam"]}
    ______________________________________________________________________________
    Processing data file file:/tmp/customers_w/204-0000000021_3.orc [length: 602]
    {"id":3,"name":"Alice Green","ordered_items":["headphones","pad"]}
    ______________________________________________________________________________
    Processing data file file:/tmp/customers_w/204-0000000021_2.orc [length: 586]
    {"id":4,"name":"Jane Smith","ordered_items":["laptop","mouse"]}
    ______________________________________________________________________________