Обзор PXF
Данные, которыми управляет организация, могут храниться в различных внешних системах, а также в разных форматах. Greenplum Platform Extension Framework (PXF) — это расширяемый фреймворк, который позволяет обращаться к широкому спектру источников данных из Greengage DB. PXF ускоряет получение данных благодаря параллельному доступу с высокой пропускной способностью. Он также позволяет объединять и фильтровать наборы данных удаленно и возвращать только результаты вместо выполнения дорогостоящей операции полной загрузки данных.
PXF предоставляет коннекторы, которые устанавливаются вместе с Greengage DB и позволяют получать доступ к внешним источникам, включая Hadoop (HDFS, Hive и HBase), S3-совместимые объектные хранилища, SQL-базы данных (MySQL, Oracle, DB2, PostgreSQL и т.д), а также к файловым системам по NFS. Эти коннекторы сопоставляют внешний источник данных с определением внешней таблицы Greengage DB.
PXF может работать с данными следующих форматов:
-
Avro, AvroSequenceFile
-
JSON
-
ORC
-
Parquet
-
RCFile
-
SequenceFile
-
Текст (простой, с разделителями, со встроенными переносами строк, а также с полями фиксированной ширины)
Архитектура PXF
В инсталляцию Greengage DB входит мастер-хост, резервный мастер-хост и несколько сегмент-хостов. На каждом хосте Greengage DB работает процесс сервиса PXF, выделяя рабочий поток для каждого экземпляра сегмента на хосте, участвующего в запросе к внешней таблице. Сервисы PXF на нескольких сегментных хостах взаимодействуют с внешним хранилищем данных параллельно. Процессы сервиса PXF, работающие на мастер-хосте и резервном мастер-хосте, не участвуют в передаче данных.
Фреймворк PXF включает в себя три главных компонента:
-
Расширение PXF — клиентская библиотека на языке C, которая реализует расширение PostgreSQL. Расширение работает на каждом сегменте базы данных и взаимодействует с сервером PXF посредством вызовов REST API.
-
Сервер PXF — веб-приложение на языке Java, развернутое в Apache Tomcat на каждом сегмент-хосте кластера Greengage DB. Сервер PXF получает запросы от расширения PXF и преобразует их в запросы к внешним системам.
-
Интерфейс командной строки (CLI) PXF — приложение на языке Go, которое предоставляет удобный способ администрирования серверов PXF, работающих на хостах Greengage DB. PXF CLI позволяет выполнять команды для отдельного сервера PXF или для всей инсталляции. Эти команды включают запуск и остановку сервера, проверку состояния сервера и другие. Подробная информация приведена в статьях Обзор команд pxf и Обзор команд pxf cluster.
После конфигурирования и инициализации PXF требуется запустить отдельный JVM-процесс PXF на каждом сегмент-хосте Greengage DB. Этот длительно выполняющийся процесс одновременно обслуживает несколько запросов. При запросе к внешней таблице Greengage DB, использующей протокол PXF, генерируется план запроса, который затем отправляется с мастер-хоста Greengage DB на сегменты.
Расширение PXF, работающее в каждом процессе сегмента Greengage DB, в свою очередь, перенаправляет запрос на сервер PXF, работающий на том же хосте. В обычной топологии развертывания сервер PXF размещается на каждом сегмент-хосте Greengage DB, где работает один или несколько процессов сегментов. Сервер PXF получает столько же запросов, сколько процессов сегментов запущено на хосте, или больше, если запрос сложный и содержит несколько фрагментов для обработки. На каждый такой запрос выделяется поток сервера PXF.
Внутренняя архитектура
Внутренне PXF определяет три интерфейса для чтения и записи данных из внешних источников: Fragmenter (интерфейс фрагментации), Accessor (интерфейс доступа) и Resolver (интерфейс преобразования). PXF предоставляет несколько реализаций этих интерфейсов, использующих различные протоколы доступа и поддерживающих различные форматы данных.
В PXF для упрощения использования предусмотрена концепция профиля — именованной сущности, которая инкапсулирует комбинацию конкретных реализаций интерфейсов Fragmenter, Accessor и Resolver.
Fragmenter
PXF Fragmenter — это функциональный интерфейс, разбивающий внешние данные на набор независимых фрагментов, которые могут быть прочитаны параллельно. Фрагмент — наименьшая неделимая часть данных, обрабатываемая одним потоком сервера PXF. Fragmenter не извлекает фактические данные: он работает только с метаданными, описывающими местоположение фрагмента и, опционально, смещение данных в общем наборе. Природа фрагментов различна для различных внешних систем, и, соответственно, различается и процесс получения метаданных фрагментов: например, это может быть вызов Hadoop HDFS NameNode для файла, хранящегося в Hadoop HDFS, или расчет интервальных сегментов для партиционированной таблицы JDBC.
Обработка каждого запроса распределяется между всеми сегментами Greengage DB и несколькими потоками сервера PXF, работающими независимо друг от друга. При запросе к внешней таблице, использующей протокол PXF, каждый сегмент Greengage DB выполняет два типа REST API-вызовов к серверу PXF: один вызов фрагментации и ноль или более bridge-вызовов. Во время вызова фрагментации общий набор внешних данных делится на фрагменты вместе с метаданными о каждом фрагменте.
Полученный набор метаданных фрагментов с помощью хеш-функции равномерно распределяется между сегментами Greengage DB. Затем, чтобы прочитать фактические данные, каждый сегмент Greengage DB перебирает назначенное подмножество фрагментов, выполняя bridge-вызов для каждого фрагмента. Каждый bridge-вызов для одного фрагмента данных обрабатывается отдельным потоком сервера PXF. Во время bridge-вызова поток сервера PXF получает метаданные фрагмента от сегмента Greengage DB и извлекает данные из внешней системы для данного фрагмента с использованием конкретной реализации интерфейса Accessor.
Accessor
PXF Accessor — это функциональный интерфейс, отвечающий за чтение или запись данных во внешние источники данных и преобразование данных в отдельные записи. Для доступа к различным внешним источникам данных требуются различные протоколы и методы аутентификации, поэтому для каждого типа внешнего сервера требуется отдельная реализация Accessor. В PXF встроены реализации для подключения к удаленным базам данных с использованием JDBC, объектным хранилищам и удаленным кластерам Hadoop. С их помощью PXF способен читать данные в текстовом, Parquet, Avro, CSV и других форматах.
При обработке запроса на получение данных для определенного фрагмента Accessor сначала извлекает конфигурацию внешнего источника данных. Затем он анализирует метаданные запрошенного фрагмента и, используя клиентские API-библиотеки соответствующего протокола, запрашивает необходимые данные у внешнего источника. Полученные данные разбиваются на записи, такие как строки текстового файла, строки в результирующем наборе JDBC или записи Parquet. Каждая такая запись, оставаясь при этом в проприетарном формате, затем оборачивается в общую структуру данных, которая используется для обмена данными внутри PXF. Если соответствующая функция поддерживается на стороне внешнего источника, например JDBC, Hive или S3, Accessor также отвечает за pushdown фильтров и проекцию столбцов входящего запроса.
Resolver
PXF Resolver — это функциональный интерфейс, который декодирует в отдельные поля запись, прочитанную из внешней системы с помощью Accessor, или кодирует ее при записи. Затем он сопоставляет типы данных и значения полей с форматом, поддерживаемым Greengage DB или внешней системой. После того как запись обработана с помощью Resolver, ее можно преобразовать в передаваемое по сети представление (например, CSV или двоичный формат) и отправить в Greengage DB для воссоздания в виде кортежа, или в иной формат, такой как Parquet или Avro, и отправить во внешнюю систему. Реализации Resolver обычно специфичны для формата данных. В PXF встроены реализации для преобразования строк CSV, столбцов JDBC ResultSet, записей Parquet и Avro, а также документов JSON.
На рисунке, приведенном ниже, показано взаимодействие Accessor, Fragmenter и Resolver при чтении и записи данных.
Основные понятия и функции PXF
Коннектор
Коннектор PXF — это логическая группа нескольких компонентов (реализаций интерфейсов Accessor, Fragmenter и Resolver, а также профилей), которая позволяет обрабатывать данные из определенного типа внешнего источника. Хотя коннектор и не имеет конкретного технического представления, он является полезной концепцией для описания общих возможностей PXF при работе с внешними данными.
PXF предоставляет следующие собственные коннекторы к внешним системам:
-
Коннектор JDBC позволяет PXF обращаться к внешним базам данных SQL, таким как Oracle, MySQL, PostgreSQL, Hive, используя соответствующий драйвер JDBC. Более подробную информацию о работе с JDBC-коннекторами можно получить в статье Настройка коннекторов PXF JDBC.
-
Коннектор облачного хранилища обращается к данным, расположенным в облачных объектных хранилищах, например Amazon S3, Google Cloud Storage или Azure Data Lake.
-
Коннектор Hadoop обращается к данным, хранящиеся в Hadoop. Более подробную информацию о работе с коннекторами Hadoop можно получить в статье Настройка коннекторов PXF Hadoop.
-
Коннектор Hive обращается к данным из таблиц Hive, сначала получая метаданные из Hive MetaStore, а затем — доступ к файлам.
-
Коннектор HBase обращается к данным, хранящиеся в таблицах HBase.
Сервер
Сервер PXF — именованная конфигурация коннектора. В определении сервера предоставляется информация для доступа к внешнему источнику. Эта информация специфична для хранилища данных и может включать местоположение сервера, учетные данные и другие необходимые свойства.
При создании внешней таблицы Greengage DB с использованием протокола PXF для определения сервера, предоставляющего конфигурацию и учетные данные внешнего хранилища, указывается опция SERVER=<server_name>.
Сервер PXF по умолчанию имеет имя default.
Если опция SERVER опущена, PXF использует сервер по умолчанию.
В каталоге $PXF_BASE/servers/default/ при этом должна быть определена корректная конфигурация сервера по умолчанию.
Более подробную информацию о работе с серверами PXF можно получить в разделе Настройка PXF-сервера.
Профиль
Профиль PXF — это именованное сопоставление, представляющее как протокол для подключения к внешнему источнику данных, так и формат данных, которые необходимо обработать.
Например, чтобы прочитать текстовый файл из облачного хранилища S3, указывается профиль s3:text, а чтобы прочитать файл Parquet из HDFS — hdfs:parquet.
Профиль указывается в качестве значения параметра PROFILE при создании внешней таблицы Greengage DB с использованием протокола PXF.
Затем PXF получает это значение вместе с запросом от Greengage DB и обращается к системной конфигурации, чтобы выбрать реализации интерфейсов Accessor, Fragmenter и Resolver, необходимые для извлечения и обработки данных.
Именованный запрос
PXF позволяет создать пользовательский запрос, называемый именованным запросом, для данных, находящихся в удаленной базе данных. JDBC-коннектор PXF выполняет этот запрос при извлечении данных для соответствующей внешней таблицы Greengage DB. Основная цель именованных запросов — выполнять сложные запросы, объединения и агрегации над данными, хранящимися в удаленной системе, непосредственно в этой системе. PXF также оборачивает запрос во внешнее выражение, чтобы применять оптимизации, такие как проекцию столбцов, pushdown фильтров и партиционирование при чтении.
Именованные запросы особенно полезны при доступе к очень большим наборам данных, например, управляемым Apache Hive в кластере Hadoop, так как кластер Hadoop зачастую имеет больше вычислительных ресурсов для выполнения сложной обработки данных, чем Greengage DB. Это основной сценарий использования, где именованный запрос обеспечивает значительные преимущества.
Чтобы создать именованный запрос, сохраните его в текстовом файле в каталоге конфигурации сервера PXF для удаленной базы данных. Например, следующий запрос извлекает имена клиентов и названия городов, в которых они находятся, вместе с общей суммой всех заказов, сделанных каждым клиентом в определенном месяце. Данные группируются по клиенту и месяцу оформления заказа:
SELECT
c.name,
c.city,
SUM(o.amount) AS total,
EXTRACT(MONTH FROM o.order_date) AS order_month
FROM
customers c
JOIN
orders o ON c.id = o.customer_id
GROUP BY
c.name, c.city, EXTRACT(MONTH FROM o.order_date)
ORDER BY
c.city, total;
Затем на этот запрос можно ссылаться при определении внешней таблицы Greengage DB с использованием протокола PXF, указав имя запроса с префиксом query: в выражении LOCATION, например:
CREATE EXTERNAL TABLE pxf_query_order_report (
name text,
city text,
total int,
order_month int
)
LOCATION ('pxf://query:order_report?PROFILE=jdbc&SERVER=postgres-server&PARTITION_BY=order_month:int&RANGE=1:12&INTERVAL=3')
FORMAT 'CUSTOM' (FORMATTER='pxfwritable_import');
Это выражение предписывает PXF прочитать текст запроса из файла с именем order_report.sql в каталоге конфигурации сервера и отправить его на удаленный сервер.
После того как удаленный сервер выполнит именованный запрос, PXF перенаправляет полученные данные в Greengage DB для представления результирующего набора.
Затем вы можете просматривать результаты запроса как внешнюю таблицу с помощью любой команды SELECT, например:
SELECT * FROM pxf_query_order_report;
Практический пример создания и выполнения именованного запроса приведен в статье Использование коннектора PXF JDBC для чтения и записи данных между Greengage DB и PostgreSQL документации Greengage DB.
Проекция столбцов
Проекция столбцов позволяет возвращать из внешнего источника только те столбцы, которые указаны в запросе SELECT к внешней таблице.
Это повышает производительность запросов и может также уменьшить объем передаваемых данных.
Проекция столбцов автоматически включена для PXF-протокола внешних таблиц Greengage DB.
Для того чтобы проекция столбцов произошла, должны быть выполнены следующие условия:
-
Внешний источник, к которому осуществляется доступ, должен поддерживать проекцию столбцов. Если проекция столбцов не поддерживается, запрос выполняется без нее, а данные фильтруются на стороне Greengage DB.
-
Соответствующий коннектор PXF и реализация профиля также должны поддерживать проекцию столбцов.
-
PXF должен иметь возможность сериализовать фильтр запроса. Если сериализовать фильтр запроса не удалось, например, когда предложение
WHEREразрешается в тип boolean, проекция столбцов может быть деактивирована.
В следующих комбинациях PXF-коннектора и профиля поддерживается проекция столбцов во время операций чтения.
| Источник данных | Коннектор | Профиль |
|---|---|---|
Внешняя SQL-база данных |
Коннектор JDBC |
jdbc |
Hive |
Коннектор Hive |
|
Hadoop |
Коннектор HDFS |
hdfs:orc, hdfs:parquet |
Доступ к файловым системам по NFS |
Коннектор File |
file:orc, file:parquet |
Amazon S3 |
Коннекторы для S3-совместимых объектных хранилищ |
s3:orc, s3:parquet |
Amazon S3 с использованием S3 Select |
Коннекторы для S3-совместимых объектных хранилищ |
s3:parquet, s3:text |
Google Cloud Storage |
Коннектор GCS Object Store |
gs:orc, gs:parquet |
Azure Blob Storage |
Коннектор Azure Object Store |
wasbs:orc, wasbs:parquet |
Azure Data Lake |
Коннектор Azure Object Store |
adl:orc, adl:parquet |
Pushdown фильтров
С помощью pushdown фильтров PXF позволяет извлекать и передавать внешнему источнику данных ограничения для фильтрации из выражения WHERE запроса SELECT.
Это может повысить производительность запросов, а также уменьшить объем передаваемых данных.
Pushdown активируется или деактивируется для всех протоколов внешних таблиц Greengage DB, включая PXF, с помощью параметра конфигурации сервера gp_external_enable_filter_pushdown.
По умолчанию установлено значение on; чтобы деактивировать pushdown, установите значение off, например:
SHOW gp_external_enable_filter_pushdown;
SET gp_external_enable_filter_pushdown TO 'off';
Некоторые внешние источники данных не поддерживают pushdown фильтров. Поддержка также может отсутствовать для определенных типов данных или операторов. Если запрос обращается к источнику данных, который не поддерживает pushdown фильтров, запрос выполняется без фильтрации, а затем данные фильтруются на стороне Greengage DB.
Pushdown фильтров PXF можно использовать со следующими типами данных (в зависимости от коннектора и профиля):
-
INT2,INT4,INT8; -
CHAR,TEXT,VARCHAR; -
FLOAT; -
NUMERIC(pushdown недоступен для коннектора S3 при использовании S3 Select или для профиляhiveпри обращении к таблице, созданной с опциейSTORED AS Parquet); -
BOOL; -
DATE,TIMESTAMP(pushdown доступен только для коннектора JDBC, коннектора S3 при использовании S3 Select, профилейhive:rcиhive:orcи профиляhiveпри обращении к таблице, созданной с опциейSTORED AS RCFileилиSTORED AS ORC).
PXF обращается к источникам данных, используя профили, предоставляемые различными коннекторами, и поддержка pushdown определяется конкретной реализацией коннектора. Следующие профили PXF поддерживают некоторые аспекты pushdown фильтров, а также различные арифметические и логические операции.
| Профиль | <, >, <=, >=, =, <> | LIKE | IS [NOT] NULL | IN | AND | OR | NOT |
|---|---|---|---|---|---|---|---|
jdbc |
Да |
Да (4) |
Да |
Нет |
Да |
Да |
Да |
*:parquet |
Да (1) |
Нет |
Да (1) |
Да (1) |
Да (1) |
Да (1) |
Да (1) |
|
Нет |
||||||
|
Да |
Нет |
Да |
Да |
Да |
Да |
Да |
hbase |
Да |
Нет |
Да |
Нет |
Да |
Да |
Нет |
hive:text |
Да (2) |
Нет |
Нет |
Нет |
Да (2) |
Да (2) |
Нет |
|
Да (2) |
Нет |
Да |
Да |
Да (2) |
Да (2) |
Да |
|
Да (2) |
Нет |
Да |
Да |
Да (2) |
Да (2) |
Да |
|
Да (2) |
Нет |
Нет |
Да |
Да (2) |
Да (2) |
Да |
|
Да (2) |
Нет |
Нет |
Нет |
Да (2) |
Да (2) |
Нет |
где:
-
Предикат применяется на стороне PXF, а не удаленной системы;
-
PXF поддерживает отсечение партиций на основе ключей партиционирования.
-
Фильтрация в PXF основывается на статистике ORC уровня файла, уровня полосы (stripe) и уровня строки.
-
Профиль
jdbcподдерживает операторLIKEтолько для полей типаTEXT.
Во всех остальных форматах, включая *:avro, *:AvroSequenceFile, *:SequenceFile, *:json, *:text, *:csv, *:fixedwidth и *:text:multi, pushdown фильтров не поддерживается.
Партиционирование при чтении по JDBC
PXF поддерживает партиционирование при чтении во время обработки JDBC-запросов, распределяя работу по извлечению отдельных фрагментов между экземплярами сервера PXF.
Каждый отдельный экземпляр добавляет фильтры в выражение WHERE команды SELECT, чтобы ограничить возвращаемый набор данных только назначенным ему фрагментом.
Партиционирование при чтении не означает, что данные в удаленной базе данных хранятся в партиционированных таблицах. Скорее, это указание PXF обрабатывать набор данных в удаленной таблице параллельно, используя для извлечения каждого фрагмента отдельный поток PXF. Если данные в удаленной базе данных партиционированы аналогичным образом, процесс извлечения данных будет более эффективным: для выполнения запроса PXF к партиции необходимо просканировать только эту партицию, а не всю таблицу. Более подробную информацию о работе с партиционированными таблицами Greengage DB можно получить в документации Greengage DB.
Для достижения оптимальной производительности следует выбирать столбец партиции, который может использовать преимущества одновременного чтения.
Например, при использовании PXF для чтения из базы данных Oracle используйте столбец ключа партиционирования Oracle.
При запросе Greengage DB можно использовать специальный столбец gp_segment_id, чтобы каждый сегмент сканировал только свои собственные данные, а затем передавал эти данные мастеру.
Для активации партиционирования при чтении в выражении LOCATION команды CREATE EXTERNAL TABLE укажите опции PARTITION_BY, RANGE и INTERVAL, например:
CREATE READABLE EXTERNAL TABLE sales_summary (
name text,
month int,
total int
)
LOCATION ('pxf://query:sales?PROFILE=Jdbc&SERVER=mysql-db&PARTITION_BY=month:int&RANGE=1:12&INTERVAL=3')
FORMAT 'CUSTOM' (formatter='pxfwritable_import');
PXF JDBC-коннектор разобьет запрос SELECT на несколько подзапросов для извлечения подмножеств данных, каждое из которых называется фрагментом.
JDBC-коннектор автоматически добавляет дополнительные ограничения запроса (выражения WHERE) к каждому фрагменту, чтобы гарантировать, что каждый кортеж данных будет извлечен из внешней базы данных ровно один раз.
Например, для выражения LOCATION из примера выше, в котором указаны опции PARTITION_BY=month:int&RANGE=1:12&INTERVAL=3, PXF генерирует семь фрагментов: четыре в соответствии с настройками партиционирования и до трех неявно сгенерированных фрагментов.
Ограничения для каждого из фрагментов:
-
Фрагмент 1:
WHERE (month < 1)— неявно сгенерированный фрагмент для интервала с начальным ограничениемRANGE; -
Фрагмент 2:
WHERE (month >= 1) AND (month < 4)— фрагмент, сгенерированный согласно настройкам партиционирования; -
Фрагмент 3:
WHERE (month >= 4) AND (month < 7)— фрагмент, сгенерированный согласно настройкам партиционирования; -
Фрагмент 4:
WHERE (month >= 7) AND (month < 10)— фрагмент, сгенерированный согласно настройкам партиционирования; -
Фрагмент 5:
WHERE (month >= 10) AND (month < 12)— фрагмент, сгенерированный согласно настройкам партиционирования; -
Фрагмент 6:
WHERE (month >= 12)— неявно сгенерированный фрагмент для интервала с конечным ограничениемRANGE; -
Фрагмент 7:
WHERE (month IS NULL)— неявно сгенерированный фрагмент.
Создание внешней таблицы PXF с использованием протокола PXF
Для создания внешней таблицы Greengage DB с использованием протокола PXF в команде CREATE EXTERNAL TABLE укажите внешний источник (имя сервера) и формат данных (имя профиля).
Для чтения и записи данных в определенных форматах PXF может потребоваться дополнительная информация.
Такую специфичную для профиля информацию можно указать с помощью опциональной компоненты <custom_option>=<value> строки LOCATION.
Синтаксис команды CREATE EXTERNAL TABLE с использованием протокола PXF в общем виде выглядит следующим образом:
CREATE [READABLE | WRITABLE] EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION('pxf://<path-to-data>?PROFILE=<profile_name>[&SERVER=<server_name>][&<custom_option>=<value>[...]]')
FORMAT '[TEXT|CSV|CUSTOM]' (<formatting-properties>);
| Ключевое слово | Описание |
|---|---|
<path‑to‑data> |
Каталог, имя файла, выражение из подстановочных знаков (wildcard), имя таблицы и т.д.
Синтаксис |
PROFILE=<profile_name> |
PXF-профиль, используемый для обращения к данным |
SERVER=<server_name> |
Имя PXF-сервера, используемого для обращения к данным.
Если опция не указана, используется сервер |
<custom‑option>=<value> |
Дополнительные опции и их значения, поддерживаемые профилем или сервером |
FORMAT <value> |
Формат данных.
Профили PXF поддерживают форматы |
<formatting‑properties> |
Опции форматирования, поддерживаемые профилем, например, функция форматирования или разделитель.
Вы можете указать дополнительные, специфичные для профиля опции форматирования с помощью компоненты Обратите внимание, что выражение |