Использование коннектора PXF HDFS для чтения и записи данных в формате ORC между Greengage DB и HDFS
Формат файлов Optimized Row Columnar (ORC) — это формат хранения данных с колоночным хранением, который предлагает улучшения по сравнению с форматами text и RCFile как в плане сжатия, так и производительности. ORC поддерживает типы данных и специально разработан для рабочих нагрузок Hadoop. В файле ORC хранится как тип данных, так и информация о его кодировании.
В файле ORC все столбцы в пределах одной группы строк данных, также известной как страйп (stripe), хранятся на диске вместе. Колоночная структура формата позволяет выполнять проецирование столбцов при операциях чтения, что помогает избежать доступа к ненужным столбцам во время запроса. ORC также поддерживает pushdown предикатов с использованием встроенных индексов на уровне файла, страйпа и строки, перенося операцию фильтрации на фазу загрузки данных. PXF HDFS-коннектор поддерживает версии файлов ORC v0 и v1.
В этой статье описывается настройка и использование коннектора PXF HDFS для чтения и записи данных ORC в HDFS с использованием внешних таблиц, а также приводятся практические примеры.
Сопоставление типов данных
Для чтения и записи примитивных типов ORC в Greengage DB необходимо сопоставить значения данных со столбцами Greengage DB того же типа.
Профиль hdfs:orc поддерживает чтение и запись скалярных типов и массивов некоторых скалярных типов в файлах ORC.
Если данные хранятся в таблице Hive и требуется чтение сложных типов или таблица Hive партиционирована, используйте профиль hive:orc.
Сопоставление при чтении
Для чтения примитивных типов 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 |
Integer |
|
SMALLINT |
Integer |
|
SMALLINT |
Integer |
|
INTEGER |
Integer |
|
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 |
|
Integer |
SMALLINT |
|
Integer |
SMALLINT |
|
Integer |
INTEGER |
|
Integer |
BIGINT |
|
Integer |
DATE |
date |
Integer |
UUID |
string |
byte[] |
-
С помощью свойства
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 в HDFS, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=hdfs:orc[&<custom_option>=<value>[...]]')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'|'pxfwritable_export')
[DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
| Keyword | Value |
|---|---|
<table_name> |
Имя создаваемой таблицы |
<column_name> |
Имя создаваемого столбца |
<data_type> |
Тип данных создаваемого столбца |
LIKE <other_table> |
Указывает таблицу, из которой внешняя таблица копирует все имена столбцов, типы данных и политику распределения |
<path_to_data> |
Путь к каталогу или файлу в хранилище HDFS.
Если в конфигурации сервера Коннектор PXF HDFS считывает данные в формате ORC порциями по 1024 строки |
PROFILE |
Для чтения и записи данных в формате ORC в HDFS используется профиль |
FORMAT ‘CUSTOM’ |
Для чтения и записи данных в формате ORC в HDFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
MAP_BY_POSITION |
Указывает, должны ли столбцы сопоставляться по их порядку.
Значение по умолчанию — |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: Если значение не указано, автоматически выполняется сжатие с помощью кодека 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 возвращает предупреждение и пытается округлить значение для соответствия требованиям точности и масштаба; если округление не удалось, записывается значение |
Подробную информацию о конфигурировании сервера PXF приведена в статье Настройка PXF-сервера документации PXF.
Примеры
Эти примеры демонстрируют, как настроить и использовать коннектор PXF HDFS для чтения и записи данных ORC между Greengage DB и HDFS с использованием внешних таблиц.
Конфигурирование коннектора PXF HDFS
Для того чтобы подключиться к HDFS с помощью PXF, необходимо создать конфигурацию сервера, как описано в статье Настройка коннекторов PXF Hadoop документации PXF, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
Подключитесь к мастер-хосту Greengage DB как
gpadmin. -
Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера Hadoop с именем hadoop:
$ mkdir $PXF_BASE/servers/hadoop $ cd $PXF_BASE/servers/hadoop -
Скопируйте файлы конфигурации 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 . -
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Создание читающей внешней таблицы
-
В каталоге /tmp на хосте HDFS создайте файл с именем 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[].
-
-
Загрузите последнюю версию 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 -
Создайте HDFS-каталог /tmp/pxf_examples для хранения файлов с тестовыми данными PXF и добавьте в HDFS созданный файл ORC:
$ hdfs dfs -mkdir -p /tmp/pxf_examples $ hdfs dfs -put /tmp/customers.orc /tmp/pxf_examples/ -
На мастер-хосте Greengage DB создайте внешнюю таблицу, ссылающуюся на файл customers.orc. В выражении
LOCATIONукажите PXF-профильhdfs:orcи конфигурацию сервера. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_r ( id INT, name TEXT, ordered_items TEXT[] ) LOCATION('pxf://tmp/pxf_examples/customers.orc?PROFILE=hdfs:orc&SERVER=hadoop') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
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) -
Выполните запрос, возвращающий строки столбца
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) -
Выполните запрос, возвращающий строки столбца
ordered_items, первое значение которых —headphones:SELECT * FROM customers_r WHERE ordered_items[1] = 'headphones';Вывод должен выглядеть следующим образом:
id | name | ordered_items ----+-----------+--------------------- 3 | Bob Brown | {headphones,laptop} (1 row)
Создание пишущей внешней таблицы
-
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в HDFS-каталог /tmp/pxf_examples/customers_w. В выражении
LOCATIONукажите PXF-профильhdfs:orcи конфигурацию сервера, а параметруCOMPRESSION_CODECприсвойте значениеnone, чтобы отключить сжатие данных. В выраженииFORMATукажитеpxfwritable_export— встроенную кастомную функцию форматирования для операций записи:CREATE WRITABLE EXTERNAL TABLE customers_w( id INT, name TEXT, ordered_items TEXT[] ) LOCATION ('pxf://tmp/pxf_examples/customers_w?PROFILE=hdfs:orc&SERVER=hadoop&COMPRESSION_CODEC=none') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export'); -
Вставьте тестовые данные в таблицу
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']); -
Скопируйте HDFS-каталог /tmp/pxf_examples/customers_w в локальный каталог /tmp:
$ hdfs dfs -get -f /tmp/pxf_examples/customers_w /tmp -
Просмотрите содержимое файла в каталоге /tmp/customers_w:
$ java -jar /tmp/orc-tools-2.2.2-uber.jar meta -d /tmp/customers_w/39-0000000016_2.orcВывод должен выглядеть следующим образом:
Processing data file /tmp/customers_w/39-0000000016_2.orc [length: 675] {"id":1,"name":"Bob Brown","ordered_items":["monitor","webcam"]} {"id":2,"name":"John Doe","ordered_items":["keyboard","microphone"]} {"id":3,"name":"Alice Green","ordered_items":["headphones","pad"]} {"id":4,"name":"Jane Smith","ordered_items":["laptop","mouse"]} ______________________________________________________________________