Greenplum коннектор#

Greenplum коннектор позволяет отправлять запросы и создавать таблицы в СУБД Greenplum. Коннектор может быть использован для объединения данных из Greenplum с данными из других источников.

Greenplum коннектор основан на коде PostgreSQL коннектораи имеет схожую конфигурацию. Ключевым отличием Greenplum коннектора является возможность параллельного сканирования сегментов Greenplum, что существенно увеличивает производительность запросов.

Требования#

  • Сервер Greenplum версии 6.x или выше.

  • Наличие сетевого доступа к Greenplum со всех узлов CedrusData (coordinator и worker). По умолчанию, Greenplum использует порт 5432.

Конфигурация#

Для создания каталога Greenplum установите параметр connector.name в значение cedrusdata_greenplum. Например, для конфигурации каталога с именем example создайте файл etc/catalog/example.properties со следующим содержимым. Замените параметры подключения в соответствии с конфигурацией вашего сервера Greenplum.

connector.name=cedrusdata_greenplum
connection-url=jdbc:postgresql://example.net:5432/database
connection-user=root
connection-password=secret

Параметр connection-url определяет JDBC строку подключения к серверу Greenplum. Коннектор использует JDBC драйвер PostgreSQL для подключения к Greenplum. Вы можете ознакомиться с полным списком допустимых параметров в документации JDBC драйвера PostgreSQL.

Параметры connection-user and connection-password определяют имя пользователя и пароль для подключения к экземпляру Greenplum (как правило, это сервисный пользователь). Если вы не хотите хранить имя пользователя и пароль в открытом виде воспользуйтесь функционалом передачи секретов через переменные окружения.

Доступ к системным таблицам#

Коннектор позволяет обращаться к системным таблицам PostgreSQL, таким как pg_namespace. Данная функциональность отключена по умолчанию. Для включения задайте параметр конфигурации greemplum.include-system-tables=true.

Защищенное подключение#

Если ваш экземпляр Greenplum сконфигурирован с использованием TLS сертификатов, вы можете включить поддержку TLS между кластером CedrusData и Greenplum путем добавления необходимых параметров к строке подключения, указанной в connection-url. Например, для драйвера PostgreSQL версии 42 вы можете включить поддержку TLS путем добавления параметра ssl=true.

connection-url=jdbc:postgresql://example.net:5432/database?ssl=true

Аутентификация в источнике данных#

Вы можете предоставить имя пользователя и пароль для подключения к источнику данных несколькими способами:

  • INLINE - в файле конфигурации каталога (в том числе, используя секреты, чтобы не хранить значения в открытом виде).

  • FILE - в отдельном properties файле.

  • KEYSTORE - в зашифрованном keystore файле.

  • Из extra credentials клиента CedrusData.

Конфигурация#

Название

Описание

credential-provider.type

Тип credential provider. Допустимые значения: INLINE (значение по умолчанию), FILE или KEYSTORE.

connection-user

Имя пользователя для подключения к источнику. Используется при credential-provider.type=INLINE.

connection-password

Пароль для подключения к источнику. Используется при credential-provider.type=INLINE.

connection-credential-file

Путь к properties файлу, содержащему параметры connection-user and connection-password. Используется при credential-provider.type=FILE.

keystore-file-path

Путь к keystore файлу, из которого следует прочитать имя пользователя и пароль. Используется при credential-provider.type=KEYSTORE.

keystore-type

Тип keystore файла. Например, JKS или PEM.

keystore-password

Пароль к keystore файлу.

keystore-user-credential-name

Имя keystore entity, содержащей имя пользователя для подключения к источнику.

keystore-user-credential-password

Пароль к keystore entity, содержащей имя пользователя для подключения к источнику

keystore-password-credential-name

Имя keystore entity, содержащей пароль для подключения к источнику.

keystore-password-credential-password

Пароль к keystore entity, содержащей пароль для подключения к источнику.

user-credential-name

Имя параметра extra credentials, значение которого следует использовать в качестве имени пользователя. См. extraCredentials в разделе Параметры подключения.

password-credential-name

Имя параметра extra credentials, значение которого следует использовать в качестве пароля. См. extraCredentials в разделе Параметры подключения.

Аутентификация в источнике данных от имени текущего пользователя#

В дополнение к описанным выше способам аутентификации, CedrusData поддерживает аутентификацию в источнике от имени текущего пользователя CedrusData.

Для использования данного типа аутентификации узел должен использовать PASSWORD аутентификацию с включенным параметром cedrusdata.http-server.authentication.password.populate-extra-credentials. Убедитесь, что файл config.properties содержит следующие параметры:

http-server.authentication.type=PASSWORD
cedrusdata.http-server.authentication.password.populate-extra-credentials=true

В файле конфигурации коннектора добавьте два параметра:

user-credential-name=cedrusdata.username
password-credential-name=cedrusdata.password

Теперь коннектор будет использовать имя и пароль текущего пользователя для аутентификации в источнике.

При использовании аутентификации от имени текущего пользователя CedrusData другие параметры аутентификации коннектора будут проигнорированы.

Несколько экземпляров Greenplum#

