Первый раз я установил 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 и перезапустил веб-сервер, всё наконец заработало нормально.

Вроде всё. Если что-то забыл или возникли ещё проблемы при установке - пишите, добавлю в статью.