DockerでAirFlow学習環境構築
Docker で AirFlow 学習環境をローカル構築構築する方法を解説。 まず、AirFlowを自身の環境で使用するためにはpython
とDocker
が 必要なのでそれらのインストールからそれぞれ説明していきます。
前提環境
OS:windows ミドルウェア:Docker
学習環境構築
python のインストール
- python のインストール方法についてはこちらを参照
docker で AirFlow 環境を構築
- docker をインストールする。インストールファイルはこちらからダウンロードできる。
- インストールが終わったら PC を再起動
- 任意の場所に Docer の実行領域(ディレクトリ)を作る
Docker 実行の yaml ファイルを作成する。
docker-compose.yaml
version: "3" services: web: image: apache/airflow:2.0.2 container_name: airflow ports: - 8080:8080 volumes: - ./opt/airflow:/opt/airflow command: db init # Use fist time only # command: webserver # Using with docker-compose up after exec `db init` # command: > # bash -c "airflow webserver -p 8080 -D && airflow scheduler -D"
PowerShell を起動して先ほど作成した docker の実行環境へ移動する。
以下のコマンドで Docker コンテナーを起動して AirFlow 用の DB を初期化する。
最初に作成した yaml ファイルの最後にcommand: db init
とあるが これは AirFlow のイメージを使用してデフォルトで設定されている SqlLite を初期化している。docker-compose up
実行すると以下のような結果が返ってくる。
Creating network "docker-airflow_default" with the default driver Creating airflow ... done Attaching to airflow airflow | DB: sqlite:////opt/airflow/airflow.db airflow | [2021-01-03 13:54:08,533] {db.py:678} INFO - Creating tables airflow | INFO [alembic.runtime.migration] Context impl SQLiteImpl. airflow | INFO [alembic.runtime.migration] Will assume non-transactional DDL. airflow | INFO [alembic.runtime.migration] Running upgrade -> e3a246e0dc1, current schema airflow | INFO [alembic.runtime.migration] Running upgrade e3a246e0dc1 -> 15037123a2f, create is_encrypted ...(中略)... airflow | [2021-01-03 13:54:15,779] {manager.py:727} WARNING - No user yet created, use flask fab command to do it. airflow | [2021-01-03 13:54:25,468] {migration.py:517} INFO - Running upgrade 2c6edca13270 -> 61ec73d9401f, Add description field to connection airflow | [2021-01-03 13:54:25,497] {migration.py:517} INFO - Running upgrade 61ec73d9401f -> 64a7d6477aae, fix description field in connection to be text airflow | [2021-01-03 13:54:25,512] {migration.py:517} INFO - Running upgrade 64a7d6477aae -> e959f08ac86c, Change field in DagCode to MEDIUMTEXT for MySql airflow | [2021-01-03 13:54:26,502] {dagbag.py:440} INFO - Filling up the DagBag from /opt/airflow/dags airflow | Initialization done airflow exited with code 0
Initialization done
が表示されていれば OK 初期化処理なので初期化完了後は Docker コンテナーは自動で停止します。yaml ファイルを更新する。
最初に作成した yaml ファイルのcommand: db init
をコメントアウト
代わりにcommand: webserver
をアンコメントする。version: "3" services: web: image: apache/airflow:2.0.2 container_name: airflow ports: - 8080:8080 volumes: - ./opt/airflow:/opt/airflow # command: db init # Use fist time only command: webserver # Using with docker-compose up after exec `db init` # command: > # bash -c "airflow webserver -p 8080 -D && airflow scheduler -D"
Apache Airflow の起動する
yaml の更新が終わったら Docker コンテナーを再起動します。
‘-d’デタッチド・モードで起動しているので注意。docker-compose up -d
起動確認
docer が無事起動できているか確認する。docker-compose ps
正常に起動していれば、State が Up になっているはず。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS airflow apache/airflow:2.0.2 "/usr/bin/dumb-init …" web 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp
コンテナーが起動していることを確認したら、Web ブラウザで http://localhost:8080 にアクセスし、Apache Airflow のログイン画面が表示されることを確認します。
今の状態だとログインユーザーを作成していないのでログインできない管理者アカウントの作成
Airflow の管理者アカウントは、Airflow の CLI (コマンドラインインタフェース) から作成することができるようになっています。
そのため、起動した Docker コンテナー内で Airflow の CLI を実行し、ユーザーを作成します。PowerShell で Docker コンテナーの ID を確認
docker ps
実行結果例
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e4d2cd8fe02 apache/airflow:2.0.2 "/usr/bin/dumb-init …" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp airflow
上の例では、
6e4d2cd8fe02
がコンテナーの ID なので、この ID 使用して Airflow のコンテナーの Bash セッションを開始する。docker exec -it 6e4d2cd8fe02 bash
Bash セッションを開始したら、以下の CLI コマンドを実行し、新規にユーザーを作成する。
ID や 名前、E-mail の情報は、任意で書き換えてください。airflow users create \ --username tsubaki \ --firstname morimoto \ --lastname tsubaki \ --role Admin \ --email hogehoge@gmail.com
実行すると、作成するユーザーのパスワード入力を求められるので任意のパスワードを設定する。 任意のパスワードを設定します。 入力が問題なければ、以下のような結果が返ってくればユーザー作成は完了。
Password: Repeat for confirmation: Admin user tsubaki created
AirFlow にログイン
再度 http://localhost:8080 へアクセスし、作成したユーザーでログインする。ただし、Airflow の Web サーバーは起動しますが、DAG ファイルを認識しタスクを実行するスケジューラーは起動していない。
スケジューラーも起動するように yaml を更新する。
version: "3" services: web: image: apache/airflow:2.0.0 container_name: airflow ports: - 8080:8080 volumes: - ./opt/airflow:/opt/airflow # command: db init # Use fist time only # command: webserver # Using with docker-compose up after exec `db init` command: > bash -c "airflow webserver -p 8080 -D && airflow scheduler -D"
一度コンテナを再起動して AirFlow にログイン
まず、以下コマンドでコンテナを停止docker-compose down
そうしたら再度コンテナを起動
docker-compose up -d
起動できているかを以下コマンドで確認して起動できていれば再度 Web ブラウザで http://localhost:8080 にアクセスしログイン
docker-compose ps
これでスケジューラーも起動するようになった。
次回からはdocker-compose start -d
で起動
起動後 http://localhost:8080 でブラウザを起動
終了するときはdocker-compose stop
最後に 環境構築としては完了だが最後に今後必要になるフォルダを作っておこう。
dags_folder | /opt/airflow/dags plugins_folder | /opt/airflow/plugins base_log_folder | /opt/airflow/logs
トラブルシューティング
コンテナを立ち上げても AirFlow の画面が起動しない場合、以下の手順を試す。
- docker-compose down でコンテナを削除
- .\opt\airflow 配下の
airflow-webserver.err
・airflow-webserver.log
・airflow-webserver.out
・airflow-webserver-monitor.pid
を削除 docker-compose up -d
でコンテナを再作成- AirFlow の画面が起動するか確認する。