Что такое WSL, Docker и как запустить веб-сервер Apache AirFlow в контейнере на локальной машине в Ubuntu поверх Windows вместо любимого Google Colab. Пошаговое руководство для начинающих дата-инженеров.
Краткий ликбез по WSL и Docker для любителей Windows
Обычно я всегда запускала веб-сервер Apache AirFlow в интерактивной среде Google Colab, которая по своей сути представляет собой виртуальную машину с Unix-подобной ОС. А, чтобы получить доступ к localhost, использовала утилиту тунелирования ngrok. С одной стороны, это было удобно, поскольку каждая Colab-среда работает изолировано: можно было не связываться с виртуальными Python-средами, чтобы избежать «ада зависимостей», когда одна библиотека конфликтует с другой, достаточно просто закрыть ненужную Colab-среду. Однако, запускать приложения AirFlow в режиме standalone удобнее всего на собственной локальной машине, чтобы избежать задержек и других недостатков Colab, о которых я писала здесь. Поэтому решила запускать веб-серверы в своей собственной среде, независимо от внешних сервисов.
Избежать конфликта зависимостей, свойственных AirFlow, при запуске его на локальной машине с операционной системой Windows, можно 2-мя способами:
- использовать виртуальные среды Python;
- сделать контейнер, упаковав в него приложение со всеми зависимостями.
Далее рассмотрим именно 2-ой способ. Чтобы запустить контейнер на операционной системе Windows, надо установить WSL — подсистему Windows для Linux, которая позволяет запускать среду Linux на Windows без отдельной виртуальной машины. С WSL можно запускать Linux в оболочке Bash с выбранным дистрибутивом, чтобы работать с CLI-интерфейсом и приложениями Linux. В отличие от полноценной виртуальной машины, WSL требует меньше ресурсов (ЦП, памяти и хранилища), а также может обращаться к файлам Windows в Linux. Обеспечить изоляцию приложений, чтобы избежать конфликтов с зависимостями, свойственных Python-разработке, можно с помощью контейнеризации, что также хорошо поддерживается в WSL.
Сегодня наиболее популярным инструментом контейнеризации является Docker – он позволяет упаковать приложение со всем его окружением и зависимостями в контейнер, который можно запустить на любой Linux-подобной системе. Эта платформа дает возможность отделить приложения от инфраструктуры, перезапуская их по мере необходимости. Изоляцию обеспечивает запуск каждого контейнера в отдельном процессе. Docker-образ можно развернуть несколько раз, получив независимые контейнеры с работающими приложениями. Docker-контейнер — это запущенный и изолированный образ с возможностью временного сохранения данных, которые записываются в его верхний слой и при удалении контейнера удаляются.
Создание и запуск docker-контейнера Apache AirFlow
После установки WSL и Docker на свой ноутбук с ОС Windows я загрузила готовый базовый docker-образ загрузить Apache Airflow версии 2.8.1 для python3.11:
docker pull apache/airflow:slim-2.8.1-python3.11
Чтобы запускать работающий контейнер с AirFlow одной строкой, т.е. уже с инициализированной базой данных метаданных и пользователем веб-интерфейса, пришлось немного модифицировать этот образ, внеся следующие изменения в Dockerfile — текстовый файл с последовательно расположенными инструкциями для создания образа. Каждому образу присваивается свой Dockerfile, куда надо записать команды для установки пакетов. Поскольку я работаю с Телеграм и PostgreSQL, а также Elasticsearch, в dockerfile включила инструкции установки этих библиотек, а также добавила команды инициализации базы данных метаданных и создания локального пользователя:
FROM apache/airflow:slim-2.8.1-python3.11 RUN airflow db init RUN airflow users create --username anna --password admin --firstname Anna --lastname Vi --role Admin --email admin@example.com RUN pip install elasticsearch7==7.10.1 RUN pip install apache-airflow-providers-telegram RUN pip install psycopg2-binary RUN pip install apache-airflow-providers-postgres ENTRYPOINT ["airflow", "standalone"]
Для запуска AirFlow в режиме standalone, т.е. на локальной машине, это надо указать в параметрах входной точки ENTRYPOINT в файле Dockerfile. Затем для создания своего образа надо выполнить команду build в той папке, где находится этот Dockerfile:
docker build -t my-airflow-image .
Для работы с контейнерами Docker предоставляет всего несколько команд: docker run, stop и restart. Однако, они имеют множество полезных опций. Например, команда run позволяет запускать контейнер в фоновом режиме, монтировать директории и пр. Чтобы запустить docker-контейнер на основе созданного образа с названием my-airflow-image, надо выполнить команду docker run. Поскольку порт 8080, используемый по умолчанию для запуска веб-приложений, у меня занят другим приложением, я решила развернуть AirFlow на другом порту, 8081. Также при запуске контейнера AirFlow надо указать директорию для хранения Python-файлов с задачами и DAG. Для этого создала папку workspace/airflow/my_dags на диске С и примонтировала ее внутрь контейнера в директорию /opt/airflow/dags/, чтобы управлять DAG-файлами AirFlow извне контейнера. Для запуска docker-контейнера my-airflow на основе образа my-airflow-image с приложениями AirFlow в фоновом режиме надо добавить флаг –d к команде run:
docker run -d -p 8081:8080 -v /mnt/c/workspace/airflow/my_dags/:/opt/airflow/dags/ --name my-airflow my-airflow-image
Эта команда запускает контейнер в фоновом режиме с Apache AirFlow и пробрасывает порты, чтобы иметь доступ к веб-интерфейсу ETL-планировщика через порт 8081 локальной машины, а также читать и выполнять DAG-файлы, расположенные в директории workspace/airflow/my_dags на диске С.
Все последующие запуски docker-контейнера my-airflow выполняются в несколько шагов:
- Открыть командную строку;
- Запустить WSL;
- Стартовать работу контейнера с помощью команды
docker start my-airflow
- Запустить командную оболочку bash в уже запущенном контейнере в интерактивном режиме:
docker exec -it my-airflow bash
- Наконец, запустить Apache AirFlow в режиме standalone:
airflow standalone
Для разработки DAG-файлов и файлов задач можно использовать редактор VSCode, который, хоть и не является полноценной IDE, намного удобнее обычного блокнота.
Впрочем, быстро поправить py-файл можно и просто открыв его в Notepad++. Завтра я продолжу работу с этим контейнером Apache AirFlow и расскажу, как проверить доступность сайта с помощью веб-хуков.
Узнайте больше про Apache AirFlow и его использование в задачах реальной дата-инженерии на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники