Синтаксис
Аргументы
s3, azureBlobStorage, HDFS и file соответственно.
format указывает формат файлов данных в таблице Iceberg.
Для icebergS3 можно использовать необязательный параметр extra_credentials, чтобы передать role_arn для ролевого доступа в ClickHouse Cloud. Шаги по настройке см. в разделе Secure S3.
Возвращаемое значение
Пример
Определение именованной коллекции
Использование каталога данных
IcebergS3 и укажите необходимые настройки.
Например, REST Catalog с хранилищем MinIO:
Эволюция схемы
- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
Отсечение партиций
use_iceberg_partition_pruning = 1. Дополнительные сведения об отсечении партиций в Iceberg см. по адресу: https://iceberg.apache.org/spec/#partitioning
Путешествие во времени
Обработка таблиц с удалёнными строками
- Equality deletes
- Векторы удаления (появились в v3)
Базовое использование
iceberg_timestamp_ms и iceberg_snapshot_id.
Важные моменты
- Снимки обычно создаются в следующих случаях:
- В таблицу записываются новые данные
- Выполняется компакция данных
- Изменения схемы обычно не создают снимков — это приводит к важным особенностям при использовании путешествия во времени с таблицами, схема которых менялась.
Примеры сценариев
Сценарий 1: Изменения схемы без новых снимков
- В ts1 & ts2: отображаются только два исходных столбца
- В ts3: отображаются все три столбца, при этом в поле цены для первой строки указано NULL
Сценарий 2: Различия между исторической и текущей схемами
ALTER TABLE не создает нового снимка, а для текущей таблицы Spark берет значение schema_id из последнего файла метаданных, а не из снимка.
Сценарий 3: Различия между исторической и текущей схемой
Определение файла metadata.json
iceberg в ClickHouse системе необходимо найти правильный файл metadata.json, который описывает структуру таблицы Iceberg. Ниже описано, как происходит этот поиск:
Поиск кандидатов (в порядке приоритета)
- Явное указание пути:
*Если задан
iceberg_metadata_file_path, система использует этот точный путь, объединяя его с путем к каталогу таблицы Iceberg.
- Если задан этот параметр, все остальные параметры разрешения игнорируются.
-
Сопоставление UUID таблицы:
*Если указан
iceberg_metadata_table_uuid, система: *Просматривает только файлы.metadata.jsonв каталогеmetadata*Отбирает файлы, содержащие полеtable-uuid, которое соответствует указанному UUID (регистронезависимо) -
Поиск по умолчанию:
*Если ни один из указанных выше параметров не задан, кандидатами считаются все файлы
.metadata.jsonв каталогеmetadata
Выбор самого нового файла
-
Если
iceberg_recent_metadata_file_by_last_updated_ms_fieldвключён: -
Выбирается файл с наибольшим значением
last-updated-ms - В противном случае:
- Выбирается файл с наибольшим номером версии
-
(Версия обозначается как
Vв именах файлов форматаV.metadata.jsonилиV-uuid.metadata.json)
iceberg в ClickHouse напрямую интерпретирует файлы, хранящиеся в S3, как таблицы Iceberg, поэтому важно понимать эти правила разрешения.
Кэш метаданных
Iceberg и табличная функция поддерживают кэш метаданных, в котором хранится информация о файлах манифеста, списке манифестов и metadata json. Кэш хранится в памяти. Эта возможность управляется настройкой use_iceberg_metadata_files_cache, которая включена по умолчанию.
Псевдонимы
iceberg теперь — псевдоним icebergS3.
Виртуальные столбцы
_path— Путь к файлу. Тип:LowCardinality(String)._file— Имя файла. Тип:LowCardinality(String)._size— Размер файла в байтах. Тип:Nullable(UInt64). Если размер файла неизвестен, значение —NULL._time— Время последнего изменения файла. Тип:Nullable(DateTime). Если время неизвестно, значение —NULL._etag— ETag файла. Тип:LowCardinality(String). Если ETag неизвестен, значение —NULL.
Запись в таблицу Iceberg
Создание таблицы
Пример
iceberg_use_version_hint.
Если вы хотите сжать файл metadata.json, укажите имя кодека в настройке iceberg_metadata_compression_method.
INSERT
Пример
DELETE
Пример
Эволюция схемы
Пример
Компакция
Удаление устаревших снимков
expire_snapshots удаляет старые снимки и очищает файлы данных, на которые больше не ссылается ни один сохранённый снимок.
Синтаксис:
min-snapshots-to-keep, max-snapshot-age-ms и переопределениями для отдельных ссылок). Если указан snapshot_ids, политика хранения не применяется, и на истечение рассматриваются только перечисленные снимки.
Аргументы:
'timestamp'(позиционный) илиexpire_before = 'timestamp'— строка даты и времени (например,'2024-06-01 00:00:00'), интерпретируемая в часовом поясе сервера. Служит своего рода предохранителем: снимки, у которыхtimestamp-msравен этому значению или больше него, защищены от истечения, даже если по политике хранения они иначе подлежали бы удалению. Можно использовать вместе сsnapshot_ids; в этом случае перечисленные снимки с этой временной меткой или новее не истекают.retention_period = '<duration>'— переопределяет значениеhistory.expire.max-snapshot-age-msна уровне таблицы только для этого вызова. Снимки старше этого периода (отсчитываемого от текущего момента) становятся кандидатами на истечение. Значение представляет собой строку длительности, состоящую из одной или нескольких записанных подряд пар{number}{unit}. Поддерживаемые единицы:y(365 дней),w(7 дней),d(24 часа),h(60 минут),m(60 секунд),s(1 секунда),ms(1 миллисекунда). Единицы можно комбинировать, например:'3d','12h','1d12h30m','500ms'.retain_last = N— переопределяет значениеhistory.expire.min-snapshots-to-keepна уровне таблицы только для этого вызова. Независимо от возраста всегда сохраняется не менееNснимков.snapshot_ids = [id1, id2, ...]— помечает на истечение только перечисленные идентификаторы снимков (кроме снимков, на которые ссылаются текущий снимок, ветви или теги). Этот режим полностью отключает политику хранения и не может использоваться вместе сretention_periodилиretain_last.dry_run = 1— вычисляет, что было бы помечено на истечение, и возвращает Метрика без записи новых метаданных и удаления файлов.
retention_period и retain_last переопределяют только значения хранения по умолчанию на уровне таблицы. Переопределения хранения для отдельных ссылок (ветвей/тегов), настроенные в свойствах таблицы Iceberg (например, refs.<branch>.min-snapshots-to-keep), никогда не переопределяются — они всегда применяются в соответствии с метаданными таблицы.metric_name String, metric_value Int64); для каждой метрики выводится одна строка. Имена метрик соответствуют спецификации Iceberg:
Команда выполняет следующие шаги:
- Оценивает политику хранения (см. ниже), чтобы определить, какие снимки нужно сохранить
- Если указан аргумент временной метки, дополнительно защищает все снимки с этой временной меткой и новее
- Удаляет снимки, которые не сохраняются политикой и не защищены временной меткой
- Определяет, какие файлы связаны исключительно с удалёнными снимками
- В обычном режиме: создаёт новые метаданные без удалённых снимков
- В обычном режиме: физически удаляет недостижимые списки манифестов, файлы манифестов и файлы данных
- В режиме
dry_run = 1: пропускает шаги 5 и 6 и возвращает только вычисленные метрики
Политика хранения снимков
expire_snapshots учитывает политику хранения снимков Iceberg. Параметры хранения задаются через свойства таблицы Iceberg и переопределения для отдельных ссылок:
Каждая ссылка на снимок (
refs в метаданных Iceberg) может переопределять эти значения с помощью полей для конкретной ссылки: min-snapshots-to-keep, max-snapshot-age-ms и max-ref-age-ms.
Оценка хранения:
- Для каждой ветки (включая
main): обход цепочки предков начинается с вершины ветки. Снимки сохраняются, пока выполняется хотя бы одно из следующих условий:- Снимок входит в число первых
min-snapshots-to-keepв цепочке - Возраст снимка не превышает
max-snapshot-age-ms(то естьnow - timestamp-ms <= max-snapshot-age-ms)
- Снимок входит в число первых
- Для тегов: помеченный снимок сохраняется, если только возраст тега не превысил
max-ref-age-ms; в этом случае ссылка на тег удаляется - Ссылки, кроме
main, возраст которых превышаетmax-ref-age-ms, удаляются полностью (веткаmainне удаляется никогда) - Висячие ссылки, указывающие на несуществующие снимки, удаляются с предупреждением
- Текущий снимок сохраняется всегда независимо от настроек хранения
ALTER TABLE EXECUTE, которая является дочерней по отношению к ALTER TABLE в иерархии управления доступом ClickHouse. Её можно выдать отдельно или через родительскую привилегию:
- Поддерживаются только таблицы формата Iceberg version 2 (снимки v1 не гарантируют наличие
manifest-list, который необходим для безопасного определения файлов для очистки) - Текущий снимок всегда сохраняется, даже если он старше указанной временной метки
- Требуется, чтобы параметр
allow_insert_into_icebergбыл включен - Требуется, чтобы параметр
allow_experimental_expire_snapshotsбыл включен - Собственные механизмы авторизации каталога (аутентификация REST-каталога, AWS Glue IAM и т. д.) действуют независимо при обновлении метаданных в ClickHouse
Удаление осиротевших файлов
remove_orphan_files обнаруживает и удаляет эти осиротевшие файлы.
Синтаксис:
Примеры:
metric_name и metric_value, в которой показано количество удалённых файлов (или файлов, которые были бы удалены в режиме dry_run) по категориям. Категории файлов определяются с помощью эвристик на основе соглашений об именовании файлов; файлы, не соответствующие ни одному конкретному шаблону регулярного выражения, по умолчанию относятся к deleted_data_files_count:
Настройки:
- Требуется формат Iceberg версии 2 (или выше). Таблицы версии 1 отклоняются, поскольку в их снимках отсутствуют указатели
manifest-list, необходимые для безопасного определения набора достижимых файлов. Выполнение команды для таблицы v1 возвращает ошибкуBAD_ARGUMENTS. - Обе настройки
allow_insert_into_icebergиallow_iceberg_remove_orphan_filesдолжны быть включены - Рекомендуется запускать
expire_snapshotsпередremove_orphan_files, чтобы сначала очищались файлы, на которые ссылаются только истёкшие снимки - Используйте
dry_run = 1, чтобы предварительно просмотреть осиротевшие файлы перед удалением - Порог
older_thanзащищает от удаления файлов из ещё не завершённых операций записи — значение по умолчанию, равное 3 дням, обеспечивает достаточный запас безопасности