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

Использование коннектора 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. Если в конфигурации сервера <server_name> указано свойство pxf.fs.basePath, значение <path_to_data> трактуется как относительный путь к указанному базовому пути. В противном случае путь считается абсолютным. Значение пути не должно содержать символ $

PROFILE=hdfs:SequenceFile

Для чтения и записи данных в формате SequenceFile в HDFS используется профиль hdfs:SequenceFile

DATA_SCHEMA=<data_schema>

Имя класса, реализующего сериализацию/десериализацию и предоставляющего методы чтения и записи для каждого типа данных, указанного в схеме данных. JAR-файл, содержащий этот класс, должен находиться в пути к классам PXF

FORMAT 'CUSTOM'

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

DISTRIBUTED BY

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

<custom_option>

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

SERVER=<server_name>

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

IGNORE_MISSING_PATH

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

COMPRESSION_TYPE

Тип сжатия, применяемый при записи данных: на уровне записи (RECORD, по умолчанию) или блока (BLOCK)

COMPRESSION_CODEC

Кодек сжатия, используемый при записи данных: default, bzip2, gzip или uncompressed (без сжатия). Если значение не указано (или указано uncompressed), сжатие не производится

Чтение ключа записи

Когда внешняя таблица 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 с использованием внешних таблиц.

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

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

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

  1. Подключитесь к мастер-хосту Greengage DB как gpadmin.

  2. Перейдите в каталог $PXF_BASE/servers и создайте каталог конфигурации сервера Hadoop с именем hadoop:

    $ mkdir $PXF_BASE/servers/hadoop
    $ cd $PXF_BASE/servers/hadoop
  3. Скопируйте файлы конфигурации 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 .
  4. Синхронизируйте конфигурацию между хостами кластера Greengage DB:

    $ pxf cluster sync

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

  1. В каталоге /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
  2. Добавьте в файл 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();
        }
    }
  3. Сохраните и закройте файл.

  4. Скомпилируйте 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/
  5. Скопируйте файл customerwritable.jar на мастер-хост Greengage DB, например:

    $ scp /tmp/customerwritable.jar gpadmin@mdw:/home/gpadmin
  6. На мастер-хосте Greengage DB скопируйте JAR-архив customerwritable.jar в каталог конфигурации исполнения PXF ($PXF_BASE):

    $ cp /home/gpadmin/customerwritable.jar $PXF_BASE/lib/customerwritable.jar
  7. Синхронизируйте конфигурацию между хостами кластера Greengage DB, а затем перезапустите PXF на всех хостах:

    $ pxf cluster sync
    $ pxf cluster restart
  8. На мастер-хосте 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');
  9. Вставьте тестовые данные в таблицу 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');
  10. На хосте 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

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

  1. На мастер-хосте 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');
  2. Выполните запрос к созданной внешней таблице:

    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)

Использование ключей записи

  1. На мастер-хосте 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');
  2. Выполните запрос к созданной внешней таблице:

    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)