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
ディレクトリにない理由を説明しません。
少し日付の古い投稿を調べているのはわかっていますが、サーバーの実行中にスケジューラを自動的に実行できなかった理由を理解しようとしていました。
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フォルダーにコピーされます。これらは次のとおりです。
[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
[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
このエラー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