Покойтесь с миром, каталоги Iceberg … или нет?
Snowflake Polaris и Databricks - крупные провайдеры, которые очень активно продвигают свои каталоги.
Действительно, полный контроль над каталогами - это верный способ стать главным шлюзом к Вашим данным.
Но давайте сделаем шаг назад.
Зачем на самом деле нужен каталог и дополнительная система Iceberg?
В этом посте мы рассмотрим модель согласованности Iceberg и ее связь с недавно появившейся функцией условной записи в S3.
Нужно освежить знания об Iceberg?
Apache Iceberg – Что это такое?
Теперь, когда Вы поняли, что такое манифест, список манифеста и файл метаданных, давайте рассмотрим процесс записи в Iceberg.
Процесс записи в Iceberg
Iceberg работает по оптимистичной модели параллелизма.
Это означает, что писатель добавляет новые данные и обновляет метаданные без учета других одновременно работающих писателей.
Процесс на высоком уровне относительно прост:
- чтение/запись файлов данных
- чтение/запись файлов манифеста
- фиксация нового снимка
Iceberg добавляет два дополнительных механизма, представленных двумя красными стрелками на диаграмме ниже:
- шаг 4: проверка конфликта данных
- шаг 6: атомарная фиксация файла метаданных
Эти дополнительные проверки на наличие конфликтов являются основой ACID-консистентности Iceberg и гарантируют то, что данные остаются согласованными даже при одновременной записи.
Проверка данных на наличие конфликта
Проверки данных на наличие конфликтов проверяют согласованность файлов манифеста.
Пример проверки:
В случае UPDATE/DELETE/MERGE проверка гарантирует, что два писателя не обновляют (логически) одни и те же файлы данных/строки.
В случае уплотнения данных она гарантирует, что другой процесс не удалит одновременно одни и те же обработанные файлы.
Эти проверки выполняются на основе операции писателя и на подмножестве файлов манифеста.
В зависимости от выбранного пользователем уровня изоляции (snapshot или serializable), неудачная проверка приведет (или не приведет) к конфликту данных.
Например, в случае двух одновременных писателей, где:
- писатель 1: выполняет UPDATE
- писатель 2: вставляет записи (INSERT), которые отвечают условию UPDATE
Этот конфликт будет неудачным для уровня изоляции serializable, но не для уровня изоляции snapshot.
Атомарный коммит файла метаданных
Убедившись в том, что новые файлы манифеста не конфликтуют с другими, писатель должен опубликовать новый снимок.
Для этого он создает новый файл metadata.json и отправляет его в каталог вместе с версией метаданных, которые он использовал для своих операций.
Но зачем в этом случае нам нужен каталог?
Он нужен просто потому, что S3 только лишь гарантирует 100 % согласованность и модель «последний автор - победитель» для одновременной записи.
И это является серьезным недостатком для Iceberg.
Представьте, что два писателя начинают писать одновременно.
Оба выполняют начальное сканирование.
Писатель 1 работает быстрее и фиксирует свои изменения до того, как писатель 2 закончит свою работу.
В этом случае писатель 2 зафиксирует все изменения и «победит» (последний писатель - победитель), но на основе метаданных, обновленных писателем 1.
Что не есть хорошо.
Нам нужен механизм блокировки, который не даст писателю зафиксировать изменения, основанные на неверном состоянии таблицы.
Каталог Iceberg и повторные попытки
Iceberg решает эту проблему путем добавления внешней транзакционной системы через каталог.
Цель каталога - обеспечить атомарную фиксацию файла метаданных.
Когда писатель пытается опубликовать новую версию, он выполняет операцию сравнения и замены (CAS) в файле metadata.json.
Данный процесс выглядит следующим образом:
Коммит будет отклонен в том случае, если текущее местоположение файла метаданных писателя не совпадает с местом, известным каталогу.
Поэтому писатель повторно синхронизирует метаданные, проверяет их на наличие конфликтов и снова пытается зафиксировать их в каталоге.
Новое условие If - match для S3
Недавно AWS выпустила новую функцию для S3.
Добавив заголовок If-Match к операции PUT, S3 вернет ошибку, если такой объект уже существует.
Это именно то, что нужно для нашего каталога Iceberg.
Вместо того чтобы запрашивать у каталога текущую версию метаданных, писатель может выполнить простой PUT с If-Match.
Если есть совпадение, это указывает на то, что в это время другой писатель совершил коммит.
Тогда писатель должен обновить свои метаданные и повторить коммит еще раз.
Хотя условная запись не эквивалентна CAS с точки зрения изоляции, эта новая функция S3 потенциально может позволить нам обойти каталог, если писатели соответствующим образом адаптируют свои механизмы записи.
Я не совсем уверен в этом, но, учитывая потенциальные последствия, мы должны получить ответ достаточно скоро...






