Таблицы Iceberg

Обзор

Apache Iceberg — это открытый формат таблиц для больших хранилищ данных, который обеспечивает ACID-транзакции, перемещение во времени (time travel), изменение схемы (schema evolution), изменение партиции (partition evolution) и предоставляет другие возможности работы с данными.

Он функционирует как слой абстракции между движком запросов и данными. Таблицы Iceberg работают аналогично SQL-таблицам и могут интегрироваться с вычислительными движками, такими как Spark, Hive, Impala и т.д.

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

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

ПРИМЕЧАНИЕ

В парадигме ADCM Iceberg не является сервисом. Управление функциональностью Iceberg осуществляется за счет параметров конфигурации для сервисов Hive, Spark и Impala. Эти параметры позволяют измененить способ взаимодействия сервисов с данными. Iceberg-таблицы используются по умолчанию.

Для получения дополнительной информации о таблицах Iceberg обратитесь к спецификации.

Отличия от таблиц Hive

Традиционно в качестве формата таблиц для озер данных использовался формат таблиц Hive. Он отслеживает данные на уровне директорий, поэтому при работе с данными ему необходимо выполнять операции получения списка файлов.

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

В отличие от таблиц Hive, Iceberg отслеживает полный список всех файлов в таблице, используя персистентные деревья. Изменения в таблице происходят на уровне атомарного коммита объекта/файла, который затем обновляет путь к новому файлу метаданных. Этот файл содержит местоположение всех отдельных файлов данных.

Возможности

Основные возможности таблиц Iceberg:

  • Выражения SQL

    Iceberg поддерживает множество SQL-операций, которые позволяют выполнять такие задачи, как обновление строк, объединение данных, целевые удаления и т.д. Он также позволяет перезаписывать файлы и поддерживает запросы вроде INSERT INTOMERGE INTO и INSERT OVERWRITE.

  • Изменение схемы таблицы

    Изменение схемы (schema evolution) таблиц Iceberg влияет только на метаданные, а не на сами файлы данных. Это позволяет быстро добавлять, удалять, обновлять, реорганизовывать (reordering) и переименовывать столбцы в таблице.

  • Изменение партиции

    В отличие от стандартного партиционирования, таблицы Iceberg позволяют изменять схему партиционирования данных (partition evolution) без необходимости перезаписи всех данных.

  • Снепшоты

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

  • Перемещение во времени и откат изменений

    Функция "перемещения во времени" (time travel) позволяет выполнять запросы к более ранним версиям таблиц. Функция отката изменений (rollback) позволяет пользователям восстанавливать состояние таблицы в определенный момент времени.

  • Транзакционная согласованность

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

  • Быстрое выполнение запросов

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

ПРИМЕЧАНИЕ

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

Архитектура

В архитектуре таблиц Iceberg три основных слоя:

Архитектура таблиц Iceberg
Архитектура таблиц Iceberg
Архитектура таблиц Iceberg
Архитектура таблиц Iceberg

Каталог Iceberg

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

Каталог Iceberg — это надстройка над существующим сервисом управления метаданными. Например, HDFS, Hive metastore или реляционная база данных (JDBC).

В ADH в качестве реализации каталога Iceberg используется Hive metastore.

Слой метаданных

Apache Iceberg использует три типа файлов метаданных для поддержания карты расположения файлов:

  • Файлы манифеста (manifest files) — каждый файл манифеста отслеживает подмножество других файлов в таблице для одного снепшота. Они отслеживают отдельные файлы, их партиции и метрики столбцов.

  • Списки манифестов (manifest lists) — описывают снепшот таблицы и содержат список всех файлов манифеста, которые составляют этот снепшот. Списки манифестов также содержат метаданные для каждого файла манифеста в данном снепшоте.

  • Файлы метаданных — хранят описание таблицы, списки манифестов, снепшоты, схемы таблицы и партиций.

Слой данных

Iceberg отслеживает каждый файл в таблице и сохраняет информацию о его партиции и столбцах.

Есть две категории файлов в слое данных:

  • Data files — файлы самих данных в форматах Parquet, Avro или ORC.

  • Delete files — записи о файлах, которые были помечены как удаленные.

Жизненный цикл запроса

Чтобы проиллюстрировать, как простой запрос работает в кластере с использованием таблиц Iceberg, можно разбить жизненный цикл запроса на следующие этапы:

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

  2. Из файла метаданных движок получает следующую информацию:

    • Схему таблицы.

    • Информацию о партиции таблицы. Это поможет исключить файлы, которые не имеют отношения к запросу.

    • Список файлов манифеста текущего снепшота. Это поможет определить, какие файлы сканировать.

  3. Затем движок сканирует полученный список файлов манифеста. Каждый манифест содержит список файлов, в которых находятся данные выбранного снепшота. В значении partition-spec-id указана схема партиционирования, использованная при создании снепшота, и информация о партициях (PartitionFieldSummary), которая определяет необходимость сканирования манифеста.

  4. Далее движок параллельно проверяет каждый из выбранных файлов манифеста и считывает метаданные. В метаданных содержатся значения schema-id и partition-id для каждого файла, а также тип файла (data file или delete file). Эти данные позволяют определить, релевантен ли файл данных для запроса.

  5. Движок сканирует релевантные файлы и возвращает результат.

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

Жизненный цикл запроса в таблицах Iceberg
Жизненный цикл запроса в таблицах Iceberg
Жизненный цикл запроса в таблицах Iceberg
Жизненный цикл запроса в таблицах Iceberg

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

Ниже приведены примеры SQL-запросов, иллюстрирующие некоторые функции таблиц Iceberg.

Branching

Создание веток (branching) в Iceberg-таблицах устроено аналогично системам контроля версий, таким как Git. Вы можете создать локальную ветку, внести необходимые изменения и объединить ее с основной веткой.

Пример команды для создания ветки:

ALTER TABLE test.db.table CREATE BRANCH 'task_1';

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

Пример команды для добавления новых значений в созданную ветку:

INSERT INTO test.db.table.task_1 VALUES (1, 'a'), (2, 'b');

Чтобы прочитать данные из определенной ветки, используйте синтаксис:

SELECT column1, column2 FROM test.db.table.task_1;

Дополнительную информацию о создании веток можно получить в статье Branching and Tagging.

Tagging

Iceberg позволяет маркировать снепшоты, чтобы вернуться к ним позже. Теги можно создавать, запрашивать и удалять.

Пример синтаксиса для создания тега:

ALTER TABLE test.db.table CREATE TAG `test` RETAIN 10 DAYS;

Time travel

С помощью функции "перемещения во времени" (time travel) можно делать запросы к определенному состоянию таблицы во времени.

Пример синтаксиса запроса к таблице в определенный момент времени:

SELECT * FROM test.db.table TIMESTAMP AS OF '2007-09-03 04:21:00';

Пример синтаксиса запроса к снепшоту:

SELECT * FROM test.db.table VERSION AS OF 10726387402803;

Пример синтаксиса запроса к вершине (HEAD) определенной ветки:

SELECT * FROM test.db.table VERSION AS OF 'task_1';

Более подробно о функции time travel читайте в разделе Time travel.

Rollback

С помощью функции отката изменений (rollback) можно восстановить одно из предыдущих состояний таблицы. Состояние может быть передано в виде ID снепшота либо в виде временной метки.

Пример синтаксиса для восстановления таблицы из снепшота:

ROLLBACK TABLE test.db.table TO SNAPSHOT '2894821635228246189';

Schema evolution

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

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

Пример синтаксиса для изменения имени столбца:

ALTER TABLE test.db.table CHANGE COLUMN names employee_names STRING;
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней