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

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

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

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

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

Для создания внешней таблицы Greengage DB, ссылающейся на текстовый файл или каталог в HDFS, используется следующий синтаксис:

CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
    ( <column_name> <data_type> [, ...] | LIKE <other_table> )

    LOCATION ('pxf://<path-to-hdfs>?PROFILE=<profile_name>[&<custom_option>[...]]')
    FORMAT '[TEXT|CSV]' (delimiter[=|<space>][E]'<delim_value>')
    [DISTRIBUTED BY (<column_name> [, ... ] ) | DISTRIBUTED RANDOMLY];
Ключевое слово Описание

<path‑to‑hdfs>

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

PXF поддерживает чтение и запись текстовых файлов, сжатых с использованием кодека по умолчанию, а также bzip2 и gzip. В случае читающих таблиц распаковка выполняется автоматически. В случае пишущих внешних таблиц вы можете указать кодек и тип компрессии с помощью опций COMPRESSION_CODEC и COMPRESSION_TYPE, описанных ниже

PROFILE=<profile_name>

Используйте профиль hdfs:text для чтения обычного текста с разделителями, hdfs:csv для чтения данных CSV, где каждая строка является отдельной записью, и hdfs:text:multi для чтения многострочных текстовых данных

FORMAT <value>

Формат данных: TEXT при ссылке на обычный текст с разделителями или CSV при ссылке на данные с разделителями-запятыми

delimiter

Символ, использующийся в качестве разделителя. Для формата CSV значением по умолчанию является запятая (,). Вы можете использовать спецпоследовательности, начинающиеся с E'', например delimiter=E'\t'.

Обратите внимание, что опция HEADER, которая обычно указывает, содержит ли файл данных строку заголовка, не поддерживается для внешних таблиц с использованием PXF. Если текстовый файл включает строки заголовков, используйте пользовательскую опцию SKIP_HEADER_COUNT для указания количества строк, которые необходимо пропустить в начале каждого файла

DISTRIBUTED BY

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

<custom_option>

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

SERVER=<server_name>

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

IGNORE_MISSING_PATH=<boolean>

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

SKIP_HEADER_COUNT=<numlines>

Количество строк заголовков, которые необходимо пропустить в начале файла HDFS перед чтением данных. Значение по умолчанию — 0, строки не пропускаются

COMPRESSION_CODEC

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

COMPRESSION_TYPE

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

Чтение простых текстовых данных из HDFS

  1. В каталоге /tmp на хосте HDFS создайте текстовый файл с разделителями под названием customers.txt и со следующим содержимым:

    id,first_name,last_name,email,address
    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
  2. Выполните сжатие созданного файла:

    $ gzip /tmp/customers.txt
  3. Создайте HDFS-каталог pxf_examples для хранения файлов примеров и поместите файл customers.txt.gz в HDFS:

    $ hdfs dfs -mkdir -p /tmp/pxf_examples
    $ hdfs dfs -put /tmp/customers.txt.gz /tmp/pxf_examples/
  4. Опционально, просмотрите содержимое файла customers.txt.gz, сохраненного в HDFS:

    $ hdfs dfs -text /tmp/pxf_examples/customers.txt.gz
  5. На мастер-хосте Greengage DB создайте читающую внешнюю таблицу PXF, ссылающуюся на файл customers.txt.gz. В выражении LOCATION укажите PXF-профиль hdfs:text и конфигурацию сервера. Включите пропуск заголовка с помощью опции SKIP_HEADER_COUNT. В выражении FORMAT укажите TEXT в качестве формата данных, а символ запятой (,) — в качестве разделителя (delimiter):

    CREATE EXTERNAL TABLE customers_plain (
        id INTEGER,
        first_name VARCHAR(50),
        last_name VARCHAR(50),
        email VARCHAR(100),
        address VARCHAR(255)
    )
        LOCATION ('pxf://tmp/pxf_examples/customers.txt.gz?PROFILE=hdfs:text&SERVER=hadoop&SKIP_HEADER_COUNT=1')
        FORMAT 'TEXT' (delimiter=E',');
  6. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_plain;

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

     id | first_name | last_name |         email          |      address
    ----+------------+-----------+------------------------+-------------------
      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
    (4 rows)

