Skip to content
SanikadzePublic

About

Trino Greenplum Connector

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Trino Greenplum Connector

Коннектор Trino для Greenplum Database (io.trino.plugin.greenplum), построенный на фреймворке trino-base-jdbc. Поддерживает два режима чтения: стандартный JDBC через GP Master и Parallel Retrieve Cursor для высокопроизводительного чтения напрямую с GP-сегментов.

Требования

  • Java 25 (Eclipse Temurin 25+)
  • Trino 479
  • Greenplum 6.x+
  • Для Parallel Retrieve Cursor: расширение gp_parallel_retrieve_cursor, установленное в Greenplum

Архитектура

Режим JDBC (по умолчанию)

Все чтения проходят через GP Master по одному JDBC-соединению. Поддерживается полный pushdown: предикаты WHERE, агрегации (17+ функций), джойны (INNER/LEFT/RIGHT), TopN (ORDER BY + LIMIT). Оптимален для малых и средних результирующих наборов, где pushdown сокращает объём передаваемых данных.

Режим Parallel Retrieve Cursor

Читает данные напрямую с хостов GP-сегментов, минуя узкое место координатора:

  1. DECLARE prc_<queryId> PARALLEL RETRIEVE CURSOR FOR SELECT ... на GP Master
  2. gp_get_endpoints() возвращает список endpoint-ов сегментов (hostname, port, auth token)
  3. Каждый Trino-сплит подключается к назначенному сегменту через RETRIEVE FROM ENDPOINT
  4. Данные читаются параллельно со всех сегментов одновременно
  5. gp_wait_parallel_retrieve_cursor() + CLOSE финализируют курсор

Оптимален для полного сканирования больших таблиц, где параллелизм перевешивает отсутствие pushdown агрегаций и джойнов.

Адаптивный выбор режима

Когда PRC включён, коннектор использует статистику количества строк таблицы для выбора оптимального режима:

  • Оценка строк < min-rows-threshold --> стандартный JDBC (полный pushdown)
  • Оценка строк >= min-rows-threshold --> Parallel Retrieve Cursor (параллельное чтение)
  • Статистика недоступна --> Parallel Retrieve Cursor (предполагается большая таблица)

Оценки количества строк кешируются в RowCountEstimateCache (Guava Cache, maxSize=10 000, TTL=10 минут, заполняется из pg_class.reltuples).

Запись

Все записи используют протокол PostgreSQL COPY через CopyAPI для эффективной массовой загрузки. Формат с разделителем табуляцией, с корректным экранированием. Записи всегда идут через GP Master.

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

Свойства каталога

Создайте etc/catalog/greenplum.properties:

connector.name=greenplum
connection-url=jdbc:postgresql://gp-Master:5432/database
connection-user=trino_user
connection-password=secret

Все свойства

Свойство Тип По умолчанию Описание
connection-url string (обязательный) JDBC URL к GP Master
connection-user string (обязательный) Имя пользователя БД
connection-password string (обязательный) Пароль БД
greenplum.array-mapping enum DISABLED Маппинг типов массивов: DISABLED, AS_ARRAY, AS_JSON
greenplum.include-system-tables boolean false Включать системные таблицы GP в листинги схем
greenplum.experimental.enable-string-pushdown-with-collate boolean false Включить pushdown строк с учётом collation через COLLATE "C"
greenplum.parallel-retrieve-cursor.enabled boolean false Включить режим Parallel Retrieve Cursor
greenplum.parallel-retrieve-cursor.endpoint-timeout duration 30s Таймаут ожидания готовности endpoint-ов
greenplum.parallel-retrieve-cursor.min-rows-threshold long 100000 Минимальная оценка строк для активации режима PRC
greenplum.parallel-retrieve-cursor.fetch-size int 0 (авто) Размер выборки для операций RETRIEVE. 0 = адаптивный: max(100000/columnCount, 1000)

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

Свойство По умолчанию Описание
parallel_retrieve_cursor_enabled (из конфига каталога) Переопределение PRC вкл/выкл для сессии
array_mapping DISABLED Маппинг массивов для сессии
enable_string_pushdown_with_collate false Pushdown строк с collation для сессии

Поддержка Pushdown

Режим JDBC (полный pushdown)

  • Предикаты (WHERE): все операторы сравнения, IN, LIKE, IS NULL, арифметические, логические операторы
  • Агрегации: COUNT, SUM, AVG, MIN, MAX, STDDEV_SAMP, STDDEV_POP, VAR_SAMP, VAR_POP, COVAR_SAMP, COVAR_POP, CORR, REGR_INTERCEPT, REGR_SLOPE, COUNT(DISTINCT)
  • Джойны: INNER, LEFT OUTER, RIGHT OUTER (с COLLATE "C" для строковых колонок)
  • TopN: ORDER BY + LIMIT (с COLLATE "C" и явным NULLS FIRST/LAST)

Режим Parallel Retrieve Cursor (ограниченный pushdown)

Поддерживается:

  • Предикаты WHERE -- передаются в оператор DECLARE PARALLEL RETRIEVE CURSOR FOR SELECT ... WHERE ...
  • Проекции колонок -- выбираются только запрошенные колонки (не SELECT *)
  • Fallback -- если построение pushdown SQL не удалось, откат к SELECT * с предупреждением

Не поддерживается (применяется Trino после чтения с сегментов):

  • Pushdown агрегаций
  • Pushdown джойнов
  • Pushdown TopN / LIMIT

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

Очистка устаревших координаторов

При отмене запроса Trino до завершения всех операций параллельного чтения QD-соединение и курсор могут утечь. Для предотвращения:

  • ScheduledExecutorService запускает cleanupStaleMasters() каждые 30 секунд
  • Период ожидания = 3x endpoint-timeout (по умолчанию: 90 секунд)
  • Координатор считается устаревшим, когда lastActivityAt превышает период ожидания
  • Устаревшие координаторы закрываются: CLOSE курсор, rollback транзакции, закрытие соединения
  • При завершении коннектора (@PreDestroy) поток очистки останавливается и все оставшиеся координаторы закрываются

Поддерживаемые типы данных

Тип Trino Тип Greenplum
TINYINT smallint
SMALLINT smallint
INTEGER integer
BIGINT bigint
REAL float4
DOUBLE double precision
DECIMAL(p,s) numeric
VARCHAR(n) varchar
CHAR(n) bpchar
BOOLEAN bit
DATE date
TIME(p) time (точность до 6)
TIMESTAMP(p) timestamp
TIMESTAMP WITH TIME ZONE(p) timestamptz
VARBINARY bytea
JSON json / jsonb
UUID uuid
VARCHAR money, hstore, enum-типы
ARRAY Массивы PostgreSQL (при array-mapping=AS_ARRAY)

About

Trino Greenplum Connector

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages