Перейти к основному содержимому
Версия: 2.0.x

Iceberg catalog

подсказка

Для быстрого старта с Selena см. раздел Быстрый старт.

Iceberg catalog — это тип внешнего каталога, который поддерживается Selena начиная с версии v1.5.2. С Iceberg catalogs вы можете:

  • Напрямую запрашивать данные, хранящиеся в Iceberg, без необходимости вручную создавать таблицы.
  • Использовать INSERT INTO или асинхронные материализованные представления (которые поддерживаются с v1.5.2) для обработки данных, хранящихся в Iceberg, и загрузки данных в Selena.
  • Выполнять операции в Selena для создания или удаления баз данных и таблиц Iceberg, или записывать данные из таблиц Selena в таблицы Iceberg формата Parquet с помощью INSERT INTO (эта функция поддерживается с v1.5.2).

Чтобы обеспечить успешное выполнение SQL-запросов в вашем Iceberg cluster, ваш Selena cluster должен иметь доступ к системе хранения и metastore вашего Iceberg cluster. Selena поддерживает следующие системы хранения и metastore:

  • Распределенная файловая система (HDFS) или объектное хранилище, такое как AWS S3, Microsoft Azure Storage, Google GCS или другая S3-совместимая система хранения (например, MinIO)

  • Metastore, такой как Hive metastore, AWS Glue или Tabular

примечание
  • Если вы выбираете AWS S3 в качестве хранилища, вы можете использовать HMS или AWS Glue в качестве metastore. Если вы выбираете любую другую систему хранения, вы можете использовать только HMS в качестве metastore.
  • Если вы выбираете Tabular в качестве metastore, вам нужно использовать Iceberg REST catalog.

Примечания по использованию

Обратите внимание на следующие моменты при использовании Selena для запроса данных из Iceberg:

Формат файлаФормат сжатияВерсия таблицы Iceberg
ParquetSNAPPY, LZ4, ZSTD, GZIP и NO_COMPRESSION
  • v1 tables: поддерживается.
  • v2 tables: поддерживается с Selena v1.5.2, при этом запросы к этим v2 tables поддерживают position deletes. В более поздних версиях запросы к v2 tables также поддерживают equality deletes.
ORCZLIB, SNAPPY, LZO, LZ4, ZSTD и NO_COMPRESSION
  • v1 tables: поддерживается.
  • v2 tables: поддерживается с Selena v1.5.2, при этом запросы к этим v2 tables поддерживают position deletes. В более поздних версиях запросы к v2 tables также поддерживают equality deletes.

Подготовка к интеграции

Перед созданием Iceberg catalog убедитесь, что ваш Selena cluster может интегрироваться с системой хранения и metastore вашего Iceberg cluster.


Хранилище

Выберите вкладку, соответствующую вашему типу хранилища:

Если ваш Iceberg cluster использует AWS S3 в качестве хранилища или AWS Glue в качестве metastore, выберите подходящий метод аутентификации и выполните необходимые подготовительные действия, чтобы убедиться, что ваш Selena cluster может получить доступ к соответствующим облачным ресурсам AWS.

Рекомендуются следующие методы аутентификации:

  • Instance profile
  • Assumed role
  • IAM user

Из вышеупомянутых трех методов аутентификации instance profile является наиболее широко используемым.

Для получения дополнительной информации см. Подготовка к аутентификации в AWS IAM.


Создание Iceberg catalog

Синтаксис

CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "iceberg",
[SecurityParams],
MetastoreParams,
StorageCredentialParams,
MetadataRelatedParams
)

Параметры

catalog_name

Имя Iceberg catalog. Соглашения об именовании следующие:

  • Имя может содержать буквы, цифры (0-9) и символы подчеркивания (_). Оно должно начинаться с буквы.
  • Имя чувствительно к регистру и не может превышать 1023 символа.

comment

Описание Iceberg catalog. Этот параметр является опциональным.

type

Тип вашего источника данных. Установите значение iceberg.

SecurityParams

Параметр(ы) о том, как Selena управляет доступом к данным каталога.

Подробные инструкции по управлению доступом к данным для Iceberg-каталогов см. в разделе Настройка безопасности для Iceberg REST Catalog.

catalog.access.control

Политика контроля доступа к данным. Допустимые значения:

  • native (по умолчанию): используется встроенная система контроля доступа к данным Selena.
  • allowall: все проверки доступа к данным делегируются самому Catalog.
  • ranger: проверки доступа к данным делегируются Apache Ranger.

MetastoreParams

Набор параметров о том, как Selena интегрируется с metastore вашего источника данных. Выберите вкладку, соответствующую вашему типу metastore:

Hive metastore

Если вы выбираете Hive metastore в качестве metastore вашего источника данных, настройте MetastoreParams следующим образом:

"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "<hive_metastore_uri>"
примечание

Перед запросом данных Iceberg вы должны добавить сопоставление между именами хостов и IP-адресами узлов вашего Hive metastore в путь /etc/hosts. В противном случае Selena может не получить доступ к вашему Hive metastore при запуске запроса.

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

  • iceberg.catalog.type

    • Обязательный: Да
    • Описание: Тип metastore, который вы используете для вашего Iceberg cluster. Установите значение hive.
  • hive.metastore.uris

    • Обязательный: Да
    • Описание: URI вашего Hive metastore. Формат: thrift://<metastore_IP_address>:<metastore_port>.
      Если для вашего Hive metastore включена высокая доступность (HA), вы можете указать несколько URI metastore и разделить их запятыми (,), например, "thrift://<metastore_IP_address_1>:<metastore_port_1>,thrift://<metastore_IP_address_2>:<metastore_port_2>,thrift://<metastore_IP_address_3>:<metastore_port_3>".

StorageCredentialParams

Набор параметров о том, как Selena интегрируется с вашей системой хранения. Этот набор параметров является опциональным.

Обратите внимание на следующие моменты:

  • Если вы используете HDFS в качестве хранилища, вам не нужно настраивать StorageCredentialParams, и вы можете пропустить этот раздел. Если вы используете AWS S3, другую S3-совместимую систему хранения, Microsoft Azure Storage или Google GCS в качестве хранилища, вы должны настроить StorageCredentialParams.

  • Если вы используете Tabular в качестве metastore, вам не нужно настраивать StorageCredentialParams, и вы можете пропустить этот раздел. Если вы используете HMS или AWS Glue в качестве metastore, вы должны настроить StorageCredentialParams.

Выберите вкладку, соответствующую вашему типу хранилища:

AWS S3

Если вы выбираете AWS S3 в качестве хранилища для вашего Iceberg cluster, выполните одно из следующих действий:

  • Чтобы выбрать метод аутентификации на основе instance profile, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "true",
    "aws.s3.region" = "<aws_s3_region>"
  • Чтобы выбрать метод аутентификации на основе assumed role, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "true",
    "aws.s3.iam_role_arn" = "<iam_role_arn>",
    "aws.s3.region" = "<aws_s3_region>"
  • Чтобы выбрать метод аутентификации на основе IAM user, настройте StorageCredentialParams следующим образом:

    "aws.s3.use_instance_profile" = "false",
    "aws.s3.access_key" = "<iam_user_access_key>",
    "aws.s3.secret_key" = "<iam_user_secret_key>",
    "aws.s3.region" = "<aws_s3_region>"
  • Чтобы выбрать vended credential (поддерживается с v2.0.0) с REST catalog, настройте StorageCredentialParams следующим образом:

    "aws.s3.region" = "<aws_s3_region>"

StorageCredentialParams для AWS S3:

aws.s3.use_instance_profile
  • Обязательный: Да
  • Описание: Указывает, следует ли включить метод аутентификации на основе instance profile и метод аутентификации на основе assumed role. Допустимые значения: true и false. Значение по умолчанию: false.
aws.s3.iam_role_arn
  • Обязательный: Нет
  • Описание: ARN роли IAM, которая имеет привилегии в вашем AWS S3 bucket. Если вы используете метод аутентификации на основе assumed role для доступа к AWS S3, вы должны указать этот параметр.
aws.s3.region
  • Обязательный: Да
  • Описание: Регион, в котором находится ваш AWS S3 bucket. Пример: us-west-1.
aws.s3.access_key
  • Обязательный: Нет
  • Описание: Ключ доступа вашего пользователя IAM. Если вы используете метод аутентификации на основе IAM user для доступа к AWS S3, вы должны указать этот параметр.
aws.s3.secret_key
  • Обязательный: Нет
  • Описание: Секретный ключ вашего пользователя IAM. Если вы используете метод аутентификации на основе IAM user для доступа к AWS S3, вы должны указать этот параметр.

Для получения информации о том, как выбрать метод аутентификации для доступа к AWS S3 и как настроить политику контроля доступа в консоли AWS IAM, см. Параметры аутентификации для доступа к AWS S3.


MetadataRelatedParams

Набор параметров о кэше метаданных Iceberg в Selena. Этот набор параметров является опциональным.

С v1.5.2 Selena поддерживает стратегию периодического обновления метаданных. В большинстве случаев вы можете игнорировать приведенные ниже параметры и не настраивать параметры политики, поскольку значения по умолчанию этих параметров уже обеспечивают производительность из коробки. Вы можете настроить режим парсинга метаданных Iceberg с помощью системной переменной plan_mode.

ПараметрПо умолчаниюОписание
enable_iceberg_metadata_cachetrueКэшировать ли метаданные, связанные с Iceberg, включая Table Cache, Partition Name Cache, а также Data File Cache и Delete Data File Cache в Manifest.
iceberg_manifest_cache_with_column_statisticsfalseКэшировать ли статистику столбцов.
refresh_iceberg_manifest_min_length2 * 1024 * 1024Минимальная длина файла Manifest, которая запускает обновление Data File Cache.
iceberg_data_file_cache_memory_usage_ratio0.1Максимальное соотношение использования памяти для кэша Manifest файлов данных. Поддерживается с v1.5.2.
iceberg_delete_file_cache_memory_usage_ratio0.1Максимальное соотношение использования памяти для кэша Manifest файлов удаления. Поддерживается с v1.5.2.
iceberg_table_cache_refresh_interval_sec60Интервал (в секундах), с которым запускается асинхронное обновление кэша таблиц Iceberg. Поддерживается с v1.5.2.

Начиная с v1.5.2, Selena может получать статистику таблиц Iceberg, читая метаданные Iceberg через установку следующих параметров, без активного запуска сбора статистики таблиц Iceberg.

ПараметрПо умолчаниюОписание
enable_get_stats_from_external_metadatafalseПолучать ли статистику из метаданных Iceberg. Когда этот параметр установлен в true, вы можете дополнительно контролировать, какой тип статистики собирать, через системную переменную enable_get_stats_from_external_metadata.

Примеры

Следующие примеры создают Iceberg catalog с именем iceberg_catalog_hms или iceberg_catalog_glue, в зависимости от типа metastore, который вы используете, для запроса данных из вашего Iceberg cluster. Выберите вкладку, соответствующую вашему типу хранилища:

AWS S3

Если вы выбираете учетные данные на основе instance profile
  • Если вы используете Hive metastore в вашем Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_hms
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "hive",
    "hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
    "aws.s3.use_instance_profile" = "true",
    "aws.s3.region" = "us-west-2"
    );
  • Если вы используете AWS Glue в вашем Amazon EMR Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_glue
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "glue",
    "aws.glue.use_instance_profile" = "true",
    "aws.glue.region" = "us-west-2",
    "aws.s3.use_instance_profile" = "true",
    "aws.s3.region" = "us-west-2"
    );
Если вы выбираете учетные данные на основе assumed role
  • Если вы используете Hive metastore в вашем Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_hms
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "hive",
    "hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
    "aws.s3.use_instance_profile" = "true",
    "aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/test_s3_role",
    "aws.s3.region" = "us-west-2"
    );
  • Если вы используете AWS Glue в вашем Amazon EMR Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_glue
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "glue",
    "aws.glue.use_instance_profile" = "true",
    "aws.glue.iam_role_arn" = "arn:aws:iam::081976408565:role/test_glue_role",
    "aws.glue.region" = "us-west-2",
    "aws.s3.use_instance_profile" = "true",
    "aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/test_s3_role",
    "aws.s3.region" = "us-west-2"
    );
Если вы выбираете учетные данные на основе IAM user
  • Если вы используете Hive metastore в вашем Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_hms
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "hive",
    "hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
    "aws.s3.use_instance_profile" = "false",
    "aws.s3.access_key" = "<iam_user_access_key>",
    "aws.s3.secret_key" = "<iam_user_access_key>",
    "aws.s3.region" = "us-west-2"
    );
  • Если вы используете AWS Glue в вашем Amazon EMR Iceberg cluster, выполните команду, подобную приведенной ниже:

    CREATE EXTERNAL CATALOG iceberg_catalog_glue
    PROPERTIES
    (
    "type" = "iceberg",
    "iceberg.catalog.type" = "glue",
    "aws.glue.use_instance_profile" = "false",
    "aws.glue.access_key" = "<iam_user_access_key>",
    "aws.glue.secret_key" = "<iam_user_secret_key>",
    "aws.glue.region" = "us-west-2",
    "aws.s3.use_instance_profile" = "false",
    "aws.s3.access_key" = "<iam_user_access_key>",
    "aws.s3.secret_key" = "<iam_user_secret_key>",
    "aws.s3.region" = "us-west-2"
    );
Если вы выбираете vended credential

Если вы выбираете REST catalog с vended credential, выполните команду, подобную приведенной ниже:

CREATE EXTERNAL CATALOG polaris_s3
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.uri" = "http://xxx:xxx/api/catalog",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.rest.nested-namespace-enabled"="true",
"iceberg.catalog.security" = "oauth2",
"iceberg.catalog.oauth2.credential" = "xxxxx:xxxx",
"iceberg.catalog.oauth2.scope"='PRINCIPAL_ROLE:ALL',
"iceberg.catalog.warehouse" = "iceberg_catalog",
"aws.s3.region" = "us-west-2"
);

Использование вашего каталога

Просмотр Iceberg catalogs

Вы можете использовать SHOW CATALOGS для запроса всех каталогов в текущем Selena cluster:

SHOW CATALOGS;

Вы также можете использовать SHOW CREATE CATALOG для запроса оператора создания внешнего каталога. Следующий пример запрашивает оператор создания Iceberg catalog с именем iceberg_catalog_glue:

SHOW CREATE CATALOG iceberg_catalog_glue;

Переключение на Iceberg Catalog и базу данных в нем

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

  • Используйте SET CATALOG для указания Iceberg catalog в текущей сессии, а затем используйте USE для указания активной базы данных:

    -- Переключиться на указанный каталог в текущей сессии:
    SET CATALOG <catalog_name>
    -- Указать активную базу данных в текущей сессии:
    USE <db_name>
  • Непосредственно используйте USE для переключения на Iceberg catalog и базу данных в нем:

    USE <catalog_name>.<db_name>

Удаление Iceberg catalog

Вы можете использовать DROP CATALOG для удаления внешнего каталога.

Следующий пример удаляет Iceberg catalog с именем iceberg_catalog_glue:

DROP Catalog iceberg_catalog_glue;

Просмотр схемы таблицы Iceberg

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

  • Просмотр схемы

    DESC[RIBE] <catalog_name>.<database_name>.<table_name>
  • Просмотр схемы и местоположения из оператора CREATE

    SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>

Запрос таблицы Iceberg

  1. Используйте SHOW DATABASES для просмотра баз данных в вашем Iceberg cluster:

    SHOW DATABASES FROM <catalog_name>
  2. Переключитесь на Iceberg catalog и базу данных в нем.

  3. Используйте SELECT для запроса целевой таблицы в указанной базе данных:

    SELECT count(*) FROM <table_name> LIMIT 10

Создание базы данных Iceberg

Аналогично внутреннему каталогу Selena, если у вас есть привилегия CREATE DATABASE на Iceberg catalog, вы можете использовать оператор CREATE DATABASE для создания баз данных в этом Iceberg catalog. Эта функция поддерживается с v1.5.2.

подсказка

Вы можете предоставлять и отзывать привилегии с помощью GRANT и REVOKE.

Переключитесь на Iceberg catalog, а затем используйте следующий оператор для создания базы данных Iceberg в этом каталоге:

CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>/")]

Вы можете использовать параметр location для указания пути к файлу, в котором вы хотите создать базу данных. Поддерживаются как HDFS, так и облачное хранилище. Если вы не указываете параметр location, Selena создает базу данных в пути к файлу по умолчанию Iceberg catalog.

prefix варьируется в зависимости от используемой вами системы хранения:

HDFS

Значение Prefix: hdfs

Google GCS

Значение Prefix: gs

Azure Blob Storage

Значение Prefix:

  • Если ваша учетная запись хранения разрешает доступ по HTTP, prefixwasb.
  • Если ваша учетная запись хранения разрешает доступ по HTTPS, prefixwasbs.

Azure Data Lake Storage Gen1

Значение Prefix: adl

Azure Data Lake Storage Gen2

Значение Prefix:

  • Если ваша учетная запись хранения разрешает доступ по HTTP, prefixabfs.
  • Если ваша учетная запись хранения разрешает доступ по HTTPS, prefixabfss.

AWS S3 или другое S3-совместимое хранилище (например, MinIO)

Значение Prefix: s3


Удаление базы данных Iceberg

Аналогично внутренним базам данных Selena, если у вас есть привилегия DROP на базу данных Iceberg, вы можете использовать оператор DROP DATABASE для удаления этой базы данных Iceberg. Эта функция поддерживается с v1.5.2. Вы можете удалять только пустые базы данных.

Когда вы удаляете базу данных Iceberg, путь к файлу базы данных на вашем HDFS cluster или облачном хранилище не будет удален вместе с базой данных.

Переключитесь на Iceberg catalog, а затем используйте следующий оператор для удаления базы данных Iceberg в этом каталоге:

DROP DATABASE <database_name>;

Создание таблицы Iceberg

Аналогично внутренним базам данных Selena, если у вас есть привилегия CREATE TABLE на базу данных Iceberg, вы можете использовать оператор CREATE TABLE или CREATE TABLE AS SELECT для создания таблицы в этой базе данных Iceberg. Эта функция поддерживается с v1.5.2.

Переключитесь на Iceberg catalog и базу данных в нем, а затем используйте следующий синтаксис для создания таблицы Iceberg в этой базе данных.

Синтаксис

CREATE TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...
partition_column_definition1,partition_column_definition2...])
[partition_desc]
[ORDER BY sort_desc)]
[PROPERTIES ("key" = "value", ...)]
[AS SELECT query]

Параметры

column_definition

Синтаксис column_definition следующий:

col_name col_type [COMMENT 'comment']
примечание

Все столбцы, не являющиеся partition columns, должны использовать NULL в качестве значения по умолчанию. Это означает, что вы должны указать DEFAULT "NULL" для каждого столбца, не являющегося partition column, в операторе создания таблицы. Кроме того, partition columns должны быть определены после столбцов, не являющихся partition columns, и не могут использовать NULL в качестве значения по умолчанию.

partition_desc

Синтаксис partition_desc следующий:

PARTITION BY (partition_expr[, partition_expr...])

Каждый partition_expr может быть одной из следующих форм:

column_name
| transform_expr(column_name)
| transform_expr(column_name, parameter)

В настоящее время Selena поддерживает выражения преобразования partition, определенные в спецификации Apache Iceberg transform expr. Это позволяет Selena создавать таблицы Iceberg со скрытыми partition на основе преобразованных значений столбцов.

примечание

Partition columns должны быть определены после столбцов, не являющихся partition columns. Partition columns поддерживают все типы данных, за исключением FLOAT, DOUBLE, DECIMAL и DATETIME, и не могут использовать NULL в качестве значения по умолчанию.

ORDER BY

С v2.0.0 Selena поддерживает указание ключей сортировки для таблицы Iceberg через предложение ORDER BY, которое можно использовать для сортировки данных в одном файле данных в соответствии с указанным ключом сортировки.

Предложение ORDER BY может содержать более одного ключа сортировки в следующем формате:

ORDER BY (column_name [sort_direction] [nulls_order], ...)
  • column_name: Имя столбца, который будет использоваться в качестве ключа сортировки. Это должен быть столбец, существующий в схеме таблицы. В настоящее время выражения преобразования не поддерживаются.
  • sort_direction: Направление сортировки. Допустимые значения: ASC (по умолчанию) и DESC.
  • nulls_order: Порядок NULL значений. Допустимые значения: NULLS FIRST (по умолчанию, когда указано ASC) и NULLS LAST (по умолчанию, когда указано DESC).

sort_direction и nulls_order являются опциональными. Например, каждый из следующих является допустимым sort_desc:

  • column_name
  • column_name ASC
  • column_name DESC NULLS FIRST
PROPERTIES

Вы можете указать атрибуты таблицы в формате "key" = "value" в PROPERTIES. См. Атрибуты таблиц Iceberg.

В следующей таблице описаны несколько ключевых свойств.

location

Описание: Путь к файлу, в котором вы хотите создать таблицу Iceberg. Когда вы используете HMS в качестве metastore, вам не нужно указывать параметр location, поскольку Selena создаст таблицу в пути к файлу по умолчанию текущего Iceberg catalog. Когда вы используете AWS Glue в качестве metastore:

  • Если вы указали параметр location для базы данных, в которой вы хотите создать таблицу, вам не нужно указывать параметр location для таблицы. В этом случае таблица по умолчанию находится в пути к файлу базы данных, к которой она принадлежит.
  • Если вы не указали location для базы данных, в которой вы хотите создать таблицу, вы должны указать параметр location для таблицы.
file_format

Описание: Формат файла таблицы Iceberg. Поддерживается только формат Parquet. Значение по умолчанию: parquet.

compression_codec

Описание: Алгоритм сжатия, используемый для таблицы Iceberg. Поддерживаемые алгоритмы сжатия: SNAPPY, GZIP, ZSTD и LZ4. Значение по умолчанию: zstd.


Примеры

  1. Создайте таблицу без partition с именем unpartition_tbl. Таблица состоит из двух столбцов, id и score, как показано ниже:

    CREATE TABLE unpartition_tbl
    (
    id int,
    score double
    );
  2. Создайте таблицу с partition с именем partition_tbl_1. Таблица состоит из трех столбцов, action, id и dt, из которых id и dt определены как partition columns, как показано ниже:

    CREATE TABLE partition_tbl_1
    (
    action varchar(20),
    id int,
    dt date
    )
    PARTITION BY (id,dt);
  3. Запросите существующую таблицу с именем partition_tbl_1 и создайте таблицу с partition с именем partition_tbl_2 на основе результата запроса partition_tbl_1. Для partition_tbl_2 id и dt определены как partition columns, как показано ниже:

    CREATE TABLE partition_tbl_2
    PARTITION BY (id, dt)
    AS SELECT * from employee;
  4. Создайте таблицу с именем partition_tbl_3 со скрытыми partition. Таблица содержит три столбца: action, id и dt. Среди них id и dt используются в качестве ключей partition, но partition определены выражениями преобразования, поэтому эти partition являются скрытыми.

  CREATE TABLE partition_tbl_3 (
action VARCHAR(20),
id INT,
dt DATE
)
PARTITION BY bucket(id, 10), year(dt);

Эволюция спецификации partition (ADD/DROP PARTITION COLUMN)

Selena поддерживает эволюцию спецификации partition таблицы Iceberg путем добавления или удаления partition columns (включая выражения преобразования) с помощью ALTER TABLE ... ADD|DROP PARTITION COLUMN.

Синтаксис

ALTER TABLE [catalog.][database.]table_name
ADD PARTITION COLUMN partition_expr [, partition_expr ...];

ALTER TABLE [catalog.][database.]table_name
DROP PARTITION COLUMN partition_expr [, partition_expr ...];

partition_expr может быть именем столбца (identity transform) или одним из поддерживаемых выражений преобразования. Поддерживаемые выражения преобразования: year, month, day, hour, truncate и bucket.

Примеры

ALTER TABLE test_part_evo
ADD PARTITION COLUMN dt, truncate(value, 10), bucket(id, 10);

ALTER TABLE test_part_evo
DROP PARTITION COLUMN dt;

ALTER TABLE test_part_evo
ADD PARTITION COLUMN month(dt);

Запись данных в таблицу Iceberg

Аналогично внутренним таблицам Selena, если у вас есть привилегия INSERT на таблицу Iceberg, вы можете использовать оператор INSERT для записи данных таблицы Selena в эту таблицу Iceberg (в настоящее время поддерживаются только таблицы Iceberg формата Parquet). Эта функция поддерживается с v1.5.2.

Переключитесь на Iceberg catalog и базу данных в нем, а затем используйте следующий синтаксис для записи данных таблицы Selena в таблицу Iceberg формата Parquet в этой базе данных.

Синтаксис

INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }

-- Если вы хотите записать данные в указанные partition, используйте следующий синтаксис:
INSERT {INTO | OVERWRITE} <table_name>
PARTITION (par_col1=<value> [, par_col2=<value>...])
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
примечание

Partition columns не допускают значений NULL. Поэтому вы должны убедиться, что в partition columns таблицы Iceberg не загружаются пустые значения.

Параметры

INTO

Для добавления данных таблицы Selena к таблице Iceberg.

OVERWRITE

Для перезаписи существующих данных таблицы Iceberg данными таблицы Selena.

column_name

Имя целевого столбца, в который вы хотите загрузить данные. Вы можете указать один или несколько столбцов. Если вы указываете несколько столбцов, разделите их запятыми (,). Вы можете указывать только столбцы, которые фактически существуют в таблице Iceberg, и целевые столбцы, которые вы указываете, должны включать partition columns таблицы Iceberg. Целевые столбцы, которые вы указываете, сопоставляются один к одному последовательно со столбцами таблицы Selena, независимо от названий целевых столбцов. Если целевые столбцы не указаны, данные загружаются во все столбцы таблицы Iceberg. Если столбец таблицы Selena, не являющийся partition column, не может быть сопоставлен ни с одним столбцом таблицы Iceberg, Selena записывает значение по умолчанию NULL в столбец таблицы Iceberg. Если оператор INSERT содержит оператор запроса, возвращаемые типы столбцов которого отличаются от типов данных целевых столбцов, Selena выполняет неявное преобразование несовпадающих столбцов. Если преобразование не удается, будет возвращена ошибка синтаксического анализа.

expression

Выражение, которое присваивает значения целевому столбцу.

DEFAULT

Присваивает значение по умолчанию целевому столбцу.

query

Оператор запроса, результат которого будет загружен в таблицу Iceberg. Это может быть любой оператор SQL, поддерживаемый Selena.

PARTITION

Partition, в которые вы хотите загрузить данные. Вы должны указать все partition columns таблицы Iceberg в этом свойстве. Partition columns, которые вы указываете в этом свойстве, могут быть в другой последовательности, чем partition columns, которые вы определили в операторе создания таблицы. Если вы указываете это свойство, вы не можете указать свойство column_name.

Примеры

  1. Вставьте три строки данных в таблицу partition_tbl_1:

    INSERT INTO partition_tbl_1
    VALUES
    ("buy", 1, "2023-09-01"),
    ("sell", 2, "2023-09-02"),
    ("buy", 3, "2023-09-03");
  2. Вставьте результат запроса SELECT, который содержит простые вычисления, в таблицу partition_tbl_1:

    INSERT INTO partition_tbl_1 (id, action, dt) SELECT 1+1, 'buy', '2023-09-03';
  3. Вставьте результат запроса SELECT, который читает данные из таблицы partition_tbl_1, в ту же таблицу:

    INSERT INTO partition_tbl_1 SELECT 'buy', 1, date_add(dt, INTERVAL 2 DAY)
    FROM partition_tbl_1
    WHERE id=1;
  4. Вставьте результат запроса SELECT в partition, которые соответствуют двум условиям, dt='2023-09-01' и id=1, таблицы partition_tbl_2:

    INSERT INTO partition_tbl_2 SELECT 'order', 1, '2023-09-01';

    Или

    INSERT INTO partition_tbl_2 partition(dt='2023-09-01',id=1) SELECT 'order';
  5. Перезаписать все значения столбца action в partition, которые соответствуют двум условиям, dt='2023-09-01' и id=1, таблицы partition_tbl_1 на close:

    INSERT OVERWRITE partition_tbl_1 SELECT 'close', 1, '2023-09-01';

    Или

    INSERT OVERWRITE partition_tbl_1 partition(dt='2023-09-01',id=1) SELECT 'close';

Удаление таблицы Iceberg

Аналогично внутренним таблицам Selena, если у вас есть привилегия DROP на таблицу Iceberg, вы можете использовать оператор DROP TABLE для удаления этой таблицы Iceberg. Эта функция поддерживается с v1.5.2.

Когда вы удаляете таблицу Iceberg, путь к файлу таблицы и данные на вашем HDFS cluster или облачном хранилище не будут удалены вместе с таблицей.

Когда вы принудительно удаляете таблицу Iceberg (а именно, с ключевым словом FORCE, указанным в операторе DROP TABLE), данные таблицы на вашем HDFS cluster или облачном хранилище будут удалены вместе с таблицей, но путь к файлу таблицы сохраняется.

Переключитесь на Iceberg catalog и базу данных в нем, а затем используйте следующий оператор для удаления таблицы Iceberg в этой базе данных.

DROP TABLE <table_name> [FORCE];

Создание представления Iceberg

Вы можете определять представления Iceberg в Selena или добавлять диалект Selena к существующему представлению Iceberg. Запросы к таким представлениям Iceberg поддерживают абстрагирование диалекта Selena этих представлений. Эта функция поддерживается с v1.5.2.

CREATE VIEW [IF NOT EXISTS]
[<catalog>.<database>.]<view_name>
(
<column_name>[ COMMENT 'column comment']
[, <column_name>[ COMMENT 'column comment'], ...]
)
[COMMENT 'view comment']
[PROPERTIES ("key" = "value", ...)]
AS <query_statement>