Чтение многострочных текстовых данных из HDFS

  1. В каталоге /tmp на хосте HDFS создайте текстовый файл с разделителями под названием customers_multiline.txt и со следующим содержимым. Обратите внимание, что в качестве разделителя используется символ двоеточия (:). Также обратите внимание на кавычки вокруг поля address: поле содержит встроенный символ перевода строки, отделяющий адрес от города:

    id:first_name:last_name:email:address
    1:John:Doe:john.doe@example.com:"123 Elm Street
    New York"
    2:Jane:Smith:jane.smith@example.com:"456 Oak Street
    Chicago"
    3:Bob:Brown:bob.brown@example.com:"789 Pine Street
    Los Angeles"
    4:Rob:Stuart:rob.stuart@example.com:"119 Willow Street
    New Orleans"
  2. Поместите текстовый файл в HDFS:

    $ hdfs dfs -put /tmp/customers_multiline.txt /tmp/pxf_examples/
  3. На мастер-хосте Greengage DB создайте читающую внешнюю таблицу, ссылающуюся на файл customers_multiline.txt. В выражении LOCATION укажите PXF-профиль hdfs:text:multi и конфигурацию сервера. Включите пропуск заголовка с помощью опции SKIP_HEADER_COUNT. В выражении FORMAT укажите CSV в качестве формата данных, а символ двоеточия (:) — в качестве разделителя (delimiter):

    CREATE EXTERNAL TABLE customers_multiline (
        id INTEGER,
        first_name TEXT,
        last_name TEXT,
        email TEXT,
        address TEXT
    )
        LOCATION ('pxf://tmp/pxf_examples/customers_multiline.txt?PROFILE=hdfs:text:multi&SERVER=hadoop&SKIP_HEADER_COUNT=1')
        FORMAT 'CSV' (delimiter ':');
  4. Выполните запрос к созданной внешней таблице:

    SELECT * FROM customers_multiline;

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

     id | first_name | last_name |         email          |      address
    ----+------------+-----------+------------------------+-------------------
      1 | John       | Doe       | john.doe@example.com   | 123 Elm Street
        |            |           |                        | New York
      2 | Jane       | Smith     | jane.smith@example.com | 456 Oak Street
        |            |           |                        | Chicago
      3 | Bob        | Brown     | bob.brown@example.com  | 789 Pine Street
        |            |           |                        |  Los Angeles
      4 | Rob        | Stuart    | rob.stuart@example.com | 119 Willow Street
        |            |           |                        | New Orleans
    (4 rows)

Запись текстовых данных в HDFS

  1. На мастер-хосте Greengage DB создайте пишущую внешнюю таблицу, сохраняющую данные в HDFS-каталог /tmp/pxf_examples/customers. В выражении LOCATION укажите PXF-профиль hdfs:text и конфигурацию сервера, а в качестве кодека для сжатия выберите gzip. В выражении FORMAT укажите TEXT в качестве формата данных, а символ запятой (,) — в качестве разделителя (delimiter):

    CREATE WRITABLE EXTERNAL TABLE customers_w (
        id INTEGER,
        first_name TEXT,
        last_name TEXT,
        email TEXT,
        address TEXT
    )
        LOCATION ('pxf://tmp/pxf_examples/customers?PROFILE=hdfs:text&SERVER=hadoop&COMPRESSION_CODEC=gzip')
        FORMAT 'TEXT' (delimiter ',');
  2. Вставьте содержимое ранее созданной читающей таблицы customers_plain в таблицу customers_w:

    INSERT INTO customers_w SELECT * FROM customers_plain;
  3. Вставьте несколько значений в таблицу customers_w вручную:

    INSERT INTO customers_w (
         id,
         first_name,
         last_name,
         email,
         address
     ) 
    VALUES (5,'Alice','Johnson','alice.johnson@example.com','10 Oak Avenue'),
           (6,'Charlie','Williams','charlie.williams@example.com','42 Maple Drive');
  4. На хосте HDFS просмотрите содержимое файлов в каталоге customers:

    $ hdfs dfs -text /tmp/pxf_examples/customers/*

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

    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
    5,Alice,Johnson,alice.johnson@example.com,10 Oak Avenue
    6,Charlie,Williams,charlie.williams@example.com,42 Maple Drive