[Серверное администрирование, Data Engineering] Установка и настройка Airflow на Ubuntu Server 20

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
19-Мар-2021 18:30

Первый раз я установил 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 daemonAfter=network.target postgresql.service mysql.service redis.service rabbitmq-server.serviceWants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]EnvironmentFile=/etc/sysconfig/airflowUser=airflowGroup=airflowType=simpleExecStart=/usr/local/bin/airflow webserver --pid /airflow/airflow-webserver.pidRestart=on-failureRestartSec=5sPrivateTmp=true
[Install]WantedBy=multi-user.target--pid /airflow/airflow-webserver.pid должен указывать туда, где у вас лежит файл airflow-webserver.pid - мы его указывали выше в статье.airflow-scheduler.service[Unit]Description=Airflow scheduler daemonAfter=network.target postgresql.service mysql.service redis.service rabbitmq-server.serviceWants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]EnvironmentFile=/etc/sysconfig/airflowUser=airflowGroup=airflowType=simpleExecStart=/usr/local/bin/airflow schedulerRestart=alwaysRestartSec=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/FAILUREMar 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 и перезапустил веб-сервер, всё наконец заработало нормально.Вроде всё. Если что-то забыл или возникли ещё проблемы при установке - пишите, добавлю в статью.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_servernoe_administrirovanie (Серверное администрирование), #_data_engineering, #_airflow, #_etl, #_ubuntuserver, #_servernoe_administrirovanie (
Серверное администрирование
)
, #_data_engineering
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 17-Май 07:22
Часовой пояс: UTC + 5