Пример

Создайте представление Iceberg iceberg_view1 на основе таблицы Iceberg iceberg_table.

CREATE VIEW IF NOT EXISTS iceberg.iceberg_db.iceberg_view1 AS
SELECT k1, k2 FROM iceberg.iceberg_db.iceberg_table;

С v2.0.0 вы можете указывать атрибуты представления в формате "key" = "value" в PROPERTIES.

CREATE VIEW IF NOT EXISTS iceberg.iceberg_db.iceberg_view1
PROPERTIES (
"key1" = "value1",
"key2" = "value2"
)
AS
SELECT k1, k2 FROM iceberg.iceberg_db.iceberg_table;

Добавление или изменение диалекта Selena для существующего представления Iceberg

Если ваши представления Iceberg созданы из других систем, таких как Apache Spark, при этом вы хотите запрашивать эти представления из Selena, вы можете добавить диалект Selena к этим представлениям. Эта функция поддерживается с v1.5.2.

примечание
  • Вы должны гарантировать, что основные значения обоих диалектов представления идентичны. Selena и другие системы не гарантируют согласованность между различными определениями.
  • Вы можете определить только один диалект Selena для каждого представления Iceberg. Вы можете изменить определение диалекта с помощью предложения MODIFY.
ALTER VIEW
[<catalog>.<database>.]<view_name>
(
<column_name>
[, <column_name>]
)
{ ADD | MODIFY } DIALECT
<query_statement>

Пример

  1. Добавьте диалект Selena к существующему представлению Iceberg iceberg_view2.
ALTER VIEW iceberg.iceberg_db.iceberg_view2 ADD DIALECT SELECT k1, k2 FROM iceberg.iceberg_db.iceberg_table;
  1. Измените диалект Selena для существующего представления Iceberg iceberg_view2.
ALTER VIEW iceberg.iceberg_db.iceberg_view2 MODIFY DIALECT SELECT k1, k2, k3 FROM iceberg.iceberg_db.iceberg_table;

Ручная компакция

С v2.0.0 Selena поддерживает ручную компакцию таблиц Iceberg.

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

В этом случае вам нужно выполнить ручную компакцию таблицы или partition, чтобы объединить небольшие файлы данных и тем самым улучшить производительность.

Синтаксис

ALTER TABLE [catalog.][database.]table_name
EXECUTE rewrite_data_files
("key"=value [,"key"=value, ...])
[WHERE <predicate>]

Параметры

Свойства rewrite_data_files

Пары "key"=value, которые объявляют поведение ручной компакции. Обратите внимание, что вам нужно обернуть ключ в двойные кавычки.

min_file_size_bytes
  • Описание: Верхний предел небольшого файла данных. Файлы данных, размер которых меньше этого значения, будут объединены во время компакции.
  • Единица: Байт
  • Тип: Int
  • По умолчанию: 268,435,456 (256 МБ)
batch_size
  • Описание: Максимальный размер данных, которые могут быть обработаны в каждой партии.
  • Единица: Байт
  • Тип: Int
  • По умолчанию: 10,737,418,240 (10 ГБ)
rewrite_all
  • Описание: Перезаписывать ли все файлы данных во время компакции, игнорируя параметры, которые фильтруют файлы данных с определенными требованиями.
  • Единица: -
  • Тип: Boolean
  • По умолчанию: false
Предложение WHERE
  • Описание: Предикат фильтра, используемый для указания partition, которые будут участвовать в компакции.

Пример

Следующий пример выполняет ручную компакцию определенных partition в таблице Iceberg t1. Partition представлены предложением WHERE part_col = 'p1'. В этих partition файлы данных, которые меньше 134,217,728 байт (128 МБ), будут объединены во время компакции.

ALTER TABLE t1 EXECUTE rewrite_data_files("min_file_size_bytes"= 134217728) WHERE part_col = 'p1';

Настройка кэширования метаданных

Файлы метаданных вашего Iceberg cluster могут храниться в удаленном хранилище, таком как AWS S3 или HDFS. По умолчанию Selena кэширует метаданные Iceberg в памяти. Чтобы ускорить запросы, Selena использует двухуровневый механизм кэширования метаданных, с помощью которого она может кэшировать метаданные как в памяти, так и на диске. Для каждого первоначального запроса Selena кэширует результаты их вычислений. Если последующий запрос, семантически эквивалентный предыдущему, выполняется, Selena сначала пытается извлечь запрошенные метаданные из своих кэшей, и она извлекает метаданные из удаленного хранилища только тогда, когда метаданные не могут быть найдены в ее кэшах.

Selena использует алгоритм Least Recently Used (LRU) для кэширования и вытеснения данных. Основные правила следующие:

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

С v1.5.2 Selena поддерживает стратегию периодического обновления метаданных. Вы можете настроить план кэширования метаданных Iceberg с помощью системной переменной plan_mode.

Конфигурации FE по кэшированию метаданных Iceberg

enable_iceberg_metadata_disk_cache
  • Единица: Н/Д
  • Значение по умолчанию: false
  • Описание: Указывает, следует ли включить кэш диска.
iceberg_metadata_cache_disk_path
  • Единица: Н/Д
  • Значение по умолчанию: SelenaFE.SELENA_HOME_DIR + "/caches/iceberg"
  • Описание: Путь сохранения кэшированных файлов метаданных на диске.
iceberg_metadata_disk_cache_capacity
  • Единица: Байты
  • Значение по умолчанию: 2147483648, эквивалентно 2 ГБ
  • Описание: Максимальный размер кэшированных метаданных, разрешенных на диске.
iceberg_metadata_memory_cache_capacity
  • Единица: Байты
  • Значение по умолчанию: 536870912, эквивалентно 512 МБ
  • Описание: Максимальный размер кэшированных метаданных, разрешенных в памяти.
iceberg_metadata_memory_cache_expiration_seconds
  • Единица: Секунды
  • Значение по умолчанию: 86500
  • Описание: Количество времени, после которого запись кэша в памяти истекает, отсчитываемое от ее последнего доступа.
iceberg_metadata_disk_cache_expiration_seconds
  • Единица: Секунды
  • Значение по умолчанию: 604800, эквивалентно одной неделе
  • Описание: Количество времени, после которого запись кэша на диске истекает, отсчитываемое от ее последнего доступа.
iceberg_metadata_cache_max_entry_size
  • Единица: Байты
  • Значение по умолчанию: 8388608, эквивалентно 8 МБ
  • Описание: Максимальный размер файла, который может быть кэширован. Файлы, размер которых превышает значение этого параметра, не могут быть кэшированы. Если запрос запрашивает эти файлы, Selena извлекает их из удаленного хранилища.
enable_background_refresh_connector_metadata
  • Единица: -
  • Значение по умолчанию: true
  • Описание: Включать ли периодическое обновление кэша метаданных Iceberg. После включения Selena опрашивает metastore (Hive Metastore или AWS Glue) вашего Iceberg cluster и обновляет кэшированные метаданные часто используемых Iceberg catalogs для восприятия изменений данных. true указывает на включение обновления кэша метаданных Iceberg, а false указывает на отключение.
background_refresh_metadata_interval_millis
  • Единица: Миллисекунда
  • Значение по умолчанию: 600000
  • Описание: Интервал между двумя последовательными обновлениями кэша метаданных Iceberg. - Единица: миллисекунда.
background_refresh_metadata_time_secs_since_last_access_sec
  • Единица: Секунда
  • Значение по умолчанию: 86400
  • Описание: Время истечения задачи обновления кэша метаданных Iceberg. Для Iceberg catalog, к которому был осуществлен доступ, если к нему не было доступа более указанного времени, Selena прекращает обновление его кэшированных метаданных. Для Iceberg catalog, к которому не было доступа, Selena не будет обновлять его кэшированные метаданные.

Приложение A: Стратегия периодического обновления метаданных

Iceberg поддерживает snapshots. С новейшим snapshot вы можете получить новейший результат. Поэтому только кэшированные snapshots могут влиять на свежесть данных. В результате вам нужно обращать внимание только на стратегию обновления кэша, содержащего snapshot.

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

Timeline for updating and discarding cached metadata

Приложение B: Парсинг файлов метаданных

  • Распределенный план для большого объема метаданных

    Для эффективной обработки большого объема метаданных Selena использует распределенный подход с использованием нескольких узлов BE и CN. Этот метод использует возможности параллельных вычислений современных движков запросов, которые могут распределять задачи, такие как чтение, декомпрессия и фильтрация файлов manifest, по нескольким узлам. Обрабатывая эти файлы manifest параллельно, время, необходимое для извлечения метаданных, значительно сокращается, что приводит к более быстрому планированию заданий. Это особенно полезно для больших запросов, включающих множество файлов manifest, поскольку устраняет узкие места в одной точке и повышает общую эффективность выполнения запросов.

  • Локальный план для небольшого объема метаданных

    Для меньших запросов, где повторная декомпрессия и парсинг файлов manifest могут вводить ненужные задержки, используется другая стратегия. Selena кэширует десериализованные объекты памяти, особенно файлы Avro, для решения этой проблемы. Храня эти десериализованные файлы в памяти, система может обойти этапы декомпрессии и парсинга для последующих запросов. Этот механизм кэширования позволяет получить прямой доступ к необходимым метаданным, значительно сокращая время извлечения. В результате система становится более отзывчивой и лучше подходит для удовлетворения высоких требований к запросам и потребностей перезаписи материализованных представлений.

  • Адаптивная стратегия извлечения метаданных (по умолчанию)

    Selena спроектирована для автоматического выбора подходящего метода извлечения метаданных на основе различных факторов, включая количество узлов FE и BE/CN, количество их ядер CPU и количество файлов manifest, необходимых для текущего запроса. Этот адаптивный подход гарантирует, что система динамически оптимизирует извлечение метаданных без необходимости ручной настройки параметров, связанных с метаданными. Таким образом, Selena обеспечивает бесшовный опыт, балансируя между распределенными и локальными планами для достижения оптимальной производительности запросов в различных условиях.

Вы можете настроить план кэширования метаданных Iceberg с помощью системной переменной plan_mode.