Использование коннектора PXF object store для чтения и записи данных в формате SequenceFile между Greengage DB и S3
Формат SequenceFile является распространенным форматом передачи данных между задачами MapReduce. Файлы данного типа состоят из бинарных пар ключ/значение.
В этой статье описывается настройка и использование коннектора PXF object store для чтения и записи данных SequenceFile в объектном хранилище с использованием внешних таблиц, а также приводятся практические примеры.
Создание внешней таблицы с использованием протокола PXF
Чтобы создать внешнюю таблицу Greengage DB для чтения и записи данных SequenceFile в объектном хранилище, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=<objstore>:SequenceFile&DATA_SCHEMA=<data_schema>[&<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> |
Путь к каталогу или файлу в объектном хранилище.
Если в конфигурации сервера |
PROFILE=<objstore>:SequenceFile |
Профиль указывается в виде пары Поддерживаются следующие префиксы
|
DATA_SCHEMA=<data_schema> |
Имя класса, реализующего сериализацию/десериализацию и предоставляющего методы чтения и записи для каждого типа данных, указанного в схеме данных. JAR-файл, содержащий этот класс, должен находиться в пути к классам PXF. Опция является обязательной, а значение по умолчанию отсутствует |
FORMAT 'CUSTOM' |
Для чтения и записи данных SequenceFile в объектном хранилище используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным.
Если опция опущена, используется конфигурация сервера с именем |
IGNORE_MISSING_PATH |
Действие, которое необходимо выполнить, если |
COMPRESSION_TYPE |
Тип сжатия, применяемый при записи данных: на уровне записи ( |
COMPRESSION_CODEC |
Кодек сжатия, используемый при записи данных: |
Чтение ключа записи
Когда внешняя таблица Greengage DB ссылается на SequenceFile или другой формат данных, хранящий строки в виде пар ключ/значение, получить доступ к значениям ключей в запросах Greengage DB можно с помощью ключевого слова recordkey, указанного в качестве имени поля.
Тип поля recordkey должен соответствовать типу ключа.
Вы можете определить recordkey с любым из следующих типов Hadoop:
-
BooleanWritable -
ByteWritable -
DoubleWritable -
FloatWritable -
IntWritable -
LongWritable -
Text
Если у строки не определен ключ записи, Greengage DB возвращает ID сегмента, обработавшего строку.
Примеры
Эти примеры демонстрируют настройку и использование коннектора PXF object store для чтения и записи данных SequenceFile в объектном хранилище с помощью внешних таблиц.
Конфигурирование коннектора PXF S3
Для того чтобы подключиться к объектному хранилищу с помощью PXF, необходимо создать соответствующую конфигурацию сервера, а затем синхронизировать конфигурацию между хостами кластера Greengage DB:
-
На мастер-хосте Greengage DB войдите под пользователем
gpadmin. -
Перейдите в каталог $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>Учетные данные в файле конфигурации можно указать и в виде обычного текста, но в целях безопасности рекомендуется использовать переменные окружения.
-
Синхронизируйте конфигурацию между хостами кластера Greengage DB:
$ pxf cluster sync
Создание пишущей внешней таблицы
-
В каталоге /tmp на локальной машине подготовьте структуру каталогов для Java-класса сериализации/десериализации и создайте файл CustomerWritable.java:
$ mkdir -p /tmp/pxf_seqfile_example/com/example/pxf/hdfs/writable/dataschema $ cd /tmp/pxf_seqfile_example/com/example/pxf/hdfs/writable/dataschema $ vi CustomerWritable.java -
Добавьте в файл CustomerWritable.java следующее содержимое:
package com.example.pxf.hdfs.writable.dataschema; import org.apache.hadoop.io.*; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.lang.reflect.Field; public class CustomerWritable implements Writable { public int int1; public String st1, st2, st3; public CustomerWritable() { int1 = 0; st1 = ""; st2 = ""; st3 = ""; } int getInt1() { return int1; } String getSt1() { return st1; } String getSt2() { return st2; } String getSt3() { return st3; } @Override public void write(DataOutput out) throws IOException { IntWritable intw = new IntWritable(); intw.set(int1); intw.write(out); Text txt = new Text(); txt.set(st1); txt.write(out); txt.set(st2); txt.write(out); txt.set(st3); txt.write(out); } @Override public void readFields(DataInput in) throws IOException { IntWritable intw = new IntWritable(); intw.readFields(in); int1 = intw.get(); Text txt = new Text(); txt.readFields(in); st1 = txt.toString(); txt.readFields(in); st2 = txt.toString(); txt.readFields(in); st3 = txt.toString(); } } -
Сохраните и закройте файл.
-
Скомпилируйте Java-класс
CustomerWritableи упакуйте полученный файл CustomerWritable.class в JAR-архив. Укажите путь к классам, содержащий файл hadoop-common.jar системы Hadoop, и скопируйте полученный файл customerwritable.jar в каталог /tmp:$ javac -classpath /usr/lib/hadoop/hadoop-common.jar CustomerWritable.java $ cd /tmp/pxf_seqfile_example/ $ jar cf customerwritable.jar com $ cp customerwritable.jar /tmp/ -
Скопируйте файл customerwritable.jar на мастер-хост Greengage DB, например:
$ scp /tmp/customerwritable.jar gpadmin@mdw:/home/gpadmin -
На мастер-хосте Greengage DB скопируйте JAR-архив customerwritable.jar в каталог конфигурации исполнения PXF ($PXF_BASE):
$ cp /home/gpadmin/customerwritable.jar $PXF_BASE/lib/customerwritable.jar -
Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:
$ pxf cluster sync $ pxf cluster restart -
На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в бакет customers на хосте S3. В выражении
LOCATIONукажите профильs3:SequenceFileи конфигурацию сервера. Используйте опциюDATA_SCHEMAдля указания полного квалифицированного имени Java-класса сериализации/десериализацииCustomerWritable. В выраженииFORMATукажитеpxfwritable_export— встроенную кастомную функцию форматирования для операций записи:CREATE WRITABLE EXTERNAL TABLE customers_w ( id INT, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers?PROFILE=s3:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=s3') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_export'); -
Вставьте тестовые данные в таблицу
customers_w:INSERT INTO customers_w (id, name, email, address) VALUES (1,'John Doe','john.doe@example.com','123 Elm Street'), (2,'Jane Smith','jane.smith@example.com','456 Oak Street'), (3,'Bob Brown','bob.brown@example.com','789 Pine Street'), (4,'Rob Stuart','rob.stuart@example.com','119 Willow Street'); -
Просмотрите содержимое бакета customers на хосте S3. Набор файлов должен выглядеть подобным образом:
206-0000000013_0 206-0000000013_2 206-0000000013_3
Создание читающей внешней таблицы
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, читающую файлы из бакета customers на хосте S3, данные в который были загружены с помощью пишущей внешней таблицы в предыдущем разделе. В выражении
LOCATIONукажите PXF-профильs3:SequenceFileи конфигурацию сервера. Используйте опциюDATA_SCHEMAдля указания полного квалифицированного имени Java-класса сериализации/десериализацииCustomerWritable. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_r ( id INT, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers?PROFILE=s3:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=s3') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_r;Вывод должен выглядеть следующим образом:
id | name | email | address ----+------------+------------------------+------------------- 2 | Jane Smith | jane.smith@example.com | 456 Oak Street 3 | Bob Brown | bob.brown@example.com | 789 Pine Street 1 | John Doe | john.doe@example.com | 123 Elm Street 4 | Rob Stuart | rob.stuart@example.com | 119 Willow Street (4 rows)
Использование ключей записи
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, подобную созданной ранее, но с добавлением столбца
recordkeyтипаBIGINT. В выраженииLOCATIONукажите PXF-профильs3:SequenceFileи конфигурацию сервера. Используйте опциюDATA_SCHEMAдля указания полного квалифицированного имени Java-класса сериализации/десериализацииCustomerWritable. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_rkey ( recordkey BIGINT, id INT, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://customers?PROFILE=s3:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=s3') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'); -
Выполните запрос к созданной внешней таблице:
SELECT * FROM customers_rkey;Вывод должен выглядеть подобным образом. Так как при вставке данных в таблицу не был определен ключ записи, столбец
recordkeyотображает ID сегмента, обработавшего строку данных:recordkey | id | name | email | address -----------+----+------------+------------------------+------------------- 2 | 4 | Rob Stuart | rob.stuart@example.com | 119 Willow Street 1 | 1 | John Doe | john.doe@example.com | 123 Elm Street 1 | 2 | Jane Smith | jane.smith@example.com | 456 Oak Street 1 | 3 | Bob Brown | bob.brown@example.com | 789 Pine Street (4 rows)