Коннектор Redis#

Коннектор Redis позволяет запрашивать live-данные, хранящиеся в Redis. Его можно использовать для объединения данных между разными системами, например Redis и Hive.
Каждая пара ключ/значение Redis представляется в Trino как одна строка. Строки можно разбить на ячейки с помощью файлов определения таблиц.
В настоящее время поддерживаются только ключи Redis типов string и zset, а также значения Redis типов string и hash.
Требования#
Требования для использования коннектора в каталоге для подключения к источнику данных Redis:
Redis 5.0.14 или выше (Redis Cluster не поддерживается)
Сетевой доступ, по умолчанию через порт 6379, от координатора и workers Trino к Redis.
Конфигурация#
Чтобы настроить коннектор Redis, создайте файл свойств каталога
etc/catalog/example.properties со следующим содержимым, заменив свойства в
соответствии с вашей средой:
connector.name=redis
redis.table-names=schema1.table1,schema1.table2
redis.nodes=host:port
Несколько серверов Redis#
Вы можете иметь столько каталогов, сколько нужно. Если у вас есть
дополнительные серверы Redis, просто добавьте еще один файл свойств в
etc/catalog с другим именем, убедившись, что оно заканчивается на
.properties.
Свойства конфигурации#
Доступны следующие свойства конфигурации:
Имя свойства |
Описание |
|---|---|
|
Список всех таблиц, предоставляемых каталогом |
|
Имя схемы по умолчанию для таблиц |
|
Расположение сервера Redis |
|
Параметр Redis для сканирования ключей |
|
Получает значения, связанные с указанным числом ключей, в команде Redis, например MGET(key…) |
|
Ключи Redis имеют префикс schema-name:table-name |
|
Разделитель между schema_name и table_name, если используется redis.key-prefix-schema-table |
|
Каталог, содержащий файлы описаний таблиц |
|
Время кеширования файлов описаний таблиц |
|
Управляет тем, являются ли внутренние столбцы частью схемы таблицы |
|
Индекс базы данных Redis |
|
Имя пользователя сервера Redis |
|
Пароль сервера Redis |
redis.table-names#
Список всех таблиц, предоставляемых этим каталогом, через запятую. Имя таблицы
может быть неквалифицированным (простое имя) и помещается в схему по умолчанию
(см. ниже) либо квалифицированным с именем схемы
(<schema-name>.<table-name>).
Для каждой определенной таблицы может существовать файл описания таблицы (см. ниже). Если файл описания таблицы отсутствует, таблица содержит только внутренние столбцы (см. ниже).
Это свойство необязательно; коннектор полагается на файлы описаний таблиц,
указанные в свойстве redis.table-description-dir.
redis.default-schema#
Задает схему, которая будет содержать все таблицы, определенные без квалифицирующего имени схемы.
Это свойство необязательно; значение по умолчанию — default.
redis.nodes#
Пара hostname:port для сервера Redis.
Это свойство обязательно; значения по умолчанию нет.
Redis Cluster не поддерживается.
redis.scan-count#
Внутренний параметр COUNT для команды Redis SCAN, когда коннектор использует SCAN для поиска ключей данных. Этот параметр можно использовать для настройки производительности коннектора Redis.
Это свойство необязательно; значение по умолчанию — 100.
redis.max-keys-per-fetch#
Внутреннее количество ключей для команды Redis MGET и команды Pipeline HGETALL, когда коннектор использует эти команды для поиска значений ключей. Этот параметр можно использовать для настройки производительности коннектора Redis.
Это свойство необязательно; значение по умолчанию — 100.
redis.key-prefix-schema-table#
Если true, для таблицы сканируются только ключи с префиксом
schema-name:table-name, а все остальные ключи отфильтровываются. Если
false, сканируются все ключи.
Это свойство необязательно; значение по умолчанию — false.
redis.key-delimiter#
Символ, используемый для разделения schema-name и table-name, когда
redis.key-prefix-schema-table равно true.
Это свойство необязательно; значение по умолчанию — :.
redis.table-description-dir#
Ссылается на папку в развертывании Trino, содержащую один или несколько JSON
файлов, которые должны заканчиваться на .json и содержать файлы описаний
таблиц.
Обратите внимание, что файлы описаний таблиц будут использоваться только узлом координатора Trino.
Это свойство необязательно; значение по умолчанию — etc/redis.
redis.table-description-cache-ttl#
Коннектор Redis динамически загружает файлы описаний таблиц после ожидания
времени, указанного этим свойством. Поэтому при добавлении, обновлении или
удалении файла, заканчивающегося на .json, в папке
redis.table-description-dir не нужно обновлять свойство redis.table-names и
перезапускать сервис Trino.
Это свойство необязательно; значение по умолчанию — 5m.
redis.hide-internal-columns#
Помимо столбцов данных, определенных в файле описания таблицы, коннектор
поддерживает несколько дополнительных столбцов для каждой таблицы. Если эти
столбцы скрыты, их все еще можно использовать в запросах, но они не
отображаются в DESCRIBE <table-name> или SELECT *.
Это свойство необязательно; значение по умолчанию — true.
redis.database-index#
База данных Redis для запроса.
Это свойство необязательно; значение по умолчанию — 0.
redis.user#
Имя пользователя сервера Redis.
Это свойство необязательно; значение по умолчанию — null.
redis.password#
Пароль для сервера Redis, защищенного паролем.
Это свойство необязательно; значение по умолчанию — null.
Внутренние столбцы#
Для каждой определенной таблицы коннектор поддерживает следующие столбцы:
Имя столбца |
Тип |
Описание |
|---|---|---|
|
VARCHAR |
Ключ Redis. |
|
VARCHAR |
Значение Redis, соответствующее ключу. |
|
BIGINT |
Количество байтов в ключе. |
|
BIGINT |
Количество байтов в значении. |
|
BOOLEAN |
True, если декодер не смог декодировать ключ для этой строки. Если true, столбцы данных, сопоставленные из ключа, считаются недопустимыми. |
|
BOOLEAN |
True, если декодер не смог декодировать сообщение для этой строки. Если true, столбцы данных, сопоставленные из значения, считаются недопустимыми. |
Для таблиц без файла определения таблицы столбцы _key_corrupt и
_value_corrupt равны false.
Файлы определения таблиц#
С коннектором Redis можно дополнительно разложить пары ключ/значение Redis на детальные ячейки, если строка ключа/значения соответствует определенному формату. Этот процесс определяет новые столбцы, которые затем можно запрашивать из Trino.
Файл определения таблицы состоит из JSON-определения таблицы. Имя файла может
быть произвольным, но должно заканчиваться на .json.
{
"tableName": ...,
"schemaName": ...,
"key": {
"dataFormat": ...,
"fields": [
...
]
},
"value": {
"dataFormat": ...,
"fields": [
...
]
}
}
Поле |
Обязательность |
Тип |
Описание |
|---|---|---|---|
|
обязательно |
string |
Имя таблицы Trino, определенной этим файлом. |
|
необязательно |
string |
Схема, которая будет содержать таблицу. Если опущено, используется схема по умолчанию. |
|
необязательно |
JSON object |
Определения полей для столбцов данных, сопоставленных с ключом значения. |
|
необязательно |
JSON object |
Определения полей для столбцов данных, сопоставленных с самим значением. |
Описание dataFormat и различных доступных декодеров см. на странице
коннектора Kafka.
Помимо указанных выше типов Kafka, коннектор Redis поддерживает тип hash для
поля value, которое представляет данные, хранящиеся в Redis hash.
{
"tableName": ...,
"schemaName": ...,
"value": {
"dataFormat": "hash",
"fields": [
...
]
}
}
Сопоставление типов#
Поскольку Trino и Redis поддерживают типы, которых нет в другой системе, этот коннектор сопоставляет некоторые типы при чтении данных. Сопоставление типов зависит от файловых форматов RAW, CSV, JSON и AVRO.
Декодирование строк#
Декодер используется для сопоставления данных со столбцами таблицы.
Коннектор содержит следующие декодеры:
raw: сообщение не интерпретируется; диапазоны байтов сырого сообщения сопоставляются со столбцами таблицы.csv: сообщение интерпретируется как сообщение с разделением запятыми, а поля сопоставляются со столбцами таблицы.json: сообщение разбирается как JSON, а поля JSON сопоставляются со столбцами таблицы.avro: сообщение разбирается на основе схемы Avro, а поля Avro сопоставляются со столбцами таблицы.
Note
Если для таблицы нет файла определения таблицы, используется декодер dummy,
который не предоставляет никаких столбцов.
Raw-декодер#
Raw-декодер поддерживает чтение необработанных байтовых значений из сообщения или ключа и преобразование их в столбцы Trino.
Для полей поддерживаются следующие атрибуты:
dataFormat— выбирает ширину преобразуемого типа данных.type— тип данных Trino. Список поддерживаемых типов данных см. в таблице ниже.mapping—<start>[:<end>]— начальная и конечная позиция байтов для преобразования (необязательно).
Атрибут dataFormat выбирает число преобразуемых байтов. Если он отсутствует,
предполагается BYTE. Все значения знаковые.
Поддерживаются следующие значения:
BYTE— один байт.SHORT— два байта (big-endian).INT— четыре байта (big-endian).LONG— восемь байтов (big-endian).FLOAT— четыре байта (формат IEEE 754).DOUBLE— восемь байтов (формат IEEE 754).
Атрибут type определяет тип данных Trino, на который сопоставляется значение.
В зависимости от типа Trino, назначенного столбцу, можно использовать разные
значения dataFormat:
Тип данных Trino |
Допустимые значения |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Другие типы не поддерживаются.
Атрибут mapping задает диапазон байтов в ключе или сообщении, используемый
для декодирования. Он может быть одним или двумя числами, разделенными
двоеточием (<start>[:<end>]).
Если задана только начальная позиция:
Для типов фиксированной ширины столбец использует соответствующее число байтов для указанного
dataFormat(см. выше).При декодировании значения
VARCHARиспользуются все байты от начальной позиции до конца сообщения.
Если заданы начальная и конечная позиции:
Для типов фиксированной ширины размер должен быть равен числу байтов, используемых указанным
dataFormat.Для типа данных
VARCHARиспользуются все байты между начальной позицией (включительно) и конечной позицией (исключительно).
Если атрибут mapping не указан, это эквивалентно начальной позиции 0 и
неуказанной конечной позиции.
Схема декодирования числовых типов данных (BIGINT, INTEGER, SMALLINT,
TINYINT, DOUBLE) проста. Последовательность байтов считывается из входного
сообщения и декодируется согласно одному из вариантов:
кодировка big-endian (для целочисленных типов);
формат IEEE 754 (для
DOUBLE).
Длина декодированной последовательности байтов подразумевается значением
dataFormat.
Для типа данных VARCHAR последовательность байтов интерпретируется согласно
кодировке UTF-8.
CSV decoder#
The CSV decoder converts the bytes representing a message or key into a string using UTF-8 encoding, and interprets the result as a link of comma-separated values.
For fields, the type and mapping attributes must be defined:
type- Trino data type. See the following table for a list of supported data types.mapping- The index of the field in the CSV record.
The dataFormat and formatHint attributes are not supported and must be
omitted.
Trino data type |
Decoding rules |
|---|---|
|
Decoded using Java |
|
Decoded using Java |
|
“true” character sequence maps to |
|
Used as is |
No other types are supported.
Декодер JSON#
Декодер JSON преобразует байты, представляющие сообщение или ключ, в Javascript Object Notation (JSON) согласно RFC 4627. Сообщение или ключ должны преобразовываться в объект JSON, а не в массив или простой тип.
Для полей поддерживаются следующие атрибуты:
type— тип данных Trino для столбца.dataFormat— декодер поля, используемый для столбца.mapping— разделенный косыми чертами список имен полей для выбора поля из объекта JSON.formatHint— только дляcustom-date-time.
Декодер JSON поддерживает несколько декодеров полей: _default используется
для стандартных столбцов таблицы, а также доступны декодеры для типов на основе
даты и времени.
В следующей таблице перечислены типы данных Trino, которые можно использовать в
type, соответствующие декодеры полей и значения, задаваемые через атрибут
dataFormat:
Тип данных Trino |
Допустимые значения |
|---|---|
|
Декодер поля по умолчанию (атрибут |
|
|
|
|
|
|
|
|
|
|
Другие типы не поддерживаются.
Декодер поля по умолчанию#
Это стандартный декодер поля. Он поддерживает все физические типы данных Trino. Значение поля преобразуется по правилам преобразования JSON в логическое, целочисленное, вещественное или строковое значение. Этот декодер следует использовать для столбцов, не основанных на дате или времени.
Декодеры даты и времени#
Чтобы преобразовать значения из объектов JSON в столбцы Trino DATE, TIME,
TIME WITH TIME ZONE, TIMESTAMP или TIMESTAMP WITH TIME ZONE, выберите
специальные декодеры с помощью атрибута dataFormat в определении поля.
iso8601— текстовый, разбирает текстовое поле как метку времени ISO 8601.rfc2822— текстовый, разбирает текстовое поле как метку времени RFC 2822.custom-date-time— текстовый, разбирает текстовое поле согласно шаблону формата Joda, указанному через атрибутformatHint. Шаблон формата должен соответствовать https://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html.milliseconds-since-epoch— числовой, интерпретирует текст или число как количество миллисекунд с начала эпохи.seconds-since-epoch— числовой, интерпретирует текст или число как количество миллисекунд с начала эпохи.
Для типов данных TIMESTAMP WITH TIME ZONE и TIME WITH TIME ZONE, если
информация о часовом поясе присутствует в декодированном значении, она
используется как значение Trino. В противном случае часовой пояс результата
устанавливается в UTC.
Avro decoder#
The Avro decoder converts the bytes representing a message or key in Avro format based on a schema. The message must have the Avro schema embedded. Trino does not support schemaless Avro decoding.
The dataSchema must be defined for any key or message using Avro
decoder. Avro decoder should point to the location of a valid Avro
schema file of the message which must be decoded. This location can be a remote
web server (e.g.: dataSchema: 'http://example.org/schema/avro_data.avsc') or
local file system(e.g.: dataSchema: '/usr/local/schema/avro_data.avsc'). The
decoder fails if this location is not accessible from the Trino cluster.
The following attributes are supported:
name- Name of the column in the Trino table.type- Trino data type of column.mapping- A slash-separated list of field names to select a field from the Avro schema. If the field specified inmappingdoes not exist in the original Avro schema, a read operation returnsNULL.
The following table lists the supported Trino types that can be used in type
for the equivalent Avro field types:
Trino data type |
Allowed Avro data type |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
No other types are supported.
Avro schema evolution#
The Avro decoder supports schema evolution with backward compatibility. With backward compatibility, a newer schema can be used to read Avro data created with an older schema. Any change in the Avro schema must also be reflected in Trino’s topic definition file. Newly added or renamed fields must have a default value in the Avro schema file.
The schema evolution behavior is as follows:
Column added in new schema: Data created with an older schema produces a default value when the table is using the new schema.
Column removed in new schema: Data created with an older schema no longer outputs the data from the column that was removed.
Column is renamed in the new schema: This is equivalent to removing the column and adding a new one, and data created with an older schema produces a default value when the table is using the new schema.
Changing type of column in the new schema: If the type coercion is supported by Avro, then the conversion happens. An error is thrown for incompatible types.
Поддержка SQL#
Коннектор предоставляет глобально доступные операторы и операторы чтения для доступа к данным и метаданным в Redis.
Производительность#
Коннектор включает ряд улучшений производительности, подробно описанных в следующих разделах.
Pushdown#
Note
Коннектор выполняет проталкивание там, где это может повысить производительность, но ради сохранения корректности операция может не проталкиваться. Когда проталкивание операции может дать лучшую производительность, но создает риск для корректности, коннектор отдает приоритет корректности.
Поддержка predicate pushdown#
Коннектор поддерживает pushdown только для ключей типа string; тип zset не
поддерживается. Pushdown ключей не поддерживается, если в файле определения
таблицы задано несколько полей ключа.
Коннектор поддерживает pushdown предикатов равенства, таких как IN или =.
Предикаты неравенства, такие как !=, и диапазонные предикаты, такие как >,
< или BETWEEN, не проталкиваются.
В следующем примере предикат первого запроса не проталкивается, поскольку > —
диапазонный предикат. Остальные запросы проталкиваются:
-- Не проталкивается
SELECT * FROM nation WHERE redis_key > 'CANADA';
-- Проталкивается
SELECT * FROM nation WHERE redis_key = 'CANADA';
SELECT * FROM nation WHERE redis_key IN ('CANADA', 'POLAND');