Пайплайн для Data Lakehouse
~ 20 минут
В этом уроке вернёмся к вопросу о том, как выглядят архитектуры данных. На курсе вы уже выстраивали пайплайн DWH, а в этом уроке рассмотрите гибрид DWH и Data Lake — Data Lakehouse. Так вы увидите на практике разделение ответственности по работе со структурированной и полуструктурированной и неструктурированной информацией.
Часто по пути к Data Lakehouse компании уже имеют два решения: одно для оперативной отчётности, а другое ― для накопления данных и применения машинного обучения (возможно, уже даже в состоянии «болота»). Например, в финтехе в процессе KYC и для анализа рисков изучается вся доступная информация: соцсети, активность в интернете, связь с другими людьми, фотографии и прочее.
Поддерживать два решения дорого и неудобно в контексте масштабируемости, особенно в части DWH, поэтому Data Lakehouse становится эволюционным решением.
В этом уроке вы разберётесь, из чего состоит пайплайн Data Lakehouse и как работает эта архитектура. А в следующем мы дадим инструкцию, чтобы собрать пайплайн на практике.
Итак, Data Lakehouse состоит из двух основных частей:
- Хранилище — масштабируемое и гибкое решение для работы со структурированными (например, csv), частично структурированными (например, json) и неструктурированными данными (например, текстовый файл).
- Уровень метаданных — единый «каталог», который предоставляет метаданные для всех объектов в хранилище и позволяет управлять данными (транзакции, версионирование, управление схемой).
Поговорим про технологии, которые будут использоваться для построения Data Lakehouse. Начнём с хранилища — в Data Lakehouse на этом уровне хранятся «сырые» данные-объекты, которые затем могут быть подвергнуты обработке.
Хранилище и его типы
Есть три основных типа хранения информации: файловый, блочный и объектный.
- Файловые хранилища (file storage) — это привычные файловые системы (FAT32, NTFS, EXT4 и другие), которые хранят информацию в иерархической структуре. Для небольших объёмов и информации, которая ложится в древовидную структуру, они работают хорошо, но на больших объёмах (терабайтах) и при интенсивных операциях чтения или записи производительность падает.
- Блочные хранилища (block storage) — данные делятся на блоки одинакового размера, что позволяет достигать хорошей производительности даже под нагрузкой. Но есть два основных недостатка: высокая стоимость и слабая поддержка работы с метаданными — их приходится обрабатывать на уровне приложения.
- Объектные хранилища (оbject storage) — это тип хранения, при котором информация разбивается на объекты, каждый из которых сохраняется отдельно, имеет собственный идентификатор и метаданные. Доступ к объекту происходит по ключу-идентификатору. Хранилище с таким типом хранения хорошо масштабируется, держит нагрузку, поддерживает механизмы безопасности. Оно очень просто в управлении. Пожалуй, самым популярным вариантом реализации объектного хранения являются так называемые S3-совместимые хранилища.
S3-совместимое хранилище
Amazon Simple Storage Service (S3) — изначально это был сервис от Amazon Web Services со своими протоколами и спецификациями для хранения данных и получения их через REST API. Но решение оказалось настолько удобное, что появились аналоги, которые реализуют спецификацию, и они уже называются S3-совместимое хранилище.
Они построены с использованием объектного типа хранения, имеют Restful API, хорошо масштабируются и держат нагрузку. Они S3-совместимые, и поэтому вендоронезависимые и решения на базе такого хранилища легко мигрировать на другую технологию или к другому провайдеру в случае облачной инсталляции.
Примеры хранилищ, которые реализуют спецификацию
- Yandex Object Storage ― облачная реализация от Яндекс Облака
- MinIO ― популярная легковесная реализация
- Zenko CloudServer ― реализация от Zenko, полностью совместимая со спецификацией, но на текущий момент наблюдается застой в развитии продукта
- LeoFS ― быстрое, распределённое и на Erlang/OTP
- Ceph ― «тяжёлое» и многофункциональное решение от RedHat, часто можно встретить в энтерпрайз-среде
💡 Как выбрать хранилище?
При выборе следует учитывать требования к хранению. Например, Ceph не только объектное хранилище, но и поддерживает и блочное, и файловое.
В нашем случае «комбайн» не нужен, но ситуации бывают разные: например, если у нас уже есть хранилище на Ceph или политика компании не позволяет использовать ничего кроме, ну или у нас просто некое легаси, которое требует именно его. Для нашего пайплайна воспользуемся MinIO как решением, которое полностью реализует спецификацию S3 и отличается легкостью развёртывания и настройки.
Уровень метаданных
С уровнем метаданных всё немного сложнее. Этот слой как раз «даёт» возможность совершать ACID-транзакции, которых не хватает в Data Lake, и обеспечивать хорошую масштабируемость.
Уровень метаданных реализуется с помощью так называемых табличных форматов — Table format, где данные в объектном хранилище структурируются и унифицируются в виде единой таблицы. Благодаря тому, как метаданные организованы и управляются, можно ответить на вопрос «Какие данные есть в таблице?». Такой формат — некая «умная» надстройка над «глупым» хранилищем всего подряд.
Форматы хранения метаданных
Основных реализаций хранения три:
- Apache Iceberg (Netflix): Iceberg — это формат данных, который помогает управлять большими таблицами в озёрах данных. Он поддерживает транзакции, версионность и работает с разными типами файлов (например, Parquet и ORC). Iceberg делает запросы к данным быстрыми и упрощает работу с большими объёмами.
- Apache Hudi (Uber): Hudi — формат данных, который позволяет обновлять и удалять записи. Он хорошо подходит для работы с изменяющимися данными в реальном времени. Hudi поддерживает упорядочивание данных и помогает держать их в актуальном состоянии.
- Delta Lake (Databricks): Delta Lake делает хранение данных более надёжным. Он добавляет транзакции, отслеживает версии данных и помогает исправлять ошибки. Delta Lake тесно связан с Apache Spark и позволяет быстро обрабатывать данные для аналитики.
И небольшой бенчмарк от Delta Lake в различных персентилях:
Когда мы будем настраивать пайплайн на практике, предлагаем использовать Apache Iceberg как «золотую середину» между сложными корпоративными Hudi и Delta Lake, которые используют дополнительные платные улучшения для некоторых функций.
Apache Iceberg
Архитектура Apache Iceberg разделена на те же два уровня Data Lakehouse:
- Уровень данных — Apache Iceberg работает с открытыми файловыми форматами (Open File Formats), такими как Parquet, Avro и ORC. Это означает, что сами данные хранятся в широко используемых форматах файлов;
- Слой метаданных — Iceberg добавляет уровень управления таблицами (Open Table Formats), который отслеживает состояние таблиц, версии данных, транзакции и упрощает доступ к данным.
Сверху над айсбергом располагается каталог — он решает проблему поиска данных из разных источников, используя метаданные для идентификации наборов данных. Каталог хранит указатель на актуальный файл метаданных, который можно использовать для записи и чтения (например, Nessie).
Iceberg не является механизмом хранения, механизмом выполнения или сервисом.
💡 Что такое Iceberg?
- Спецификация формата таблицы.
- Набор API и библиотек для взаимодействия с таблицами в соответствии с этой спецификацией.
Помимо масштабирования и транзакций, айсберг умеет поддерживать следующие функции:
- Эволюция схемы — можно легко изменять структуру;
- Сохранение состояния данных в определённый момент времени (снепшоты) и возврат к этим состояниям (роллбэк данных);
- Разделение данных на части с группировкой похожих строк при записи. Например, он может разделять события журнала по дате и группировать их в файлы с одинаковой датой события. Так он может пропускать файлы с другими датами, в которых нет полезных данных, и ускорять выполнение запросов;
- Скрытое партиционирование, то есть система автоматически управляет партиционированием данных, не требуя от пользователя явно указывать партиционные ключи при запросах.
Как работает Iceberg?
При создании таблицы каталог создаёт в хранилище файл-снимок метаданных, а в таблицу прописывается указатель на него.
Метаданные хранятся рядом с файлами данных. В файле метаданных моментального снимка хранятся спецификации таблицы: её схема, схема партиционирования, пользовательские свойства и путь к списку манифестов, каждый из которых указывает на версию файла.
Пока таблица пустая, манифестов нет.
После вставки данных в таблицу (обычной командой INSERT через каталог) появляется список манифестов и конкретный манифест для каждой вставки, а также создаётся файл в объектном хранилище.
Если обновить эту таблицу, обновление создаст новый файл метаданных со снимком s2, а s1 станет уже неактуальным.
💡 Файлы данных в моментальных снимках отслеживаются с помощью одного или нескольких файлов-манифестов, которые содержат строку для каждого файла данных в таблице, данные раздела файла и его показатели.
Данные в моментальном снимке представляют собой объединение всех файлов в его манифестах. Файлы-манифесты повторно используются в разных моментальных снимках, чтобы избежать перезаписи медленно меняющихся метаданных. Это очень похоже на инкрементальную сборку кода или бэкап. Манифесты могут отслеживать файлы данных с любым подмножеством таблицы и не связаны с разделами.
Рекомендуется периодически архивировать или удалять неактуальные снимки. Например, снимки с потерянными файлами метаданных, которые не были зафиксированы во время записи, можно обработать повторно или удалить, используя метод API. В противном случае будет расти количество мусора.
Каталоги
Самое время определиться с каталогом, чтобы в следующем уроке собрать весь пайплайн целиком.
Есть две категории каталогов — основанные на файлах и на межсервисном взаимодействии.
Каталоги, основанные на файлах
Таким каталогом является, например, Hadoop Catalog.
Каталог содержит файл
version-hint.text, в котором указана последняя версия файла метаданных (metadata.json). Когда система выполняет запросы, она сначала проверяет этот файл, чтобы найти путь к актуальным метаданным.Однако у такого каталога есть потенциальный риск несогласованности данных, особенно при обновлении или параллельной работе нескольких процессов. Это может случиться, так как управление происходит через файловую систему, а не централизованную службу.
Каталоги для межсервисного взаимодействия
Эти каталоги используют сервисы для хранения и управления метаданными.
- JDBC метаданные хранятся в реляционной базе данных через JDBC. Это упрощает управление в системах с классическими базами данных.
- Hive Metastore использует метастор Hive для хранения информации о таблицах. Подходит для экосистемы Hadoop и Spark.
- Nessie работает через REST API, что делает его простым и универсальным для интеграции. Поддерживает версионирование данных.
- Glue — каталог от AWS, который предоставляет централизованное хранилище метаданных и легко интегрируется с другими сервисами AWS.
В следующем уроке мы перейдём к практике, где будем использовать Nessie — каталог, который взаимодействует с Iceberg по REST API и даёт возможности наподобие Git — создавать ветки данных, коммитить их и мёржить.
Для получения пользовательского интерфейса воспользуемся Dremio — платформой «данные как услуга». Инструмент может подключаться к различным источникам, включая базы данных, озёра данных и облачные платформы хранения. Затем данные можно запросить с помощью SQL.
Выполните несколько заданий, чтобы закрепить теорию. А затем можно переходить к практике следующего урока.
Задание 3
Компания "BigData Insights" разрабатывает пайплайн для Data Lakehouse, используя такие инструменты, как MinIO для хранения, Nessie для управления версиями данных и Apache Iceberg для контроля таблиц и метаданных. Ваша задача — помочь команде инженеров построить и проверить пайплайн данных для эффективной аналитики.
Инженеры настраивают пайплайн для передачи и хранения данных. Какой порядок действий правильный?
Настройка Airflow для передачи данных в хранилище.
Шаг 3
Airflow не может корректно функционировать до настройки хранилища (MinIO) и системы метаданных (Nessie).
Запуск MinIO для S3-совместимого хранилища.
Шаг 1
MinIO запускается первым, так как оно является базовым хранилищем.
Подключение Nessie как каталога метаданных.
Шаг 2
Nessie подключается вторым для управления метаданными.
- Документация API для работы с Amazon S3.
- Книга в открытом доступе по Data LakeHouse на примере Delta Lake.
- Статья на Хабре о разработке VK Mini Apps.
- Руководство по Apache Iceberg от Dremio.
- Сравнение форматов таблиц для озёр данных: Apache Iceberg, Apache Hudi и Delta Lake.
- Документация по использованию Nessie Catalogs в Dremio Sonar.
- Документация по интеграции Project Nessie с различными инструментами.
- Онлайн-просмотрщик файлов в различных форматах.
Итоги
- Data Lakehouse объединяет два ключевых уровня: хранилище и метаданные. Хранилище служит для хранения любых типов данных, включая структурированные, частично структурированные и неструктурированные. Уровень метаданных действует как единый каталог, который предоставляет информацию о данных, поддерживает транзакции, версионирование и управление схемами.
- В Data Lakehouse используются три типа хранилищ: файловые, блочные и объектные. Наиболее популярные — объектные хранилища S3. Они позволяют эффективно хранить «сырые» данные-объекты, которые позже обрабатываются для анализа и легко масштабируются.
- Apache Iceberg управляет таблицами данных, создавая файлы метаданных, которые хранят схему таблицы, партиции, версии и ссылки на данные. Когда таблица создаётся или изменяется, Iceberg обновляет метаданные и таким образом обеспечивает согласованность и упрощает обработку данных. Iceberg считается «золотой серединой» между сложными корпоративными Hudi и Delta Lake, которые для некоторых функций используют платные улучшения.