見出し

DockerでAirFlow学習環境構築

   2023年02月11日     11分で読めます

Docker で AirFlow 学習環境をローカル構築構築する方法を解説。 まず、AirFlowを自身の環境で使用するためにはpythonDockerが 必要なのでそれらのインストールからそれぞれ説明していきます。

前提環境

OS:windows ミドルウェア:Docker

学習環境構築

python のインストール

  • python のインストール方法についてはこちらを参照

docker で AirFlow 環境を構築

  1. docker をインストールする。インストールファイルはこちらからダウンロードできる。
  2. インストールが終わったら PC を再起動
  3. 任意の場所に Docer の実行領域(ディレクトリ)を作る
  4. 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"
    
  5. PowerShell を起動して先ほど作成した docker の実行環境へ移動する。

  6. 以下のコマンドで 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 コンテナーは自動で停止します。

  7. 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"
    
  8. Apache Airflow の起動する
    yaml の更新が終わったら Docker コンテナーを再起動します。
    ‘-d’デタッチド・モードで起動しているので注意。

    docker-compose up -d
    
  9. 起動確認
    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 のログイン画面が表示されることを確認します。
    今の状態だとログインユーザーを作成していないのでログインできない

  10. 管理者アカウントの作成
    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
    
  11. AirFlow にログイン
    再度 http://localhost:8080 へアクセスし、作成したユーザーでログインする。 ただし、Airflow の Web サーバーは起動しますが、DAG ファイルを認識しタスクを実行するスケジューラーは起動していない。

  12. スケジューラーも起動するように 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"
    
  13. 一度コンテナを再起動して 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

  14. 最後に 環境構築としては完了だが最後に今後必要になるフォルダを作っておこう。

    dags_folder          | /opt/airflow/dags
    plugins_folder       | /opt/airflow/plugins
    base_log_folder      | /opt/airflow/logs
    

トラブルシューティング

コンテナを立ち上げても AirFlow の画面が起動しない場合、以下の手順を試す。

  1. docker-compose down でコンテナを削除
  2. .\opt\airflow 配下のairflow-webserver.errairflow-webserver.logairflow-webserver.outairflow-webserver-monitor.pidを削除
  3. docker-compose up -dでコンテナを再作成
  4. AirFlow の画面が起動するか確認する。

参考