Попытка запустить apache airflow на сервере ubuntu с помощью systemd - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь запустить airflow на сервере Ubuntu с systemd .Я следовал краткому руководству и руководству из документации по воздушному потоку, и мне удалось установить воздушный поток и успешно запустить его с помощью команды:

airflow webserver -p 8080

После установки systemd и большого количества проб и ошибок с помощью файлы конфигурации Мне удалось запустить поток воздуха с помощью команды

sudo systemctl start airflow

Поток воздуха продолжался в течение недели, пока сегодня я не перезапустил его с помощью команды

sudo systemctl restart airflow

Запускsudo systemctl status airflow теперь дает мне одно из следующих двух сообщений:

● airflow.service - Airflow webserver daemon
 Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)
 Active: activating (auto-restart) (Result: exit-code) since Wed 2018-09-12 09:23:01 UTC; 1s ago
Process: 3115 ExecStart=/opt/miniconda3/bin/airflow webserver -p 8080 --pid /home/user/airflow/airflow-webserver.pid --daemon (code=exited, status=1/FAILURE)
Main PID: 3115 (code=exited, status=1/FAILURE)

Sep 12 09:23:01 server-service systemd[1]: airflow.service: Main process exited, code=exited, status=1/FAILURE
Sep 12 09:23:01 server-service systemd[1]: airflow.service: Unit entered failed state.
Sep 12 09:23:01 server-service systemd[1]: airflow.service: Failed with result 'exit-code'.

или

● airflow.service - Airflow webserver daemon
 Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)
 Active: active (running) since Wed 2018-09-12 09:23:54 UTC; 1s ago
Main PID: 3399 (airflow)
  Tasks: 1
 Memory: 56.1M
    CPU: 1.203s
 CGroup: /system.slice/airflow.service
         └─3399 /opt/miniconda3/bin/python /opt/miniconda3/bin/airflow webserver -p 8080 --pid /home/user/airflow/airflow-webserver.pid --daemon

Sep 12 09:23:54 server-service systemd[1]: Stopped Airflow webserver daemon.
Sep 12 09:23:54 server-service systemd[1]: Started Airflow webserver daemon.
Sep 12 09:23:54 server-service airflow[3399]: [2018-09-12 09:23:54,372] {__init__.py:57} INFO - Using executor SequentialExecutor
Sep 12 09:23:55 server-service airflow[3399]:   ____________       _____________
Sep 12 09:23:55 server-service airflow[3399]:  ____    |__( )_________  __/__  /________      __
Sep 12 09:23:55 server-service airflow[3399]: ____  /| |_  /__  ___/_  /_ __  /_  __ \_ | /| / /
Sep 12 09:23:55 server-service airflow[3399]: ___  ___ |  / _  /   _  __/ _  / / /_/ /_ |/ |/ /
Sep 12 09:23:55 server-service airflow[3399]:  _/_/  |_/_/  /_/    /_/    /_/  \____/____/|__/
Sep 12 09:23:55 server-service airflow[3399]:  
Sep 12 09:23:55 server-service airflow[3399]: [2018-09-12 09:23:55,124] [3399] {models.py:167} INFO - Filling up the DagBag from /root/airflow/dags

Я думаю, что первое сообщение возвращается, когда systemd не удалось запустить поток воздуха, и второе сообщениевозвращается, когда systemd все еще находится в процессе запуска воздушного потока.

Так как первое сообщение об ошибке содержит airflow.service: Service hold-off time over, scheduling restart. Я думал, что у меня может быть эта проблема , но запуск sudo systemctl enable airflow.service не решает проблему (я думаю, что airflow.service включен в любом случаекак указано здесь: Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)).

