この記事は公開されてから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の初期設定にて躓いた際の参考にもなれれば幸いです。