Коннектор 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
Все чтения проходят через GP Master по одному JDBC-соединению. Поддерживается полный pushdown: предикаты WHERE, агрегации (17+ функций), джойны (INNER/LEFT/RIGHT), TopN (ORDER BY + LIMIT). Оптимален для малых и средних результирующих наборов, где pushdown сокращает объём передаваемых данных.
Читает данные напрямую с хостов GP-сегментов, минуя узкое место координатора:
DECLARE prc_<queryId> PARALLEL RETRIEVE CURSOR FOR SELECT ...на GP Mastergp_get_endpoints()возвращает список endpoint-ов сегментов (hostname, port, auth token)- Каждый Trino-сплит подключается к назначенному сегменту через
RETRIEVE FROM ENDPOINT - Данные читаются параллельно со всех сегментов одновременно
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 для сессии |
- Предикаты (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)
Поддерживается:
- Предикаты 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) |