web-dev-qa-db-ja.com

systemdを使用してUbuntuサーバーでApache Airflowを実行しようとしています

systemd を使用してubuntuサーバーで airflow を実行しようとしています。私はエアフローのドキュメントのクイックスタートガイドとチュートリアルに従い、エアフローをインストールして次のコマンドを使用して正常に実行できました。

airflow webserver -p 8080

Systemdをインストールした後、 設定ファイル を使用して多くの試行錯誤を繰り返したところ、次のコマンドでairflowを実行できました

Sudo systemctl start airflow

Airflowは、本日までコマンドで再起動するまで1週間実行し続けました

Sudo systemctl restart airflow

Sudo systemctl status airflowを実行すると、次の2つのメッセージのいずれかが表示されます。

● 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がエアフローの開始に失敗したときに返され、2番目のメッセージはsystemdがまだエアフローの開始中であるときに返されると思います。

最初のエラーメッセージにairflow.service: Service hold-off time over, scheduling restart.が含まれているため、 this problem が発生する可能性があると思いましたが、Sudo systemctl enable airflow.serviceを実行しても問題は解決しません(airflow.serviceはそのまま有効になっていると思います)ここに示されます:Loaded: loaded (/lib/systemd/system/airflow.service; enabled; vendor preset: enabled))。

問題を解決しようとしたところ、理解できない奇妙なことがいくつか見つかりました。

  • airflowクイックスタートページ によると、airflowを手動で実行すると、Airflowホームにairflow-webserver.pidというファイルが作成され、systemdでairflowを実行すると、webserver.pid/run/airflowというファイルが作成されますディレクトリ。最初に、systemdでエアフローを実行しようとしたときに、/run/airflow/webserver.pidが作成されていないことに気付きました。 PIDFile=/home/user/airflow/airflow-webserver.pidを設定すると問題が解決しました。システムは、airflow-webserver.pidファイルで提供されるワーカーpidを使用してエアフローを実行しました。しかし、もう機能しないSudo systemctl restart airflowを実行したので、 airflow webserver -p 8080を実行しても、私が指摘したairflow-webserver.pidは作成されません。

  • Airflowを実行しても、/run/airflow/webserver.pidまたは/home/user/airflow/airflow-webserver.pidファイルが自動的に作成されなくなったため、目的のディレクトリに手動で作成しようとしました。しかし、/run/airflow/webserver.pidファイルの作成後にsystemdでairflowを実行すると、ファイルは削除され(置き換えられません)、airflow webserver -p 8080ファイルの作成後に/run/airflow/webserver.pidで手動でairflowを実行すると、thatファイル削除されます。

私の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"を使用して他の場所に存在するかどうかを確認しようとしましたが、何も返されません。

過去にsystemdでairflowが正常に実行されていたときにこのメッセージが表示されなかったため、メッセージSupervising process 30054 which is not our child. We'll most likely not notice when it exits.は私の問題と関係があると思います。 systemdがpid 30054のワーカーがアクティブでなくなったことに気付かないため、systemctl status airflowが気流が6分間実行されたことを示している可能性がありますか?

編集2:エアフローによってairflow-webserver.pidが「作成されない」理由を発見しました。 airflow webserver -p 8080を実行すると、airflowは.pidファイルを作成しますが、webserverを停止すると、systemdは.pidファイルを再度削除します(airflowがそれを行わない場合)。これは、airflow-webserver.pidが存在しない理由を説明しますが、webserver.pid/run/airflowディレクトリにない理由を説明しません。

11
Mr. President

少し日付の古い投稿を調べているのはわかっていますが、サーバーの実行中にスケジューラを自動的に実行できなかった理由を理解しようとしていました。

Ubuntu 18.04と18.10で動作する解決策を見つけたので、これが役立つことを願っています。

ここに のバックエンドに AirflowとPostgreSQLをインストールする の方法についての完全な記事を提供しました。

**私の記事の後半から基本的には、airflow-scheduler.systemファイルに特定の変更を加えることになります。

これは、Ubuntuでの実装の「落とし穴」の1つです。 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

ただし、Ubuntu 18では「EnvironmentFile」プロトコルが機能しないため、これは機能しません。代わりに、その行をコメント化して追加してください。

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

UIを自動的に起動する場合は、少なくともAirflowスケジューラとおそらくWebサーバーのsystemdサービスファイルを作成することをお勧めします。実際、この実装では両方が必要なので、airflow-scheduler.serviceとairflow-webserver.serviceの2つのファイルを作成します。どちらも/ 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

最後に、スーパーユーザーのコピーコマンドであるSudo cpを使用して、両方のファイルを/ etc/systemd/systemdフォルダーにコピーしたら、点火を開始します。

Sudo systemctl enable airflow-scheduler Sudo systemctl start airflow-scheduler Sudo systemctl enable airflow-webserver Sudo systemctl start airflow-webserver

1
Merlin

このエラーsqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: connectionは、Airflowプロセスが初期化されたデータベースに到達できないことを示しています。 Airflowウェブサーバーをセットアップする前にairflow initdbを実行しましたか?

AWS Airflow Stack でsystemdの下でAirflowを実行しています。ここに構成パラメーターがあります。完全を期すために、ここでは構成ファイルを転記しますが、構成が機能しない理由を調べただけではわかりません。

私の構成は、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
0
villasv