Практика: сборка пайплайна данных
~ 60 минут
В прошлом уроке вы познакомились с Data Lakehouse. Вы уже знаете достаточно, чтобы собрать пайплайн на практике. Этим сейчас и займёмся.
Реальный пример, когда это может понадобится - сохранение медицинских снимков пациентов для дальнейшей обработки нейросетями и непосредственно структурированных данных о пациентах.
Схема достаточно простая — мы отправим данные, используя Airflow в Nessie, и поищем их там, убедившись, что они появились как в качестве метаданных в Iceberg, так и в виде файлов в MinIO.
- Начнём с базы — установим каталог и хранилище. Запускать будем с помощью docker-compose.
YAML
- Запускаем.
BASH
- Проверяем, что S3-совместимое хранилище MinIO поднялось — http://localhost:9000.
Благодаря использованию MinIO клиента для инициализации у нас уже создана корзина warehouse, которая будет использоваться для хранения данных и метаданных.
- Следующим шагом проверяем Nessie — http://localhost:19120.
Тут мы увидим минималистичный интерфейс отображения списка данных со ссылками на метаданные в S3 в виде репозитория.
Данных пока нет, и загрузить их прямо здесь не получится, — нам нужен клиент, который будет работать с Nessie через REST API.
- Добавим Dremio как портал самообслуживания.
YAML
- Запускаем.
BASH
- Открываем http://localhost:9047. Сначала заполняем учётные данные, например, так:
Тут тоже минималистичный интерфейс.
- Чтобы продолжить построение Data Lakehouse, нужно подключиться из портала к каталогу. Для этого нажмите “Add Source” и выберите в списке Nessie.
- Дальше нужно настроить источник http://catalog:19120/api/v2.
- На вкладке Storage мы вводим данные нашего S3.
- Для root path:
warehouse - Для access key:
admin - Для secret key:
password
- Добавляем в connection properties:
fs.s3a.path.style.access: truefs.s3a.endpoint: storage:9000dremio.s3.compat: true
Убедитесь, что напротив “Encrypt Connection” галочка не стоит. Должно получиться, как на скриншоте:
- Мы видим подключение и текущую ветку данных.
- Теперь нужно добавить данные в наш Data Lakehouse. Воспользуемся уже знакомым Airflow и добавим в docker-compose файл общий блок настроек x-airflow-common, веб-сервер, планировщик, базу и блок инициализации airflow-init.
YAML
- В директории проекта создадим папку airflow и data. Внутри папки airflow создадим папку dags и папку sql внутри неё, файл Dockerfile с содержимым
BASH
и файл
requirements.txt с содержимым.dremio-simple-query— библиотека для доступа к Dremio, загружать данные будем через портал, поскольку это позволяет исполнять обычный SQL. Есть вариант работы напрямую с Nessie, но он затрудняет разработку DAGa из-за использования специфических конструкций.- Последним шагом создадим файл
dag_lakehouse.py(можете назвать как удобно) в папке dags.
После всех этих действий должна получиться структура:
- Файл с кодом DAGa мы заполним далее. В папку data положим файл
sample.csv.
CSV
- Теперь займёмся кодом DAGa.
PYTHON
Функции создания таблиц, генерации запросов и отправки данных переиспользованы из предыдущего урока с минимальными изменениями в части подключения к Dremio и имени таблицы catalog.orders, где catalog — название нашего подключения к Nessie в Dremio.
- Запускаем.
BASH
- Заходим в Airflow и проверяем наш DAG — http://localhost:8080.
Он может появиться не сразу — тогда следует проверить состояние контейнеров, немного подождать и обновить.
BASH
- Запускаем DAG (стрелка запуска справа). Если произошла ошибка, можно провалиться в DAG, выбрать нужный запуск, открыть Graph и, кликнув на упавший кубик, посмотреть логи (Logs справа от Graph).
Airflow предоставляет отличную возможность поправить код DAGa и не перезапускать контейнер. Если файл пробрасывается в контейнер, то изменения подтянутся автоматически и нужно будет просто запустить ещё раз.
- После успешного выполнения идём в Dremio, Nessie и S3, чтобы проверить данные.
На этом уровне уже лежат наши данные: один объект = одна директория. Если провалиться в папку, то мы увидим файл с расширением
.parquet.Его можно скачать и посмотреть любым просмотрщиком для Parquet.
А если зайти в папку metadata (на два уровня наверх), то мы увидим файлы с метаданными, avro файлы-манифесты и avro файлы-списки манифестов.
У нас было пять запросов на вставку, поэтому файлов метаданных шесть. Пять — для данных и один основной, и именно на него указывает каталог Nessie в ветке main.
- Взглянем на список манифестов, на который указывает файл метаданных.
JSON
В нём есть как раз названия конкретных файлов-манифестов для этой версии.
- Если открыть один из них, внутри, помимо служебной информации, будет содержаться ссылка на файл в хранилище.
Пайплайн полностью готов! Осталось посмотреть на интересную возможность каталога Nessie — работу с данными как с кодом в отдельной ветке репозитория.
- Для этого открываем портал http://localhost:9047 и выбираем SQL Runner.
- В открывшемся окне выбираем Context (верхний правый угол картинки рядом со знаком функции), чтобы в скриптах не вводить постоянно префикс
catalog.
- Теперь создаём ветку от данных.
SQL
Если переключиться на основную ветку main, мы увидим, что данные не изменились: total равен 1000.
SQL
- Чтобы влить ветку в основную, выполним команду и запросим данные из main.
SQL
Теперь данные из ветки стали основными.
Возможность работать с данными в ветках даёт полную свободу в рамках «данные как код». С ними можно экспериментировать и не бояться сломать, ведь в случае порчи данных можно вернуться к снимку.
Data Lakehouse и реализация спецификации Apache Iceberg помогают построить отказоустойчивую архитектуру данных, но всё-таки это своего рода монолит.
Помимо сложности настройки, он имеет присущие монолиту в архитектуре данных особенности в виде разделения ответственности между продуктовой командой и командой поддержки решения, что порождает снижение time to market из-за исправления багов и проблем с инфраструктурой.
Чтобы закрепить новый опыт, выполните несколько заданий. И подведём итоги урока.
Задание 4
Компания "BigData Insights" разрабатывает пайплайн для Data Lakehouse, используя такие инструменты, как MinIO для хранения, Nessie для управления версиями данных и Apache Iceberg для контроля таблиц и метаданных. Ваша задача — помочь команде инженеров построить и проверить пайплайн данных для эффективной аналитики.
Инженеры настраивают пайплайн для передачи и хранения данных. Какой порядок действий правильный?
Подключение Nessie как каталога метаданных.
Шаг 2
Nessie подключается вторым для управления метаданными.
Запуск MinIO для S3-совместимого хранилища.
Шаг 1
MinIO запускается первым, так как оно является базовым хранилищем.
Настройка Airflow для передачи данных в хранилище.
Шаг 3
Airflow не может корректно функционировать до настройки хранилища (MinIO) и системы метаданных (Nessie).
Итоги
- Вы поработали с MinIO, Nessie, Dremio и Airflow и научились их интегрировать. Все эти компоненты помогают удобно хранить данные, управлять их версиями, быстро анализировать и автоматизировать процессы. Это нужно для построения надёжных систем работы с большими данными в компаниях.
- Вы построили пайплайн, включая настройку хранилища данных и управление версиями. А также научились использовать Apache Iceberg для управления метаданными и построения отказоустойчивой архитектуры.
- Узнали, как работать с ветками в Nessie для безопасного тестирования данных.
В следующем уроке речь пойдёт о распределённых архитектурах данных.