Greenplum коннектор может работать только с одним экземпляром Greenplum. Если у вас есть несколько экземпляров Greenplum вам следует сконфигурировать несколько каталогов Greenplum коннектора, каждый из которых будет работать с конкретным экземпляром Greenplum.

Общие параметры конфигурации#

Название

Описание

Значение по умолчанию

case-insensitive-name-matching

Включить поддержку case insensitive идентификаторов.

false

case-insensitive-name-matching.cache-ttl

Время жизни закэшированных метаданных о case insensitive идентификаторах. Значение имеет тип duration.

1m

case-insensitive-name-matching.config-file

Путь к файлу конфигурации в формате JSON, который позволяет разрешать конфликты имен между case insensitive схемами и таблицами.

null

case-insensitive-name-matching.config-file.refresh-period

Частота проверки обновлений файла case-insensitive-name-matching.config-file.

0 (обновление отключено)

metadata.cache-ttl

Время жизни закэшированных метаданных (дескрипторы таблицы и колонок, статистики). Положительное значение включает кэширование. Значение имеет тип duration.

0 (кэширование отключено)

metadata.cache-missing

Кэшировать ли информацию о том, что для используемых таблиц и колонок отсутствуют статистики. Включение данного параметра может ускорить планирование некоторых запросов. Однако, если информация об отсутствии статистик для конкретного объекта СУБД закэширована, но статистики стали доступны позднее (например, была запущена команда ANALYZE), CedrusData не сможет использовать статистики, пока не истечет время жизни закэшированной записи в соответствии с metadata.cache-ttl.

false

metadata.schemas.cache-ttl

Время жизни закэшированных имен схем. Положительное значение включает кэширование. Допустимо только, если параметр metadata.cache-ttl имеет положительное значение. Значение имеет тип duration.

0 (кэширование отключено)

metadata.tables.cache-ttl

Время жизни закэшированных имен таблиц. Положительное значение включает кэширование. Допустимо только, если параметр metadata.cache-ttl имеет положительное значение. Значение имеет тип duration.

0 (кэширование отключено)

metadata.statistics.cache-ttl

Время жизни закэшированных статистик. Положительное значение включает кэширование. Допустимо только, если параметр metadata.cache-ttl имеет положительное значение. Значение имеет тип duration.

0 (кэширование отключено)

metadata.cache-maximum-size

Максимальное количество объектов, хранящихся в metadata cache.

10000

write.batch-size

Максимальное количество команд в batch операциях записи данных. Изменение данного параметра не рекомендовано, так как оно может негативно сказаться на производительности.

1000

dynamic-filtering.enabled

Использовать ли динамические фильтры при работе с JDBC источником.

true

dynamic-filtering.wait-timeout

Максимальное время ожидания готовности динамических фильтров с build стороны оператора join перед запуском JDBC запроса к источнику. Увеличение таймаута может позволить CedrusData выполнить запрос к источнику с более селективными фильтрами, но в то же время может увеличить latency некоторых запросов. Значение имеет тип duration.

20s

Добавление комментариев к SQL-запросам к источнику#

Опциональный параметр query.comment-format позволяет добавить комментарий, который будет добавлен к каждому SQL-запросу, отправляемому из CedrusData в источник. Значение параметра может содержать произвольные символы, а также набор специальных выражений, которые будут автоматически заменены CedrusData:

  • $QUERY_ID: Уникальный идентификатор запроса.

  • $USER: Имя пользователя CedrusData, который инициировал выполнение запроса.

  • $SOURCE: Идентификатор клиентского приложения. Например, trino-cli.

  • $TRACE_TOKEN: Trace token, заданный клиентским приложением.

Вы также можете добавить в комментарий значения переменных окружений CedrusData с помощью синтаксиса ${ENV:VARIABLE-NAME}.

Пример ниже добавляет комментарий «Query sent by Trino» к каждому запросу к SQL-источнику:

query.comment-format=Query sent by Trino

Пример SQL-запроса, отправленного к источнику:

SELECT * FROM example_table; /*Query sent by Trino.*/

Пример ниже добавляет специальные выражения в строку комментария:

query.comment-format=Query $QUERY_ID sent by user $USER from Trino.

Если пользователь Jane отправил запрос с идентификатором 20230622_180528_00000_bkizg, то источник получит SQL-запрос со следующим комментарием:

SELECT * FROM example_table; /*Query 20230622_180528_00000_bkizg sent by user Jane from Trino.*/

Примечание

Некоторые JDBC-драйвера могут автоматически удалять комментарии.

Domain compaction threshold#

CedrusData позволяет делегировать применение предикатов источнику данных (pushdown). Во многих случаях это существенно уменьшает количество записей, которые возвращает источник, и улучшает производительность. Однако, pushdown сложных предикатов (например, выражение IN со множеством значений) может негативно сказаться на производительности. При достижении порога сложности предиката, CedrusData автоматически преобразует предикат к более компактной форме. Например, предикат a IN (1, 2, ..., 100) может быть преобразован в a BETWEEN 1 AND 100. В большинстве случаев такое преобразование улучшает производительность запросов. Однако, в некоторых случаях может быть предпочтительнее передать сложный предикат в неизменном виде, так как источник данных может его обработать эффективнее, чем преобразованный предикат.

Вы можете увеличить значение порога сложности, чтобы CedrusData передавал предикат в источник без изменений. Используйте для этого параметр конфигурации каталога domain-compaction-threshold или свойство сессии domain_compaction_threshold.

Case insensitive идентификаторы#

Когда параметр конфигурации case-insensitive-name-matching установлен в true, CedrusData может обращаться к схемам и таблицам источника, имена которых не являются lowercase. Для этого CedrusData сопоставляет lowercase название схемы или таблицы с ее реальным названием в источнике данных. Например, если таблица в источнике данных имеет название Customers, CedrusData позволяет обратиться к ней по имени customers.

В случае, если источник имеет несколько объектов, имена которых отличаются только регистром (например, Customer и customer), CedrusData не может автоматически определить, к какому объекту обращаться.

В этом случае вы можете явно задать сопоставление имен с помощью файла в JSON формате, путь к которому следует указать в параметре конфигурации каталога case-insensitive-name-matching.config-file. Например:

{
  "schemas": [
    {
      "remoteSchema": "CaseSensitiveName",
      "mapping": "case_insensitive_1"
    },
    {
      "remoteSchema": "cASEsENSITIVEnAME",
      "mapping": "case_insensitive_2"
    }],
  "tables": [
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "tablex",
      "mapping": "table_1"
    },
    {
      "remoteSchema": "CaseSensitiveName",
      "remoteTable": "TABLEX",
      "mapping": "table_2"
    }]
}

В данном случае, при обращении из CedrusData к схеме case_insensitive_1, запрос будет переадресован к схеме источника CaseSensitiveName, а при обращении из CedrusData к таблице case_insensitive_1.table_1 запрос будет переадресован к таблице источника CaseSensitiveName.tablex.

По умолчанию если вы изменяете содержимое данного файла, экземпляр CedrusData должен быть перезапущен, чтобы применить изменения. Если вы хотите изменять содержимое файла без перезапуска CedrusData, вы можете установить параметр конфигурации case-insensitive-name-mapping.refresh-period, который определяет частоту повторного чтения данного файла.

case-insensitive-name-mapping.refresh-period=30s

Неатомарный INSERT#

Коннектор поддерживает добавление записей в источник с помощью команды INSERT statements. По умолчанию CedrusData осуществляет запись данных, используя временную таблицу, что обеспечивает транзакционные гарантии: в источник будут записаны либо все данные, либо не будет записано ничего (в случае возникновения ошибки).

Вы можете осуществлять запись данных в таблицу источника напрямую, минуя временную таблицу. Для этого установите параметр конфигурации каталога insert.non-transactional-insert.enabled или свойство сессии non_transactional_insert в значение true. Изменение данного параметра может увеличить производительность записи, но может привести данные в источнике в неопределенное состояние при возникновении ошибки в момент записи. Например, если при вставке 10 записей в таблицу источника в середине процесса произошла ошибка, откат вставки уже сохраненных записей может оказаться невозможным, и после выполнения команды источник будет содержать только часть записей.

Поддержка fault-tolerant execution#

Коннектор поддерживает Fault-tolerant execution. Операции чтения и записи могут быть выполнены с любой retry policy.

Приведение типов Greenplum к типам CedrusData#

Коннектор Greenplum приводит типы Greenplum к типам CedrusData согласно таблице ниже.

Приведение типов Greenplum к типам CedrusData#

Тип Greenplum

Тип CedrusData

Комментарий

BIT

BOOLEAN

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

REAL

REAL

DOUBLE

DOUBLE

NUMERIC(p, s)

DECIMAL(p, s)

DECIMAL(p, s) является псевдонимом типа NUMERIC(p, s). См. Обработка DECIMAL типов.

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

ENUM

VARCHAR

BYTEA

VARBINARY

DATE

DATE

TIME(n)

TIME(n)

TIMESTAMP(n)

TIMESTAMP(n)

TIMESTAMPTZ(n)

TIMESTAMP(n) WITH TIME ZONE

MONEY

VARCHAR

UUID

UUID

JSON

JSON

JSONB

JSON

HSTORE

MAP(VARCHAR, VARCHAR)

ARRAY

Отключено, ARRAY, или JSON

См. Обработка ARRAY типов.

Другие типы данных не поддерживаются.

Приведение типов CedrusData к типам Greenplum#

Коннектор Greenplum приводит типы CedrusData к типам Greenplum согласно таблице ниже.

Приведение типов CedrusData к типам Greenplum#

Тип CedrusData

Тип Greenplum

Комментарий

BOOLEAN

BOOLEAN

SMALLINT

SMALLINT

TINYINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

DOUBLE

DOUBLE

DECIMAL(p, s)

NUMERIC(p, s)

DECIMAL(p, s) является псевдонимом типа NUMERIC(p, s). См. Обработка DECIMAL типов.

