Contents

AirFlow学習環境構築

   Feb 11, 2023     4 min read

本編ではローカル環境に AirFlow の実行環境の構築について解説していく。

学習環境構築

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の画面が起動するか確認する。