При попытке решить проблему я обнаружил некоторые странные вещи, которые мне не понятны:

  • Согласно Страница быстрого запуска airflow , запуск airflow вручную создаст файл с именем airflow-webserver.pid в homeflow air, в то время как запуск airflow с помощью systemd создаст файл с именем webserver.pid в каталоге /run/airflow.Первоначально, когда я попытался запустить поток воздуха с помощью systemd, я заметил, что /run/airflow/webserver.pid не был создан.Установка PIDFile=/home/user/airflow/airflow-webserver.pid решила проблему;система запускала поток воздуха с рабочим pid, указанным в файле airflow-webserver.pid.Но теперь, когда я запустил sudo systemctl restart airflow, это больше не работает;запуск airflow webserver -p 8080 не создает airflow-webserver.pid, на который я указывал.

  • Поскольку запуск airflow больше не создает автоматически файлы /run/airflow/webserver.pid или /home/user/airflow/airflow-webserver.pid, я пытался их создатьвручную в нужных каталогах.Но если я запускаю airflow с systemd после создания файла /run/airflow/webserver.pid, он удаляется (и не заменяется), и если я запускаю airflow вручную с airflow webserver -p 8080 после создания файла /run/airflow/webserver.pid, тогда этот файл

Мой airflow.service файл выглядит следующим образом:

