結論
Apache Airflow の起動時に CPU が 100% に張り付いてしまう際には、 AIRFLOW__CORE__MIN_SERIALIZED_DAG_UPDATE_INTERVAL
などの設定値を変更することで改善される可能性があります:
AIRFLOW__CORE__MIN_SERIALIZED_DAG_UPDATE_INTERVAL=600 AIRFLOW__CORE__MIN_SERIALIZED_DAG_FETCH_INTERVAL=300 AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL=600 AIRFLOW__SCHEDULER__SCHEDULER_IDLE_SLEEP_TIME=5 AIRFLOW__SCHEDULER__PARSING_PROCESSES=1
背景
極力リソースを割かずに検証を進めていた*1ため、 Apache Airflow の DB バックエンドはデフォルトの SQLite のままになっていました。 ところが、この方法は公開環境では推奨されない設定であり、
- ジョブの並列実行ができないため、今後のデータ基盤のスケーラビリティが悪い
- リリースのたびに過去の実行ログが消えるため、過去のジョブの動向の把握が困難になる可能性がある
という問題を抱えています。
実際、airflow web server を起動してアクセスするとこれらの設定を見直すことを促す警告が現れます。
そこで、 DB バックエンドを MySQL にするように、起動時の環境変数として以下の変更を加えました。
設定名 | 変更前 | 変更後 |
---|---|---|
AIRFLOW__CORE__EXECUTOR |
SequentialExecutor |
LocalExecutor |
AIRFLOW__CORE__PARALLELISM |
(not set) | 1 |
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN |
(not set) | mysql+pymysql://(自前のMySQL環境への接続情報) |
すると、具体的なジョブが実行されていない状態で(=scheduler の起動だけで)使用中のインスタンスの CPU がほぼ 100 パーセント使われてしまうようになっていました
わかりにくい画像ですが縦軸の下端は 99.5%
であり、常にほぼ 100%に張り付いていることがわかります
※この変更の導入前では、何もしない時間帯にはほぼ0で推移していました
対処したこと
https://github.com/apache/airflow/issues/13637#issuecomment-892768703 のコメントを参考にして、設定値を見直しました。 具体的には以下の設定を環境変数として追加しています*2。
AIRFLOW__CORE__MIN_SERIALIZED_DAG_UPDATE_INTERVAL=600 AIRFLOW__CORE__MIN_SERIALIZED_DAG_FETCH_INTERVAL=300 AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL=600 AIRFLOW__SCHEDULER__SCHEDULER_IDLE_SLEEP_TIME=5 AIRFLOW__SCHEDULER__PARSING_PROCESSES=1
それぞれの値の意味は https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html を参照してください。これらの設定値を反映させることにより、100%に張り付かなくはなりました
おそらくDBアクセスに関係する AIRFLOW__CORE__MIN_SERIALIZED_DAG_UPDATE_INTERVAL
あたりが功を奏したのだと思います。どの設定が最も効いたかは気になるところですが、 scheduler の設定値見直しもパフォーマンスに寄与しているはずなので、この際全ての設定を反映させたままにしておきます。
今回は Database Backend を SQLite から MySQL に変更したタイミングでパフォーマンスの限界に対面することになりましたが、データ基盤の規模やアーキテクチャに応じて、今後もこまめに設定値を見直す必要があると感じました。