Airflow — это потрясающий инструмент от Airbnb, который в настоящее время является своего рода стандартом развертывания ETL в области инженерии данных. Но в то же время вы также можете использовать Airflow для планирования конвейера машинного обучения и автоматизации всего конвейера машинного обучения (почти).
Установка Airflow
Шаг 1. Проверим что наша система использует последнюю версию пакетов для CentOS 7, проверять будет через менеджеров пакетов yum:
yum update -y
Шаг 2. Для установки Airflow установим последнюю версию python3 и pip3-python, для этого выполним команду:
yum install python3 python3-devel pip3-python -y
Шаг 3. Создадим пользователя под которым будет работать airflow, пользователя назовем так же airflow:
useradd airflow
Шаг 4. Теперь при помощи менеджера пакетов python3 установим airflow и дополнительно необходимые пакеты crypto и пакет для работы с базой данных в моей случае postgres, так же для работы с базой данных вы можете установить mysql:
pip3 install apache-airflow
Будет установлено большое количество пакетов, необходимых для работы airflow:
pip3 install 'apache-airflow[crypto]'
Будут проверены зависимости и при необходимости до установлены необходимые пакеты
pip3 install 'apache-airflow[postgres]'
Также после данной команды будут проверены версии пакетов и до установлены пакеты для работы с СУБД PostgreSQL.
Подготовка Демона Airflow
Прежде чем мы сможем настроить наш systemd
сервис для Airflow, нам нужно сделать некоторые приготовления. Первым шагом будет загрузка файлов определения службы из Airflow GitHub Репозитория.
Ссылка на ресурс:
https://github.com/apache/airflow/tree/master/scripts/systemd
Скачать служебные файлы демона
Шаг 5. Создадим временную папку для файлов загрузки.
mkdir /tmp/airflow-daemon cd /tmp/airflow-daemon
Шаг 6. Затем загрузим файлы во временную папку.
wget https://raw.githubusercontent.com/apache/airflow/master/scripts/systemd/airflow wget https://raw.githubusercontent.com/apache/airflow/master/scripts/systemd/airflow-scheduler.service wget https://raw.githubusercontent.com/apache/airflow/master/scripts/systemd/airflow-webserver.service wget https://raw.githubusercontent.com/apache/airflow/master/scripts/systemd/airflow.conf
В репозитории GitHub есть следующее краткое объяснение:
Файлы systemd в этом каталоге протестированы на системах на базе RedHat. Скопируйте (или свяжите) их в /usr/lib/systemd/system и скопируйте airflow.conf в /etc/tmpfiles.d/ или /usr/lib/tmpfiles.d/. Копирование airflow.conf гарантирует, что /run/airflow создан с правильным владельцем и правами (0755 airflow airflow) Затем вы можете запустить разные серверы с помощью systemctl start <service>. Включение служб может быть выполнено с помощью команды systemctl enable <service>. По умолчанию конфигурация среды указывает на /etc/sysconfig/airflow. Вы можете скопировать файл «airflow» в этот каталог и настроить его по своему вкусу. С некоторыми незначительными изменениями они, вероятно, работают в других системах systemd.
Что ж, я полагаю, что для большинства тех, кто не знаком с Linux, приведенная выше документация может быть очень расплывчатой и вводящей в заблуждение. Итак, я нарисовал эту диаграмму, чтобы показать, какой файл по какому пути следует поместить.
Шаг 7. Скопируем файлы по пути, указанному на схеме:
cp *.service /usr/lib/systemd/system/ cp airflow.conf /usr/lib/tmpfiles.d/ cp airflow /etc/sysconfig/
Шаг 8. Создадим необходимые каталоги, которые требуются демону. Во-первых, ему нужен специальный каталог для хранения информации о времени выполнения, такой как файлы pid
. Давайте создадим каталог в /run
каталоге и изменим владельца и разрешение.
mkdir /run/airflow chown airflow:airflow /run/airflow chmod 0755 airflow -R
Обратите внимание, что для разрешения установлено значение, 0755
поскольку на практике у нас может быть несколько других пользователей для разработки DAG (рабочих процессов) в Airflow. При наличии 0755
разрешения он гарантирует, что у всех других пользователей есть вторичная группа, так как у них группа airflow
, то будет достаточно данных разрешений.
Шаг 9. Еще один каталог, который нам нужно создать, — это домашний каталог Airflow, который включает:
- Конфигурации воздушного потока
- SQLite, который используется Airflow
- Группы DAG
- Журналы DAG
Обычно, если нет export AIRFLOW_HOME=...
, они будут автоматически сгенерированы в домашнем каталоге текущего пользователя, например /home/airflow/airflow/
. Это нормально, если вы тестируете Airflow или разрабатываете несколько групп DAG. Однако это не рекомендуется, а также неудобно в производстве, потому что другие пользователи не смогут легко получить доступ airflow
к домашнему каталогу пользователя.
В моем случае я хотел бы разместить домашний каталог Airflow в каталоге /opt
, поэтому давайте создадим его.
mkdir /opt/airflow chown airflow:airflow airflow -R chmod 775 airflow -R
Опять же, измените разрешение, чтобы разрешить всем пользователям в airflow
группе не только читать, но и писать в каталог, потому что им нужны права чтобы изменить DAG.
Инициализация домашнего каталога Airflow
Шаг 10. Все готово. Теперь нам нужно инициализировать домашний каталог Airflow. Важно экспортировать домашний каталог в AIRFLOW_HOME
переменную среды. В противном случае домашний каталог будет автоматически создан в домашней папке пользователя, как указано выше.
export AIRFLOW_HOME=/opt/airflow airflow initdb
Если же у вас возникла ошибка, как на приведенном скриншоте:
Traceback (most recent call last): File "/usr/local/bin/airflow", line 26, in from airflow.bin.cli import CLIFactory File "/usr/local/lib/python3.6/site-packages/airflow/bin/cli.py", line 94, in api_module = import_module(conf.get('cli', 'api_client')) # type: Any File "/usr/lib64/python3.6/importlib/init.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "/usr/local/lib/python3.6/site-packages/airflow/api/client/local_client.py", line 24, in from airflow.api.common.experimental import delete_dag File "/usr/local/lib/python3.6/site-packages/airflow/api/common/experimental/delete_dag.py", line 26, in from airflow.models.serialized_dag import SerializedDagModel File "/usr/local/lib/python3.6/site-packages/airflow/models/serialized_dag.py", line 35, in from airflow.serialization.serialized_objects import SerializedDAG File "/usr/local/lib/python3.6/site-packages/airflow/serialization/serialized_objects.py", line 28, in import cattr File "/usr/local/lib/python3.6/site-packages/cattr/init.py", line 1, in from .converters import Converter, GenConverter, UnstructureStrategy File "/usr/local/lib/python3.6/site-packages/cattr/converters.py", line 16, in from attr import fields, resolve_types ImportError: cannot import name 'resolve_types'
То необходимо переустановить cattrs пакет для python3, для этого выполните команду:
pip3 install cattrs==1.0.0
После чего повторите попытку инициализации базы данных
Конфигурация Airflow Демона
Шаг 11. Теперь все служебные файлы, файлы конфигурации и необходимые каталоги готовы. Нам нужно настроить демон, чтобы убедиться, что все указывает на правильные пути, прежде чем демон сможет работать правильно.
Прежде всего, давайте дважды проверим путь к airflow
двоичному файлу, потому что он должен быть указан в определении службы позже.
which airflow
В моем случае двоичный файл имеет расположение: /usr/local/bin/airflow
. Запишите, пожалуйста, свой, который, скорее всего, будет таким же, но на всякий случай обратите на него внимание. Не копируйте напрямую мой.
Затем давайте изменим определение airflow-webserver
.
vim /usr/lib/systemd/system/airflow-scheduler.service
Измените ExecStart
значение следующим образом.
ExecStart=/usr/local/bin/airflow scheduler
Точно так же изменим airflow-webserver
как и airflow-scheduler
.
vim /usr/lib/systemd/system/airflow-webserver.service
Обратите внимание, что pid
необходимо записать в только что созданный каталог /run/airflow
.
ExecStart=/usr/local/bin/airflow webserver --pid /run/airflow/webserver.pid
Затем нам нужно изменить системную конфигурацию Airflow. В противном случае службы не будут знать, где находится домашний каталог Airflow.
vim /etc/sysconfig/airflow
Две приведенные ниже конфигурации необходимо изменить следующим образом, исходя из того, что мы делали ранее:
AIRFLOW_CONFIG=/opt/airflow/airflow.cfg AIRFLOW_HOME=/opt/airflow
На последнем этапе настройки служб нам необходимо включить эти службы, прежде чем мы сможем их запускать.
systemctl enable airflow-scheduler systemctl enable airflow-webserver
Запустите настроенный демон Airflow
Шаг 12. Имея root
разрешение (пользователь root или sudo), мы можем:
- Запустите демон Airflow
systemctl start airflow-scheduler systemctl start airflow-webserver
- Проверить его статус
systemctl status airflow-scheduler
systemctl status airflow-webserver
- Остановите демона
systemctl stop airflow-scheduler systemctl stop airflow-webserver
- Перезагрузите демон
systemctl restart airflow-scheduler
systemctl restart airflow-webserver
- Просмотр журналов службы демона (последние 50 строк, количество строк настраивается с помощью
-n
параметра)
journalctl -u airflow-scheduler -n 50 journalctl -u airflow-webserver -n 50
Резюме
В этой статье было рассказано, как установить Airflow в системе CentOS, что есть недостатки, если мы просто запускаем Airflow из командной строки, поэтому нам нужно решить эту проблему, запустив его как демон.
Сначала нам нужно загрузить файлы определения службы из репозитория Apache Airflow GitHub, а затем поместить их в правильные системные каталоги. Нам также необходимо создать несколько папок, потому что они потребуются демону для правильной работы.
Наконец, нам нужно настроить файлы определения службы, чтобы демон мог находить ресурсы в правильных местах. После этого мы можем запустить Apache Airflow как демон, чтобы он собирал соответствующие журналы выполнения служб, а также автоматически перезапускал службы, если что-то пойдет не так.