SupervisordによるAirFlow動作管理を検証すべくDockerによる環境を整えてみた

AirFlowのワークフロー設定を即反映できる手段を検証するため、Supervisord経由でのデーモン化を試してみました。
2019.05.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ワークフロー管理用アプリケーションのAirFlowは、ワークフロー設定更新の即時反映に再起動を行うという選択肢があります。

ただ、明確な特定の再起動手段は存在しないようです。手を掛けずにブラウザ上でステータスを見れて、かつ手軽なデーモン化を検討した結果、supervisordの併用を試してみることにしました。

SupervisordのDockerイメージ設定

当初は puckel/docker-airflow にて検証していましたが、airflowユーザのみドキュメント化されていることもあり、docker execにてrootユーザとして入れる klokantech/supervisord-docker にAirFlowを導入するアプローチを取りました。

dockerイメージのセットアップ

設計について見切り発車だったため、この時点ではport設定をしていません。

docker pull khoerintus/supervisord
docker run --name supervisord khoerintus/supervisord
docker exec -it supervisord /bin/bash

必要なライブラリの導入

動作及び手順に必要なライブラリを導入します。

apt-get install mysql-server build-essential autoconf \
    libtool pkg-config python-opengl python-imaging \
    python-pyrex python-pyside.qtopengl idle-python2.7 \
    qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml \
    libqt4-test libqt4-script libqt4-network libqt4-dbus \
    python-qt4 python-qt4-gl libgle3 python-dev libmysqlclient-dev wget

MySQLリポジトリの更新

まずは、mysqlのバージョンを最新のものにするため、Oracleからaptリポジトリ設定用debファイルをダウンロードして設定します。

mysql-5.7への更新を選択します。

dpkg -i mysql-apt-config_w.x.y-z_all.deb
apt-get update

今回はとにかく動かすことが目的のため、パスワード等を忘れにくい設定で入れておきます。

/etc/init.d/mysqld start
/usr/bin/mysqladmin -u root password 'password'
/usr/bin/mysql_secure_installation

MySQLの設定変更

初期設定では正常動作しないため、以下2点について変更を入れます。

  • sql_mode
  • explicit_defaults_for_timestamp

sql_modeは以下の手順で確認します。

mysql -uroot -ppassword -e"select @@sql_mode"

確認したsql_modeからSTRICT_TRANS_TABLESを除いた値を設定します。

% vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
explicit_defaults_for_timestamp = 1
sql_mode=...

STRICT_TRANS_TABLESに関する扱いについては以下の記事を参照してください。

AirFlowのインストール

pipを導入します。

curl -kL https://bootstrap.pypa.io/get-pip.py | python
pip install apache-airflow[mysql] mysql-python
airflow initdb

MySQLを参照するように設定を変更します。

% vim /root/airflow/airflow.cfg
[mysqld]
sql_alchemy_conn = mysql://root:password@localhost:3306/airflow

初期DBを追加します。

mysql -uroot -ppassword -e "CREATE DATABASE IF NOT EXISTS airflow CHARACTER SET utf8;"

再度AirFlowの初期設定を行います。

airflow resetdb
airflow initdb

Supervisordでの管理設定

airflow用の設定ファイルを追加します。

% vim /etc/supervisor/conf.d/airflow.conf
; Configuration for Airflow webserver and scheduler in Supervisor
[program:airflow]
command=/usr/local/bin/airflow webserver
stopsignal=QUIT
stopasgroup=true
user=root
stdout_logfile=/var/log/airflow/airflow-stdout.log
stderr_logfile=/var/log/airflow/airflow-stderr.log
environment=HOME="/home/airflow",AIRFLOW_HOME="/root/airflow",TMPDIR="/storage/airflow_tmp"
[program:airflowscheduler]
command=/usr/local/bin/airflow scheduler
stopsignal=QUIT
stopasgroup=true
killasgroup=true
user=root
stdout_logfile=/var/log/airflow/airflow-scheduler-stdout.log
stderr_logfile=/var/log/airflow/airflow-scheduler-stderr.log
environment=HOME="/home/airflow",AIRFLOW_HOME="/root/airflow",TMPDIR="/storage/airflow_tmp"
autorestart=true

Supervisord 経由での起動

supervisordにて動作設定を反映します。

supervisorctl reread
supervisorctl add airflow
supervisorctl add airflowscheduler
supervisorctl start airflow
supervisorctl start airflowscheduler

まとめ

Supervisord用のコンテナイメージ内ライブラリが想定よりも不足していたり古かったりと、コンテナそのものの更新に色々手間取った形になりました。

今回はSupervisordを通してAirFlowの動作を制御することが目的でしたが、AirFlowの初期設定にて躓いた際の参考にもなれれば幸いです。