CHAR(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

VARBINARY

BYTEA

DATE

DATE

TIME(n)

TIME(n)

TIMESTAMP(n)

TIMESTAMP(n)

TIMESTAMP(n) WITH TIME ZONE

TIMESTAMPTZ(n)

UUID

UUID

JSON

JSONB

ARRAY

ARRAY

См. Обработка ARRAY типов.

Другие типы данных не поддерживаются.

Обработка DECIMAL типов#

CedrusData по умолчанию игнорирует колонки с типом данных DECIMAL без явного указания precision или scale. Если значение параметра конфигурации коннектора decimal-mapping (или параметра сессии decimal_mapping) равно allow_overflow, то колонки с типом данных DECIMAL без явного указания precision или scale будут отображены и сопоставлены с типом данных CedrusData DECIMAL(38,0). Используйте параметр конфигурации коннектора decimal-default-scale (или параметр сессии decimal_default_scale), чтобы задать другое значение scale. Значение precision всегда равно 38.

Если DECIMAL значение не умещается в заданные precision и scale без округления, CedrusData вернет ошибку. Вы можете изменить данное поведение, разрешив автоматическое округление значение с помощью параметра конфигурации коннектора decimal-rounding-mode или параметра сессии decimal_rounding_mode. Допустимые значения: UNNECESSARY (значение по умолчанию), UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVEN. Данные значения соответствуют поведению RoundingMode в Java 17.

Обработка ARRAY типов#

Реализация ARRAY типов в Greenplum не поддерживает массивы фиксированной размерности, в то время как CedrusData поддерживает только одномерные массивы.

Вы можете сконфигурировать, каким образом Greenplum коннектор будет обрабатывать ARRAY типы с помощью параметра конфигурации коннектора greenplum.array-mapping или параметра сессии array_mapping:

  • DISABLED (значение по умолчанию): игнорировать колонки типа ARRAY.

  • AS_ARRAY: представлять массивы Greenplum как тип данных ARRAY в CedrusData. Данное значение подходит для массивов Greenplum, которые в фактически являются одномерными.

  • AS_JSON: представлять массивы Greenplum как тип данных JSON в CedrusData. Данное значение подходит для многомерных массивов Greenplum.

Конфигурация сопоставления типов#

Следующие параметры конфигурации могут быть использованы для изменения логики приведения типов.

Название

Описание

Значение по умолчанию

unsupported-type-handling

Как обрабатывать колонки неподдерживаемых типов: IGNORE - не обрабатывать колонку; CONVERT_TO_VARCHAR - привести значение колонки к VARCHAR неограниченной длины. Параметр сессии: unsupported_type_handling.

IGNORE

jdbc-types-mapped-to-varchar

Список типов данных источника, которые должны быть принудительно приведены к VARCHAR неограниченной длины (даже если указанный тип поддерживается коннектором).

Работа с Greenplum#

Greenplum коннектор предоставляет каждую схему Greenplum в качестве отдельной схемы каталога CedrusData. Используйте команду SHOW SCHEMAS для получения списка схем каталога example:

SHOW SCHEMAS FROM example;

Если экземпляр Greenplum содержит схему web, вы можете получить список таблиц схемы с помощью команды SHOW TABLES:

SHOW TABLES FROM example.web;

Используйте команды DESCRIBE и SHOW COLUMNS для получения списка колонок таблицы:

DESCRIBE example.web.clicks;
SHOW COLUMNS FROM example.web.clicks;

Пример команды SELECT для получения данных из таблицы clicks схемы web:

SELECT * FROM example.web.clicks;

Свойства таблицы#

Вы можете задать дополнительные свойства таблицы с помощью ключевого слова WITH при вызове команд CREATE TABLE и CREATE TABLE AS. Все упомянутые ниже свойства по умолчанию имеют значение NULL, что означает, что будет использовано значение по умолчанию сервера Greenplum.

Свойства таблицы Greenplum#

Название

Описание

distributed

Задает один из способов распределения записей таблицы, который не зависит от конкретных колонок. Допустимые значения: randomly, replicated. Для hash распределения используйте свойство distributed_by.

distributed_by

Задает hash распределение записей таблицы. Значением является массив имен колонок, например, ARRAY['nationkey', 'regionkey'].

appendoptimized

Значение true создает append-optimized таблицу. Значение false создает heap таблицу.

blocksize

Задает размер блока для append-optimized таблиц в байтах.

orientation

Задает ориентацию для append-optimized таблиц. Допустимые значения: column, row.

checksum

Значение true включает проверку CRC checksum для append-optimized таблиц.

compresstype

Задает алгоритм компрессии данных. Поддержка конкретного алгоритма зависит от версии Greenplum. Допустимые значения: zlib, zstd, rle_type, none.

compresslevel

Задает уровень компрессии. Допустимые значения зависят от алгоритма компрессии: zlib - от 1 до 9, zstd - от 1 до 19, rle_type - от 1 до 4.

fillfactor

Задает fill factor для heap таблиц. Допустимые значения: от 10 до 100.

Пример создания append-optimized таблицы, использующей hash распределение по нескольким колонкам, columnar ориентацию и компрессию с помощью алгоритма ZSTD:

CREATE TALBE nation (
  n_nationkey integer,
  n_name char(25),
  n_regionkey integer,
  n_comment varchar(152)
)
WITH (
  distributed_by = ARRAY['nationkey', 'regionkey'],
  appendoptimized = true,
  orientation = 'columnar',
  compresstype = 'zstd'
)  

При выполнении запросов CedrusData получает свойства таблицы с помощью дополнительного SQL-запроса к системным таблицам Greenplum. Вы можете отключить чтение свойств таблицы, чтобы снизить количество запросов к Greenplum с помощью параметра конфигурации greenplum.read-table-properties=false. В этом случае вы не сможете задать свойства новой таблицы на основе свойств существующей с помощью команды CREATE TABLE ... LIKE <table_name> INCLUDING PROPERTIES ....

Поддержка SQL команд#

Greenplum коннектор поддерживает команды чтения и изменения данных и метаданных экземпляра Greenplum. В дополнение к общим командам и командам чтения коннектор поддерживает следующие операции:

UPDATE#

Команда UPDATE позволяет изменять значения колонок только на константные значения:

UPDATE table SET col1 = 1 WHERE col3 = 1

Арифметические выражения, вызовы функций и иные выражения, не являющиеся константами, не поддерживаются в SET. Следующий запрос вернет ошибку, так как арифметические выражения не могут быть использованы в SET:

UPDATE table SET col1 = col2 + 2 WHERE col3 = 1

Все колонки записи таблицы не могут быть обновлены одновременно. Например, если таблица table содержит три колонки, следующий запрос вернет ошибку:

UPDATE table SET col1 = 1, col2 = 2, col3 = 3 WHERE col3 = 1

DELETE#

Команда DELETE с выражением WHERE работает только в случае, когда выполнение предиката может быть полностью делегировано источнику.

ALTER TABLE RENAME TO#

Коннектор поддерживает переименование таблиц только в пределах одной схемы.

Следующая команда поддерживается коннектором, так как переименовывает таблицу в пределах одной схемы.

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_one.table_two

Следующая команда не поддерживается коннектором, так как меняет схему таблицы:

ALTER TABLE example.schema_one.table_one RENAME TO example.schema_two.table_two

ALTER SCHEMA#

Коннектор поддерживает переименование схемы с помощью команды ALTER SCHEMA RENAME. Команда ALTER SCHEMA SET AUTHORIZATION не поддерживается.

Процедуры#

system.flush_metadata_cache()#

Очистить кэш JDBC метаданных. Команда ниже очищает кэш метаданных всех схем в каталоге example.

USE example.example_schema;
CALL system.flush_metadata_cache();

system.execute('query')#

Процедура execute позволяет запустить SQL запрос к источнику в неизменном виде. Данная процедура полезна, когда вам требуется воспользоваться специфичным синтаксисом источника, который недоступен в CedrusData. В отличие от табличных функций query и raw_query данная процедура позволяет запускать SQL-запросы, который не возвращают записи (например, DML и DDL команды).

Запрос из процедуры будет исполнен в источнике как есть, без дополнительных проверок доступа к конкретным объектам источника на стороне CedrusData.

Пример использования процедуры для вызова команды ALTER TABLE на источнике:

USE example.example_schema;
CALL system.execute(query => 'ALTER TABLE your_table ALTER COLUMN your_column DROP DEFAULT');

Табличные функции#

Коннектор предоставляет ряд табличных функций для обработки данных Greenplum.

query(varchar) -> table#

Табличная функция query позволяет запустить конкретный запрос к Greenplum с использованием нативного синтаксиса Greenplum. Запрос будет выполнен в Greenplum как есть без каких-либо изменений. Данный функционал может быть полезен, если вам требуется задействовать специфичный функционал Greenplum (например, нестандартный синтаксис или хинты или для ускорения запроса) или получить полный контроль над тем, какой запрос будет выполнен в Greenplum.

Предупреждение

Нативный запрос, переданный в источник, должен возвращать набор записей (result set). CedrusData не осуществляет проверку доступа текущего пользователя к объектам источника, задействованным в нативном запросе. Используйте нативные запросы только для чтения данных.

Пример табличной функции query для сканирования таблицы tpch.nation:

SELECT
  *
FROM
  TABLE(
    example.system.query(
      query => 'SELECT
        *
      FROM
        tpch.nation'
    )
  );

Примечание

Полиморфные табличные функции не сохраняют оригинальный порядок записей в результате запроса. Есть переданный запрос содержит запрос выражение ORDER BY, функция может вернуть записи в ином порядке. Для восстановления требуемого порядка используйте ORDER BY в запросе CedrusData.

GPFDIST сервер#

CedrusData может эмулировать работу GPFDIST сервера Greenplum, что позволяет быстро передавать данные из Greenplum в CedrusData и обратно, минуя мастер узел Greenplum. GPFDIST может быть использован как для чтения данных, так и для записи.

Для включения GPFDIST сервера задайте следующий параметр конфигурации на всех узлах CedrusData:

greenplum.direct.server.enabled=true

После запуска GPFDIST сервера вы можете отдельно включить Параллельное чтение данных через GPFDIST и/или Параллельная запись данных через GPFDIST.

Конфигурация сервера GPFDIST#

Параметр конфигурации

Описание

greenplum.direct.server.enabled

Запускает сервер GPFDIST на узле. Значение по умолчанию: false.

greenplum.direct.server.host

Имя интерфейса, на котором будет запущен сервер. Значение по умолчанию: null (будет использован тот же интерфейс, на котором работает узел CedrusData).

greenplum.direct.server.port

Порт, на котором будет запущен сервер. Значение по умолчанию: 0 (будет использован произвольный свободный порт).

greenplum.direct.server.external-host

Имя интерфейса, которое будет использовано сегментами Greenplum, чтобы связаться с узлом CedrusData. Используйте данное свойство, если сервер CedrusData доступен для Greenplum через интерфейс, который отличается от greenplum.direct.server.host. Значение по умолчанию: null (будет использовано значение greenplum.direct.server.host).

greenplum.direct.server.external-port

Порт, который будет использовано сегментами Greenplum, чтобы связаться с узлом CedrusData. Используйте данное свойство, если сервер CedrusData доступен для Greenplum через порт, который отличается от greenplum.direct.server.port. Значение по умолчанию: 0 (будет использовано значение greenplum.direct.server.port).

greenplum.direct.server.ssl.enabled

Использовать SSL при коммуникации Greenplum и CedrusData. Для работы в этом режиме на Greenplum необходимо установить сертификаты GPFDIST сервера CedrusData. Значение по умолчанию: false.

greenplum.direct.server.ssl.keystore.path

Путь к keystore в формате PEM или JKS.

greenplum.direct.server.ssl.keystore.password

Пароль keystore.

greenplum.direct.server.ssl.truststore.path

Путь к truststore в формате PEM или JKS.

greenplum.direct.server.ssl.truststore.password

Пароль truststore.

Производительность#

Greenplum коннектор содержит набор оптимизаций производительности, приведенный в последующих секциях.

Параллельная запись данных через GPFDIST#

CedrusData предоставляет возможность быстрой записи данных в сегменты Greenplum через протокол GPFDIST. Используйте данный режим, если вам необходимо передать большой объем данных из CedrusData в Greenplum.

В данном режиме чтения worker CedrusData создает временную внешнюю таблицу в Greenplum (READABLE EXTERNAL TEMPORARY TABLE), в параметрах которой указан IP адрес узла в качестве адреса GPFDIST сервера, а формат данных установлен в CSV. После этого происходит запуск команды INSERT INTO целевая_табилца_gp SELECT ... FROM внешняя_таблица_gp, в результате чего сегменты Greenplum начинают запрашивать данные с worker-узлов CedrusData, минуя master Greenplum. По окончании запроса происходит удаление временной внешней таблицы.

Сконфигурируйте GPFDIST сервер. После этого вы можете включить запись через GPFDIST с помощью параметра конфигурации greenplum.direct.write-enabled или свойства сессии direct_write_enabled.

greenplum.direct.write-enabled=true
SET SESSION example.direct_write_enabled = true
Конфигурации чтений через GPFDIST#

Параметр конфигурации

Свойство сессии

Описание

greenplum.direct.write-enabled

direct_write_enabled

Включает запись данных в таблицы Greenplum через протокол GPFDIST. Значение по умолчанию: false.

greenplum.direct.write-buffer-size

direct_write_buffer_size

Размер буфера при записи данных в Greenplum. При переполнении буфера CedrusData временно приостанавливает прием данных на запись. Значение по умолчанию: 16MB (16 мегабайт).

greenplum.direct.null-string

direct_null_string

Как Greenplum следует обозначать NULL значения при передаче данных в CedrusData. Значение данного параметра может содержать только буквы, цифры и символ _, или же быть равным \0. Значение по умолчанию: \0.

Параллельное чтение данных через GPFDIST#

CedrusData предоставляет возможность быстрого чтения данных из сегментов Greenplum через протокол GPFDIST. Используйте данный режим, если вам необходимо передать большой объем данных из Greenplum в CedrusData.

В данном режиме чтения worker CedrusData создает временную внешнюю таблицу в Greenplum (WRITABLE EXTERNAL TEMPORARY TABLE), в параметрах которой указан IP адрес узла в качестве адреса GPFDIST сервера, а формат данных установлен в CSV. После этого происходит запуск команды INSERT INTO внешняя_таблица_gp SELECT ... FROM целевая_табилца_gp, в результате чего сегменты Greenplum начинают передавать данные из целевой таблицы на worker-узел CedrusData, минуя master Greenplum. По окончании запроса происходит удаление временной внешней таблицы.

При одновременном использовании Параллельное сканирование сегментов Greenplum через JDBC сегменты Greenplum будут передавать данные на несколько worker-узлов. В этом случае CedrusData создаст несколько задач на чтение данных. Каждой задаче будет сопоставлено собственное подмножество сегментов. Задачи будут распределены по worker-узлам CedrusData. Для каждой задачи будет создана собственная временная внешняя таблица.

Сконфигурируйте GPFDIST сервер. После этого вы можете включить чтение через GPFDIST с помощью параметра конфигурации greenplum.direct.read-enabled или свойства сессии direct_read_enabled.

greenplum.direct.read-enabled=true
SET SESSION example.direct_read_enabled = true
Конфигурации чтений через GPFDIST#

Параметр конфигурации

Свойство сессии

Описание

greenplum.direct.read-enabled

direct_read_enabled

Включает чтение данных из таблиц Greenplum через протокол GPFDIST. Значение по умолчанию: false.

greenplum.direct.read-buffer-size

direct_read_buffer_size

Размер буфера при чтении данных из Greenplum. При переполнении буфера CedrusData временно приостанавливает прием данных из сегментов. Значение по умолчанию: 16MB (16 мегабайт).

greenplum.direct.read-gpfdist-retry-timeout

direct_read_gpfdist_retry_timeout

Значение gpfdist_retry_timeout, которое будет установлено в сессии Greenplum перед запуском операции чтения. Данный параметр указывает как долго сегментам Greenplum следует ждать подтверждение получения пакета от CedrusData. Вам может потребоваться увеличить значение данного параметра, если вы запускаете сложные запросы в CedrusData, которые начинают читать данные из Greenplum через существенное время после начала выполнения. Значение по умолчанию: null (будет использовано значение gpfdist_retry_timeout сервера Greenplum по умолчанию).

greenplum.direct.null-string

direct_null_string

Как Greenplum следует обозначать NULL значения при передаче данных в CedrusData. Значение данного параметра может содержать только буквы, цифры и символ _, или же быть равным \0. Значение по умолчанию: \0.

Параллельное сканирование сегментов Greenplum через JDBC#

Большинство коннекторов, основанных на доступе через JDBC (например, PostgreSQL коннектор, MySQL коннектор) сканируют таблицы источника в один поток.

Предположим, что пользователь запускает в CedrusData запрос к каталогу Greenplum:

SELECT ... FROM greenplum.nation

В этом случае Greenplum коннектор сгенерирует один запрос к экземпляру Greenplum:

SELECT ... FROM nation

Greenplum является массивно-параллельной СУБД, которая распределяет данные по сегментам. Таблицы Greenplum имеют скрытую колонку gp_segment_id, которая обозначает, какому сегменту принадлежит конкретная запись. Greenplum коннектор использует gp_segment_id для запуска несколько параллельных запросов к экземпляру Greenplum, что позволяет значительно ускорить сканирование. Например, если степень параллелизма равна 4, Greenplum коннектор инициирует четыре параллельных запроса к Greenplum:

SELECT ... FROM nation WHERE gp_segment_id % 4 = 0
SELECT ... FROM nation WHERE gp_segment_id % 4 = 1
SELECT ... FROM nation WHERE gp_segment_id % 4 = 2
SELECT ... FROM nation WHERE gp_segment_id % 4 = 3

Таким образом, кластер CedrusData сможет быстрее получить данные из Greenplum и ускорить выполнение запроса.

Степень параллелизма можно задать с помощью параметра конфигурации каталога greenplum.max-scan-parallelism или параметра сессии max_scan_parallelism. По умолчанию CedrusData использует степень параллелизма 1, что означает отсутствие параллелизма.

Степень параллелизма не может превышать количество сегментов экземпляра Greenplum. Например, если в конфигурации коннектора задана степень параллелизма 16, но экземпляр Greenplum содержит только 8 сегментов, реальная степень параллелизма запросов будет равна 8.

Пул соединений (connection pool)#

Коннектор поддерживает работу через пул соединений с помощью библиотеки HikariCP. В ряде случаев использование пула соединений может ускорить запросы к источнику данных.

CedrusData создает по одному пулу соединений на каждого пользователя, который подключается к источнику:

  • Если вы аутентифицируетесь в источнике от имени общего системного пользователя, будет создан один пул.

  • Если вы используете Аутентификация в коннекторах от имени текущего пользователя, то будет создано по одному пулу на каждого активного пользователя CedrusData, но не более cedrusdata.jdbc.connection-pool.max-users. Создание большого количества соединений может негативно сказать на источнике. Мы рекомендуем вам провести нагрузочное тестирование, чтобы убедиться, что преимущества пула соединений перевешивают риски, при использовании совместно с аутентификацией в источнике от имени текущего пользователя.

Каждый пул может содержать до cedrusdata.jdbc.connection-pool.max-user-connections соединений.

Название

Описание

Значение по умолчанию

cedrusdata.jdbc.connection-pool.enabled

Использовать ли пул соединений при подключении к источнику.

false

cedrusdata.jdbc.connection-pool.max-users

Максимальное количество пулов соединений, которое может быть создано. Если необходимо создать новый пул для пользователя, но общее количество пулов достигло предела, будет закрыт один из давно неиспользуемых пулов. Значение данного параметра не имеет значения, если вы аутентифицируетесь в источнике от имени общего системного пользователя, так как в этом случае всегда будет использован ровно только пул.

100

cedrusdata.jdbc.connection-pool.max-user-connections

Максимальное количество подключений к источнику в рамках одного пула.

Равно количеству процессорных ядер

cedrusdata.jdbc.connection-pool.user-ttl

Как долго удерживать пул пользователя открытым в случае отсутствия активности последнего.

5m (пять минут)

cedrusdata.jdbc.connection-pool.connection-ttl

Как долго удерживать соединение открытым в случае отсутствия активности.

5m (пять минут)

Статистики таблиц#

Greenplum коннектор может использовать статистики колонок и таблиц для cost-based оптимизации запросов.

Сбор статистик осуществляет экземпляр Greenplum, после чего передает их CedrusData. Используйте команду ANALYZE для сбора статистик таблиц.

ANALYZE table_schema.table_name;

Pushdown#

Коннектор поддерживает pushdown следующих операций:

Коннектор поддерживает pushdown агрегатных функций:

Примечание

Коннектор осуществляет pushdown для улучшения производительности запросов. Коннектор не будет делать pushdown конкретной операции, если это может привести к некорректным результатам. Таким образом коннектор предпочитает корректность производительности. В некоторых случаях коннекторы могут предоставлять дополнительные параметры конфигурации, которые разрешают pushdown небезопасных операций, но только при явном указании соответствующего параметра пользователем.

Cost-based join pushdown#

Коннектор поддерживает Join pushdown в режимах AUTOMATIC (значение по умолчанию) и EAGER.

В режиме AUTOMATIC коннектор принимает решение о join pushdown на основе предполагаемой стоимости запроса с и без join pushdown. Join pushdown происходит только тогда, когда доступные Table statistics позволяют предположить, что join pushdown приведет к улучшению производительности. Если статистики задействованных таблиц и колонок недоступны, join pushdown не будет произведен, чтобы избежать потенциального ухудшения производительности.

В режиме EAGER join pushdown происходит всегда, когда это допустимо коннектором с точки зрения корректности, даже если соответствующие статистики недоступны. Использование режима EAGER рекомендовано только для тестирования и отладки.

Таблица ниже содержит параметры конфигурации, относящиеся к cost-based join pushdown:

Название

Описание

Значение по умолчанию

join-pushdown.enabled

Разрешать :ref:join pushdown <join-pushdown> или нет. Параметр сессии: join_pushdown_enabled.

true

join-pushdown.strategy

Стратегия принятия решения о join pushdown. Допустимые значения: AUTOMATIC, EAGER.

AUTOMATIC

Поддержка pushdown выражений#

Коннектор поддерживает pushdown выражений в качестве предикатов (выражения WHERE, HAVING) и проекций (выражения SELECT). Pushdown предикатов включен по умолчанию. Pushdown проекций является экспериментальным функционалом и может быть включен с помощью параметра конфигурации cedrusdata.complex-projection-pushdown.enabled=true или свойства сессии cedrusdata_complex_projection_pushdown_enabled:

SET SESSION example.cedrusdata_complex_projection_pushdown_enabled = true

Выражения для которых поддерживается pushdown:

Используйте следующие параметры конфигурации и свойства сессии для тонкой настройки pushdown выражений.

Управление pushdown выражений#

Параметр конфигурации

Свойство сессии

Описание

complex-expression-pushdown.enabled

complex_expression_pushdown

Включает pushdown сложных выражений в качестве предикатов. Значение по умолчанию: true.

cedrusdata.complex-projection-pushdown.enabled

cedrusdata_complex_projection_pushdown_enabled

Включает pushdown сложных выражений в качестве проекций. Значение по умолчанию: false.

greenplum.enable-string-pushdown-with-collate

enable_string_pushdown_with_collate

Включает pushdown операций >, >=, <, <= для типов данных CHAR и VARCHAR. Значение по умолчанию: true.

greenplum.pushdown.enums

pushdown_enums

Включает pushdown операций над типом данных enum. Значение по умолчанию: false.

greenplum.pushdown.literals

pushdown_literals

Включает pushdown констант для типов данных BOOLEAN, REAL, DOUBLE, CHAR, а также pushdown константы null. Pushdown констант остальных поддерживаемых типов включен всегда. Значение по умолчанию: true.

greenplum.pushdown.decimal-arithmetics

pushdown_decimal_arithmetics

Включает pushdown арифметических операций над типом DECIMAL. Значение по умолчанию: true.

greenplum.pushdown.double-arithmetics

pushdown_double_arithmetics

Включает pushdown арифметических операций над типами REAL и DOUBLE. Значение по умолчанию: true.

greenplum.pushdown.datetime-arithmetics

pushdown_datetime_arithmetics

Включает pushdown арифметических операций над типами DATE, TIME, TIMESTAMP и TIMESTAMP WITH TIME ZONE. Значение по умолчанию: true.

greenplum.pushdown.datetime-comparison

pushdown_datetime_comparison

Включает pushdown операций >, >=, <, <= для типов данных DATE, TIME, TIMESTAMP и TIMESTAMP WITH TIME ZONE. Значение по умолчанию: true.

greenplum.pushdown.function.cast

pushdown_function_cast

Включает pushdown функции CAST. Значение по умолчанию: true.

greenplum.pushdown.function.date-part

pushdown_function_date_part

Включает pushdown функции EXTRACT для типов данных DATE, TIME и TIMESTAMP и компонентов year, quarter, month, week, day, day_of_week, day_of_year, hour, minute. Значение по умолчанию: true.

greenplum.pushdown.function.like

pushdown_function_like

Включает pushdown оператора LIKE. Значение по умолчанию: true.

greenplum.pushdown.function.substring

pushdown_function_substring

Включает pushdown функции SUBSTRING. Значение по умолчанию: true.

greenplum.pushdown.function.upper

pushdown_function_upper

Включает pushdown функции UPPER. Значение по умолчанию: true.

greenplum.pushdown.function.lower

pushdown_function_lower

Включает pushdown функции LOWER. Значение по умолчанию: true.