В этой статье для дата-инженеров рассмотрим новую полезную фичу июньского выпуска Greenplum и обновления интеграционного фреймворка PXF, который обеспечивает интеграцию этой MPP-СУБД с внешними источниками и приемниками данных. Читайте далее, как PXF поддерживает запись данных в формате AVRO в Hadoop HDFS и хранилища объектов, а также чтение логических типов этого формата.
Теперь все вместе: Apache AVRO, HDFS, PXF и Greenplum
Благодаря коннекторам и интеграционному фреймворку PXF MPP-СУБД Greenplum может использоваться в различных аналитических конвейерах, выступая в качестве источника или приемника данных. Коннекторы PXF сопоставляют определение внешней таблицы Greenplum с внешним источником данных, не требуя загрузки больших наборов данных в эту MPP-СУБД. Еще PXF позволяет быстро выполнять части оператора запроса в других источниках данных, от облачных объектных хранилищ до распределенных файловых систем и реляционных баз.
В частности, PXF обеспечивает чтение и запись данных в/из HDFS – распределенную файловую систему Hadoop, которая часто используется в качестве хранилища неструктурированных данных и как основа Data Lake. Данные в HDFS могут храниться в различных форматах, включая Apache AVRO. С версии Greenplum 6.21.0 интеграционный фреймворк PXF расширяет поддержку AVRO, что мы и рассмотрим далее.
Прежде всего, напомним, что формат Apache AVRO весьма популярен для задач хранения и аналитики больших данных. Эта система сериализации обеспечивает богатые структуры данных наряду с компактным и быстрым двоичным форматом. AVRO представляет собой файл-контейнер для хранения постоянных данных и поддерживает удаленный вызов процедур, обеспечивая простую интеграцию с динамическими языками. Генерация кода не требуется для чтения или записи файлов данных, а также для использования или реализации протоколов RPC. Кодогенерация как необязательная оптимизация имеет смысл только для статически типизированных языков.
С июня 2022 года PXF поддерживает запись данных в формате AVRO в Hadoop HDFS и хранилища объектов, а также чтение логических типов этого формата, примитивных и сложных с дополнительными атрибутами для представления производного типа. Атрибут logicalType всегда должен присутствовать для логического типа и представляет собой строку с именем одного из логических типов. Другие атрибуты могут быть определены для конкретных логических типов. Логический тип всегда сериализуется с использованием его базового типа AVRO, поэтому значения кодируются точно так же, как эквивалентный тип AVRO без атрибута logicalType. Реализации языка могут выбрать для представления логических типов соответствующий собственный тип, хотя это не обязательно. Реализации языка должны игнорировать неизвестные логические типы при чтении и должны использовать базовый тип AVRO. Если логический тип является недопустимым, например, десятичное число с масштабом, превышающим его точность, тогда реализации должны игнорировать логический тип и использовать базовый тип AVRO.
PXF для Greenplum теперь поддерживает чтение следующих логических типов:
- Десятичный (Decimal);
- Уникальный идентификатор (UUID);
- Дата (Date);
- Время с точностью до миллисекунды и микросекунды (Time);
- Метка времени с точностью до миллисекунды и микросекунды (Timestamp);
- Локальная метка времени с точностью до миллисекунды и микросекунды (Local Timestamp);
Чтобы использовать любой из этих логических типов в PXF, надо выполнить следующий набор действий:
- Создать схему AVRO, определяющую логические типы данных;
- Создать/получить JSON-файл с данными, соответствующими каждому логическому типу в соответствии с файлом схемы;
- Упаковать JAR-файл AVRO для преобразования файла данных JSON в формат AVRO;
- Переместить только что созданный AVRO-файл в папку HDFS с правами на чтение;
- Создать читаемую внешнюю таблицу, учитывая сопоставление между логическими типами AVRO и типами данных Greenplum согласно следующей таблице маппинга
Логический тип данных AVRO |
Тип данных Greenplum |
decimal |
decimal/numeric |
Date |
date |
time-millis |
time without timezone |
time-micros |
time without time zone |
timestamp-millis |
timestamp without time zone |
timestamp-micros |
timestamp without time zone |
UUID |
UUID |
local-timestamp-millis |
timestamp without time zone |
local-timestamp-micros |
timestamp without time zone |
- Наконец, можно запросить созданную внешнюю таблицу Greenplum, чтобы получить данные AVRO.
Коннекторы хранилища объектов PXF поддерживают чтение данных в формате AVRO. Далее рассмотрим, как использовать PXF для чтения и записи данных AVRO в хранилище объектов, включая создание, запрос и вставку во внешнюю таблицу, которая ссылается на файл AVRO в хранилище. Доступ к данным в формате AVRO из хранилища объектов очень похож на доступ к данным в формате AVRO в HDFS.
Примеры команд для интеграции систем
При чтении или записи данных в хранилище объектов, если файл схемы AVRO находится в нем, следует включить сегмент в путь к файлу схемы. В этом сегменте не обязательно указывать тот же сегмент, что и в файле данных AVRO. Секреты, указанные в конфигурации сервера, должны обеспечивать доступ как к сегментам файла данных, так и к сегментам файла схемы. Путь к файлу схемы не должен содержать пробелов.
Для чтения и записи файлов этого строкового формата в хранилище объектов следует использовать профили <objstore>:AVRO. PXF поддерживает следующие префиксы профиля <objstore>:
Object Store |
Profile Prefix |
Azure Blob Storage |
wasbs |
Azure Data Lake |
adl |
Google Cloud Storage |
gs |
MinIO |
s3 |
S3 |
s3 |
Следующий синтаксис создает внешнюю таблицу базы данных Greenplum, которая ссылается на файл формата AVRO:
CREATE [WRITABLE] EXTERNAL TABLE <table_name> ( <column_name> <data_type> [, ...] | LIKE <other_table> ) LOCATION ('pxf://<path-to-file>?PROFILE=<objstore>:AVRO&SERVER=<server_name>[&<custom-option>=<value>[...]]') FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import'|'pxfwritable_export');
При обращении к облачному объектному хранилищу AWS S3, можно указать учетные данные S3 с помощью пользовательских параметров в команде CREATE EXTERNAL TABLE. Например, для чтения данных в формате AVRO из HDFS с помощью PXF, чтобы скопировать файл из Greenplum в AWS S3 следует выполнить команду копирования файла с таким синтаксисом:
$ aws s3 cp /tmp/pxf_AVRO.AVRO s3://BUCKET/pxf_examples/
В заключение отметим, что до релиза 6 потоковый сервер Greenplum Streaming Server (GPSS) не сохранял данные об ошибках в журнале ошибок внешней таблицы, когда обнаруживала неправильно отформатированное сообщение JSON или AVRO. Эта проблема была исправлена, теперь вызов метода gp_read_error_log() ко внешней таблице отображает ошибочные данные.
Освойте практику администрирования и эксплуатации Greenplum и Arenadata DB для эффективного хранения и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- https://greenplum.org/pxf-introducing-support-for-reading-the-AVRO-logical-types/
- https://docs.vmware.com/en/VMware-Tanzu-Greenplum-Platform-Extension-Framework/6.3/tanzu-greenplum-platform-extension-framework/GUID-objstore_AVRO.html?hWord=N4IghgNiBcIBYBMBmBnABGAbgJwPYgF8g
- https://docs.vmware.com/en/VMware-Tanzu-Greenplum/6/greenplum-database/GUID-relnotes-release-notes.html