[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
PIDFile=/home/user/airflow/airflow-webserver.pid
User=%i
Group=%i
Type=simple
ExecStart=/opt/miniconda3/bin/airflow webserver -p 8080 --pid /home/user/airflow/airflow-webserver.pid --daemon

Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Вопрос: Как мне решить эти проблемы, чтобы яможно запустить поток воздуха с помощью systemd?

Редактировать: После повторного перезапуска демона systemd мне удалось запустить поток воздуха (или, по крайней мере, так кажется).Запуск systemctl status airflow возвращает:

● airflow.service - Airflow webserver daemon
   Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-09-12 10:49:17 UTC; 6min ago
 Main PID: 30054
    Tasks: 0
   Memory: 388.0K
      CPU: 2.987s
   CGroup: /system.slice/airflow.service

Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
Sep 12 10:49:22 server-service airflow[30031]:     reraise(type(exception), exception, tb=exc_tb, cause=cause)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
Sep 12 10:49:22 server-service airflow[30031]:     raise value.with_traceback(tb)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
Sep 12 10:49:22 server-service airflow[30031]:     context)
Sep 12 10:49:22 server-service airflow[30031]:   File "/opt/miniconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
Sep 12 10:49:22 server-service airflow[30031]:     cursor.execute(statement, parameters)
Sep 12 10:49:22 server-service airflow[30031]: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: connection [SQL: 'SELECT connection.conn_id AS connection_conn_id \nFROM connection G
Sep 12 10:49:23 server-service systemd[1]: airflow.service: Supervising process 30054 which is not our child. We'll most likely not notice when it exits.
lines 1-19/19 (END)

К сожалению, я не могу получить доступ к воздушному потоку в своем браузере.Более того, запуск воздушного потока с помощью systemd или вручную не приводит к файлам желаний /run/airflow/webserver.pid и /home/user/airflow/airflow-webserver.pid.Я пытался проверить, существуют ли они в другом месте с помощью sudo find ~/ -type f -name "webserver.pid", но это ничего не возвращает.

Я думаю, что сообщение Supervising process 30054 which is not our child. We'll most likely not notice when it exits. как-то связано с моей проблемой, так как оно не получило этосообщение об успешном запуске воздушного потока с помощью systemd в прошлом.Может ли быть так, что systemctl status airflow указывает, что воздушный поток работал в течение 6 минут, потому что systemd не замечает, что работник с pid 30054 больше не активен?

Edit 2: У меня естьвыяснил, почему airflow-webserver.pid "не создается" потоком воздуха.Когда вы запускаете airflow webserver -p 8080 airflow создает файл .pid, но при остановке веб-сервера systemd снова удаляет файл .pid (если airflow не делает этого сам).Это объясняет, почему airflow-webserver.pid не было там, но не объясняет, почему webserver.pid не находится в каталоге /run/airflow.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Я знаю, что выкапываю немного устаревший пост, но я тоже пытался выяснить, почему я не смог заставить планировщик работать автоматически, когда сервер работает.

Я нашел решение, которое работает для меня на Ubuntu 18.04 и 18.10, так что, надеюсь, это поможет.

Я предоставил полное описание того, как установить Airflow и PostgreSQL в бэкэнде по ссылке здесь .

** из последней части моей статьи. По сути, все сводится к внесению определенных изменений в файл airflow-scheduler.system.

Это один из «уловок» для реализации в Ubuntu.Команда разработчиков, которая создала Airflow, спроектировала его для работы в другом дистрибутиве Linux, и поэтому есть небольшое (но критическое) изменение, которое необходимо внести, чтобы Airflow автоматически запускался при включении сервера.Файлы службы systemd по умолчанию изначально выглядят так:

[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=/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Однако это не будет работать, так как протокол «EnvironmentFile» не работает в Ubuntu 18. Вместо этого закомментируйте эту строку и добавьте:

Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Скорее всего, вы захотите создать файл службы systemd хотя бы для планировщика воздушного потока, а также, вероятно, для веб-сервера, если вы хотите, чтобы пользовательский интерфейс также запускался автоматически.На самом деле мы хотим использовать и то, и другое в этой реализации, поэтому мы будем создавать два файла: airflow-scheduler.service и airflow-webserver.service.Оба из них будут скопированы в папку / etc / systemd / system.Вот они:


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/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
#airflow-webserver.service

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/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Наконец, с обоимите файлы, которые были скопированы в папку / etc / systemd / systemd с помощью команды суперпользователя sudo cp, пришло время нажать на зажигание:

sudo systemctl enable airflow-scheduler sudo systemctl start airflow-scheduler sudo systemctl enableairflow-webserver sudo systemctl start airflow-webserver

0 голосов
/ 11 декабря 2018

Эта ошибка sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: connection указывает, что вашему процессу Airflow не удается получить доступ к базе данных, которая была инициализирована. Вы уверены, что запускали airflow initdb перед тем, как пытаться настроить веб-сервер Airflow?

Я запускаю Airflow под systemd в моем AWS Airflow Stack , где вы можете найти параметры конфигурации. Я напишу здесь свои конфигурационные файлы для полноты картины, но я не мог выяснить, просто посмотрев, почему ваша конфигурация не будет работать.

Моя конфигурация настроена так, чтобы она работала под пользователем ec2-user внутри Amazon Linux 2 машины, но я считаю, что она должна работать и для Ubuntu. Заметьте, что поскольку я запускаю базу данных, redis и все остальное на других машинах, я удалил их из раздела After.

        /usr/bin/turbine:
            #!/bin/sh
            exec airflow scheduler

        /etc/sysconfig/airflow:
            AIRFLOW_HOME=/efs/airflow
            AIRFLOW__CELERY__DEFAULT_QUEUE=${queue}
            ... your environment configs
            AWS_DEFAULT_REGION=${AWS::Region}

        /usr/lib/systemd/system/airflow.service:
            [Unit]
            Description=Airflow daemon
            After=network.target
            [Service]
            EnvironmentFile=/etc/sysconfig/airflow
            User=ec2-user
            Group=ec2-user
            Type=simple
            ExecStart=/usr/bin/turbine
            Restart=always
            RestartSec=5s
            [Install]
            WantedBy=multi-user.target

        /usr/lib/tmpfiles.d/airflow.conf:
            D /run/airflow 0755 ec2-user ec2-user

В дополнение к этому, я настроил службу наблюдателя, чтобы убедиться, что мы всегда используем последнюю версию файла окружения с systemd:

        /usr/lib/systemd/system/watcher.service:
            [Unit]
            Description=Airflow configuration watcher
            After=network.target
            [Service]
            Type=oneshot
            ExecStartPre=/usr/bin/systemctl daemon-reload
            ExecStart=/usr/bin/systemctl restart airflow
            [Install]
            WantedBy=multi-user.target

        /usr/lib/systemd/system/watcher.path:
            [Path]
            PathModified=/etc/sysconfig/airflow
            [Install]
            WantedBy=multi-user.target

Все настроено с

systemctl enable airflow.service
systemctl enable watcher.path
systemctl start airflow.service
systemctl start watcher.path
...