Airflow をさわってみた - Docker でのチュートリアルの実行 (Mac OSX 環境)

# はじめに

機械学習の前段階にていろいろと前処理が必要になってきます。これを AWS Lambda とかを使ってサーバレスな環境でやると、大規模データの分析でもスケールさせやすくて便利です。ただそうすると、**それぞれの処理をどう連携させるか**がちょっと悩みどころになってきました。

AWS 環境であれば StepFunctions が一つのアプローチですが、 [Amazon ステートメント言語](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/concepts-amazon-states-language.html) を JSON で書く必要があります。過去にすこしさわったときには、これがなかなかに書きづらい。限定された記述言語のなかでどれだけうまく書くか？が試されているようで、ちょっとバッドノウハウ感がありました。

そんなこんなで AWS Sumit の発表などを見ていると、けっこう Apache Airflow を使っている旨の発表があり、これはいっかいやってみる価値があるのでは？というのが Airflow をさわってみた動機です。

すでに先駆者の方がいらっしゃるので n 番煎じですが、一度アウトプットしてみるのが大事かな、ということで、記事にしてみました。もしどなたかの参考になれば幸いです。

参考リンク

- [AirflowとDockerで俺々データ分析基盤をつくってみた&Imageを公開してみた \#kwskrb \- Lean Baseball](https://shinyorke.hatenablog.com/entry/airflow-docker)
- [airflowのチュートリアルをしてみた \- Qiita](https://qiita.com/raqwel/items/37052d8d7d3fb1b7780b)
- [Airflow \- データパイプラインのスケジュールと監視をプログラムしてみた \- Qiita](https://qiita.com/haminiku/items/b431e9cd1cf4e300f8f0)
- [【Airflow】最近よく聞くAirflowに入門！EC2で動かしてみた【CI/CD】 \- Qiita](https://qiita.com/chan-p/items/526bbed95fdc73142c59)
- [Amazon SageMaker と Apache Airflow でエンドツーエンドの機械学習ワークフローを構築する \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/build-end-to-end-machine-learning-workflows-with-amazon-sagemaker-and-apache-airflow/)

# Airflow チュートリアルを Docker で

公式ドキュメントに [Airflow チュートリアル](https://airflow.readthedocs.io/en/latest/tutorial.html) が提供されていますので、これを素直に実行してみます。

Airflow 環境、いろいろとデータベース等々が必要そうなので、Docker 環境で試してみることにしました。Docker ファイルは、いくつかのページでおすすめされている、[puckel/docker-airflow] (https://github.com/puckel/docker-airflow) を選びました。

```
# Airflow 環境の立ち上げ - 8080 番ポートに Web UI も立ち上がります
$ docker run -d -p 8080:8080 --name airflow-dock puckel/docker-airflow webserver

# Web UI をブラウザで開く（普通にブラウザで開いてもOK）
$ open http://localhost:8080/
```

基本、チュートリアルにあるコマンドを実行していくのですが、docker 環境内ですのでコマンドは

```
$ docker exec -it airflow-dock airflow list_dags
```

といった形になります（そりゃそうだ）

```
# DAG 設定を格納するフォルダを作成
$ docker exec -it airflow-dock mkdir /usr/local/airflow/dags

# ファイルをコピー
$ docker cp newdag.py airflow-dock:/usr/local/airflow/dags/
```

このとき、GUI を見ても DAGs のところに追加した DAG は出てきませんが、CLI で確認すると、追加した DAG が表示されます。

```
$ docker exec -it airflow-dock airflow list_dags
[2019-06-15 14:32:15,489] {{__init__.py:51}} INFO - Using executor SequentialExecutor
[2019-06-15 14:32:15,927] {{__init__.py:305}} INFO - Filling up the DagBag from /usr/local/airflow/dags


-------------------------------------------------------------------
DAGS
-------------------------------------------------------------------
tutorial
```


なお、ファイルのオーナーがホストの設定そのままになってしまい、コンテナ内の airflow ユーザの UID と一致ないのが気になる場合は、下記のコマンドでコピーすることもできます。

```
$ cat newdag.py | docker exec -i airflow-dock /bin/bash -c "cat > /usr/local/airflow/dags/newdag.py"
```

## ハマりどころ

さきほども少し触れましたが、dags フォルダにファイルをおいても、GUI に反映されません。`docker restart`, `docker start/stop` をしてもダメでした。GUI で表示されなくて、なにかファイルがおかしいのかとかいろいろ探して、無駄足を踏みました。。

<!--
```
$ docker run -d -p 8080:8080 --name airflow-dock -e LOAD_EX=y puckel/docker-airflow webserver
```
-->

# （現時点での）感想

- 環境を用意するのはなかなか手強そう。CI/CD 環境を作り込むところまで持っていくのは、色々と手間がかかりそう。
- 一方、一度環境を作ってしまえばタスクは Python で書けるので、やりたい放題。GUI 環境が整っているので、運用のときには色々と便利そう。
- なお、参考リンク1つめにあげさせてもらった記事によると、[Airflow は Airflow でなかなかやっかいな子](https://shinyorke.hatenablog.com/entry/airflow-docker)らしいです。今回、さわってみた限りでも同じ印象です。

というわけで、 **タスク記述の自由度・書きやすさでは Airflow、デプロイの容易さやスケールさせやすは StepFunctions** という塩梅でしょうか。

個人的には、Airflow の強みは GUI での DAG 可視化やログ可視化あたりが強いのかと感じました。一方、タスクをちょこちょこ書き換えるようなユースケースはあまり想定されていないようです。ですので、 **ある程度、大規模で安定して稼働しているデータフローがあって、その運用を便利にしたい**ケースには向いている気がします。

一方、データ分析をいろいろ試している段階など、**学習タスクを試行錯誤しながら組み立てている段階では、オーバーヘッドに見合ったメリットを得られにくい** ように感じます。

<!-- 
他には [ckljohn/airflow-on-EKS](https://github.com/ckljohn/airflow-on-EKS), [shinyorke/airflow](https://hub.docker.com/r/shinyorke/airflow/) も候補。
-->