Первый раз я установил Airflow по туториалам за 1 час. Он отлично открывался с сайта, красиво выглядел, но, к сожалению, не работал.
На дальнейшую переустановку и отладку у меня ушло ещё 10-15 часов.
Статью пишу по горячим следам, постараюсь отметить все проблемы, с которыми пришлось столкнуться. На некоторые вопросы ответы удалось найти только странице на 10-й английского гугла. Даже в английской версии мануалов по Airflow не по всем вопросам есть информация.
Для начала неочевидный факт: когда начинаешь устанавливать airflow, думаешь что это будет одна программа. На самом деле, всё совсем не так. Это 2 сервиса:
airflow-webserver - отвечает за ту часть, которую вы видите в web-интерфейсе
airflow-scheduler - отвечает за запуск DAGов и в целом за ETL часть
Соответственно и настраивать их нужно отдельно. Если что-то не работает, проблема может быть только в одном из этих сервисов, а может и в обоих одновременно. Правильная локализация ошибки поможет сократить время отладки вдвое. Чтобы понять, что упало, нужно смотреть их статус:
systemctl status airflow-webserver
systemctl status airflow-scheduler
Ещё очень помогает системный лог: /var/log/syslog
Но это будем использовать на этапе отладки, а сначала нам нужно всё установить.
Airflow - система, написанная на питоне. И запускается она тоже на питоне. А по умолчанию на только что созданном сервере ubuntu питона и pip нет - нам нужно их установить.
Установка питона
Я ставил python 3. Ставьте самую актуальную стабильную версию на текущий момент.
Необходимо запустить последовательно:
apt update
apt install software-properties-common
add-apt-repository ppa:deadsnakes/ppa
apt install python3.8
Проверим, что питон установился нормально:
python3 ––version
Установим pip
apt install python3-pip
Установка Airflow
Перед установкой Airflow очень важно указать домашнюю директорию, куда будем ставить
export AIRFLOW_HOME=~/airflow/
Я работал из-под root, директорию не указал, что привело ко всем последующим проблемам, какие у меня были.
После указания директории, ставим сам Airflow:
pip3 install apache-airflow
Он установит все необходимые пакеты и создаст в указанной директории следующие файлы:
airflow-webserver.pid - файл нужен для запуска web-сервера, запомните где он лежит
airflow.cfg - настройки Airflow, запомните где он лежит - ещё пригодится
airflow.db - SQLite база данных - в дальнейшем перейдём на постгресс и она нам не пригодится.
unittests.cfg
webserver_config.py
Дальше, перейдём в домашний каталог Airflow с этими файлами и создадим в нём ещё одну директорию:
mkdir dags
В этой папке будут лежать даги, которые вы будете создавать. И да, не забудьте нормально раздать права на папку airflow и все вложенные папки/файлы. Я не очень хорошо разбираюсь в этом вопросе - поэтому просто выдал полный доступ на папки всем пользователям - но так лучше не делать.
Путь к папке с дагами можно настроить в файле airflow.cfg параметр dags_folder
Если вы всё сделали правильно - можете запускать веб-сервер и шедулер:
systemctl start airflow-webserver
systemctl start airflow-scheduler
И возможно у вас всё будет работать как надо - будет открываться веб-интерфейс по 8080 порту ip вашего сервера.
Тогда вам останется только настроить подключение к нормальной БД, где у вас будут храниться пользователи и настройки, например к postgress:
Установка PostgresSQL и настройка подключения к Airflow
Установим PostgreSQL:
apt-get install postgresql
По умолчанию доступ к СУБД имеет пользователь postgres. Заходим под ним:
sudo -u postgres psql
Создадим базу данных и пользователя к ней для Airflow:
postgres=# create database airflow_metadata;
postgres=# CREATE USER airflow WITH password 'password';
postgres=# grant all privileges on database airflow_metadata to airflow;
После этого необходимо настроить подключение Airflow к БД:
Окткрываем файл airflow.cfg
правим значение параметра sql_alchemy_conn
на postgresql+psycopg2://airflow:password@localhost/airflow_metadata
Подключение к базе будет происходить через psycopg2, у меня он был установлен в питоне по умолчанию, если у вас нет - то установите его себе, лучше из бинарников:
pip3 install psycopg2-binary
Инициализируем новую базу данных:
airflow initdb
Если в процессе на каком-то этапе не будут применяться изменения - перезапускайте сервисы:
systemctl restart airflow-webserver
systemctl restart airflow-scheduler
После чего необходимо создать пользователя Airflow, с которого будем логиниться через web-интерфейс:
airflow users create --username AirflowAdmin --firstname name1 --lastname name2 --role Admin --email airflow@airflow.com
После чего терминал попросит ввести пароль для этого пользователя.
Отладка - та часть, которую не найдёшь в туториалах
Когда я устанавливал airflow и не указал домашнюю директорию, он всё поставил в home директорию пользователя root, что привело к дальнейшим большим проблемам - не делайте так.
Если же вы так сделали - создайте папку с нормальными правами доступа в корне и перенесите туда папку airflow.
Я пытался сначала настроить чтобы всё работало из root - даже выдал всем пользователям полный доступ до папок airflow - но видимо сыграло роль, что это был root пользователь - сервис всё-равно не мог получить доступа до нужных файлов и ругался мне в лог.
Дальше нужно будет в папке airflow найти все пути указанные к root, после чего вручную переделать их в нужный путь к домашней директории с airflow.
grep root ./*
Так же пришлось редактировать скрипты запуска сервисов - иначе тоже постоянно были ошибки в логе.
Для настроек перейдите в папку /usr/lib/systemd/system и отредактируйте фалы таким образом, чтобы они были максимально похожи на следующие:
airflow-webserver.service
[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/usr/local/bin/airflow webserver --pid /airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
--pid /airflow/airflow-webserver.pid должен указывать туда, где у вас лежит файл airflow-webserver.pid - мы его указывали выше в статье.
airflow-scheduler.service
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/usr/local/bin/airflow scheduler
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
Что ещё может потребоваться настроить:
Перейти по в папку /etc/sysconfig/ и там отредактировать файл airflow - указать в нём правильный путь AIRFLOW_CONFIG и AIRFLOW_HOME
После чего необходимо обновить и перезапустить сервисы:
daemon-reload
systemctl restart airflow-scheduler
systemctl restart airflow-webserver
И последняя проблема: после создания пользователя пытался зайти в Airflow. Говорит "login failed".
Сначала я думал, что не создался пользователь - несколько раз его пересоздавал, проверял в БД - пользователь на месте, а с интерфейса не заходит.
Читаем логи (/var/log/syslog):
Видим, что веб сервер одновременно запущен и работает, и при этом постоянно пытается запуститься ещё раз.
Но если посмотреть его статус, то видим, что он упал с ошибкой:
systemctl status airflow-webserver
airflow-webserver.service - Airflow webserver daemon
Loaded: loaded (/lib/systemd/system/airflow-webserver.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2021-03-16 18:00:03 MSK; 2s ago
Process: 761523 ExecStart=/usr/local/bin/airflow webserver --pid /run/airflow/webserver.pid (code=exited, status=1/FAILURE)
Main PID: 761523 (code=exited, status=1/FAILURE)
Mar 16 18:00:03 digitalberd systemd[1]: airflow-webserver.service: Main process exited, code=exited, status=1/FAILURE
Mar 16 18:00:03 digitalberd systemd[1]: airflow-webserver.service: Failed with result 'exit-code'.
При всём при этом на сайте по 8080 порту Airflow отлично работает, только залогиниться не даёт.
Самое удивительное было, когда я его остановил принудительно: systemctl stop airflow-webserver: статус у него был, что он остановлен, но на сайте по 8080 порту он отлично показывал веб-интерфейс.
В чём же было дело и как удалось решить эту проблему? Посмотрим, что работает по этому порту:
lsof -i tcp:8080
выяснилось, что после остановки airflow-webserver остался запущенным gunicorn, который занимал 8080 порт и отрисовывал интерфейс.
После того как убил его по ID и перезапустил веб-сервер, всё наконец заработало нормально.
Вроде всё. Если что-то забыл или возникли ещё проблемы при установке - пишите, добавлю в статью.
SLASH_CyberPunk
А worker где? Где даги будут выполнятся то? о_0
DigitalBerd Автор
А это уже отличная идея для другой статьи…
Если сюда ещё впихнуть типы воркеров и их различия — получится ещё больший винегрет.