Использование коннектора PXF HDFS для чтения и записи данных в формате SequenceFile между Greengage DB и HDFS
Формат SequenceFile является распространенным форматом передачи данных между задачами MapReduce. Файлы данного типа состоят из бинарных пар ключ/значение.
В этой статье описывается настройка и использование коннектора PXF HDFS для чтения и записи данных SequenceFile в HDFS с использованием внешних таблиц, а также приводятся практические примеры.
Создание внешней таблицы с использованием протокола PXF
Чтобы создать внешнюю таблицу Greengage DB для чтения и записи данных в формате SequenceFile в HDFS, используется следующий синтаксис:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION ('pxf://<path_to_data>?PROFILE=hdfs: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> |
Путь к каталогу или файлу в хранилище HDFS.
Если в конфигурации сервера |
PROFILE=hdfs:SequenceFile |
Для чтения и записи данных в формате SequenceFile в HDFS используется профиль |
DATA_SCHEMA=<data_schema> |
Имя класса, реализующего сериализацию/десериализацию и предоставляющего методы чтения и записи для каждого типа данных, указанного в схеме данных. JAR-файл, содержащий этот класс, должен находиться в пути к классам PXF |
FORMAT 'CUSTOM' |
Для чтения и записи данных в формате SequenceFile в HDFS используется кастомный формат с использованием встроенных кастомных функций форматирования для операций чтения ( |
DISTRIBUTED BY |
При загрузке данных из таблицы Greengage DB во внешнюю пишущую таблицу рекомендуется указывать ту же политику распределения или имя столбца в обеих таблицах. Это позволит избежать дополнительного перемещения данных между сегментами при выполнении операции загрузки. Более подробную информацию о распределении таблиц можно получить в статье Распределение данных |
<custom_option> |
Одна из опций, описанных ниже, указываемая в строке |
SERVER=<server_name> |
Имя конфигурации сервера, который используется для доступа к данным. Если значение не указано, используется сервер PXF по умолчанию |
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 HDFS для чтения и записи данных SequenceFile между 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 подготовьте структуру каталогов для 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 создайте пишущую внешнюю таблицу, сохраняющую данные в HDFS-каталог /tmp/pxf_examples/customers. В выражении
LOCATIONукажите профильhdfs:SequenceFileи конфигурацию сервера. Используйте опциюDATA_SCHEMAдля указания полного квалифицированного имени Java-класса сериализации/десериализацииCustomerWritable. В выраженииFORMATукажитеpxfwritable_export— встроенную кастомную функцию форматирования для операций записи:CREATE WRITABLE EXTERNAL TABLE customers_w ( id INT, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers?PROFILE=hdfs:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=hadoop') 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'); -
На хосте HDFS просмотрите содержимое каталога /tmp/pxf_examples/customers:
$ hdfs dfs -ls /tmp/pxf_examples/customersВывод должен выглядеть подобным образом:
Found 2 items -rw-r--r-- 3 gpadmin hadoop 340 2026-03-06 15:27 /tmp/pxf_examples/customers/119-0000000004_1 -rw-r--r-- 3 gpadmin hadoop 210 2026-03-06 15:27 /tmp/pxf_examples/customers/119-0000000004_2
Создание читающей внешней таблицы
-
На мастер-хосте Greengage DB создайте внешнюю таблицу, читающую файлы из HDFS-каталога /tmp/pxf_examples/customers. В выражении
LOCATIONукажите PXF-профильhdfs:SequenceFileи конфигурацию сервера. Используйте опциюDATA_SCHEMAдля указания полного квалифицированного имени Java-класса сериализации/десериализацииCustomerWritable. В выраженииFORMATукажитеpxfwritable_import— встроенную кастомную функцию форматирования для операций чтения:CREATE EXTERNAL TABLE customers_r ( id INT, name TEXT, email TEXT, address TEXT ) LOCATION ('pxf://tmp/pxf_examples/customers?PROFILE=hdfs:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=hadoop') 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-профильhdfs: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://tmp/pxf_examples/customers?PROFILE=hdfs:SequenceFile&DATA_SCHEMA=com.example.pxf.hdfs.writable.dataschema.CustomerWritable&SERVER=hadoop') 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)