Airflow資料抄訳(2)：アーキテクチャ概観

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。

2回目の今回は[アーキテクチャ概観](https://airflow.apache.org/docs/apache-airflow/stable/concepts/overview.html)（Architecture Overview）。
バージョン2.3.2時点のものです。

---

# アーキテクチャ概観

Airflowはワークフローを構築して実行するためのプラットフォームです。ワークフローはDAG（有向非巡回グラフ）として表現され、独立した処理の部品であるタスク（Task）を内包します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f2f396b3-2d02-5724-38ec-a1c6ba61167e.png)

DAGはタスク同士の依存関係と実行の順序を示します。タスクは、データをフェッチしたり、解析処理を行ったり、他のシステムを呼び出したりといった作業を記述するものです。

Airflowインスタンスは一般的に次のコンポーネントから成ります：

* スケジューラー（scheduler）。スケジューリングされたワークフローを起動し、そこに含まれるタスクをエグゼキューターに渡して実行させます。
* エグゼキューター（executor）。タスクを実行します。Airflowのデフォルトでは、タスクはすべてスケジューラーの内部で実行されます。しかしほとんどの本番運用向けエグゼキューターはタスク実行をワーカーに委ねます。
* Webサーバー（webserver）。ワークフローとタスクの振る舞いを調査し、実行し、デバッグするための便利なUIを提供します。
* DAGフォルダー。スケジューラーやエグゼキューター（そしてエグゼキューターが管理するワーカー群）から参照されます。
* メタデータ・データベース。スケジューラー、エグゼキューター、そしてWebサーバーが状態を保存するのに利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f3b0f6e2-5a8e-b054-4c16-3c9c4870e9d1.png)

ほとんどのエグゼキューターはタスクをワーカーに割り振るために他のコンポーネントも保有しています。例えばタスクキューのようなものです。しかしエグゼキューターとそのワーカーはタスク実行を司る1つの論理的なコンポーネントとして考えて差し支えありません。

Airflow自体はあなたが何を実行するか関知しません。プロバイダー（provider）が提供する高水準な機能を利用したり、シェルやPythonのコマンドを利用したりしながら、与えられたタスクを実行するだけです。

## ワークロード

DAGは[タスク](https://airflow.apache.org/docs/apache-airflow/stable/concepts/tasks.html)（Task）の並びです。タスクには3つの形式があります：

* [オペレーター](https://airflow.apache.org/docs/apache-airflow/stable/concepts/operators.html)（Operator）。あらかじめ定義されたタスクです。これらを利用することでクイックにDAGを構築することができます。
* [センサー](https://airflow.apache.org/docs/apache-airflow/stable/concepts/sensors.html)（Sensor）。特別なオペレーターの下位分類で、外部イベントの発生を待機するものです。
* [タスクフロー](https://airflow.apache.org/docs/apache-airflow/stable/concepts/taskflow.html)（TaskFlow）。 `@task` デコレーターで装飾されたPython関数です。

細かい話をすると、これらはすべてAirflowが提供する `BaseOperator` クラスのサブクラスです。タスクとオペレーターは概念的にはいくぶん似通っていますが、分けて考えておいたほうが便利です。本質的にはオペレーターとセンサーはテンプレートであり、それをDAGの中で呼び出すことでタスクを作るのです。

## 制御フロー

[DAG](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html)（ワークフロー）は何度も実行でき、同時並行で多重実行できるように設計されています。DAGはパラメータ化されており、必須パラメータである[データ区間](https://airflow.apache.org/docs/apache-airflow/stable/dag-run.html#data-interval)（data interval）の他にも任意のオプションがいくつも存在します。

個々の[タスク](https://airflow.apache.org/docs/apache-airflow/stable/concepts/tasks.html)は他のタスクとの間に依存関係を持ちます。DAGにおいては `>>` と `<<` という2つのオペレーターで表現されるものです：

```py
first_task >> [second_task, third_task]
fourth_task << third_task
```

これは `set_upstream` と `set_downstream` という2つのメソッドを使っても同じです：

```py
first_task.set_downstream([second_task, third_task])
fourth_task.set_upstream(third_task)
```

これらの依存関係はグラフのエッジとして表現され、Airflowがタスクを実行する順序を示します。デフォルトでは、タスクは上流のタスクが成功するのを待って起動します。しかしこの動作は[Branching](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#concepts-branching)や[LatestOnly](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#concepts-latest-only)といったオペレーター、そして[トリガールール](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#concepts-trigger-rules)によってカスタマイズできます。

タスク間でデータを受け渡す方法には2種類あります：
* [XComs](https://airflow.apache.org/docs/apache-airflow/stable/concepts/xcoms.html)（クロスコミュニケーションズ）。タスク間で少量のメタデータをやり取りするのに利用できます。
* ストレージ利用。ストレージサービスにファイルをアップロードしたり、ダウンロードしたりします（ストレージはあなた自身がホストするものかもしれませんし、SaaSが提供するものかもしれません）。

Airflowはワーカーに余裕ができ次第当該のワーカーにタスク実行を依頼するので、同じDAGに記述されたタスクだからといってそれらが同じワーカーや同じマシンで実行される保証はどこにもありません。

DAGの構造はとても複雑なものとなりえます。このためAirflowはDAGのメンテナンス性を向上させるためいくつかの機能を提供しています。[サブDAG](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#concepts-subdags)（SubDAG）はDAGを別のDAGの中に埋め込み再利用するための仕組みです。[タスクグループ](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#concepts-taskgroups)（TaskGroup）はUI上で視覚的にタスクをグルーピングする仕組みです。

その他の機能として、データストアのようなリソースを簡単に一元管理できるようにする [コネクションとフック](https://airflow.apache.org/docs/apache-airflow/stable/concepts/connections.html)、同時実行数を制限する [プール](https://airflow.apache.org/docs/apache-airflow/stable/concepts/pools.html)などもあります。

## ユーザー・インターフェース

AirflowはDAG（ワークフロー）とそこで現在実行中のタスクを確認したり、新たにDAGを実行開始したり、ログを参照したり、問題の解析や解決をしたりするためのユーザー・インターフェースを提供しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/bdbb4b83-c003-637d-6f95-f08298d363cf.png)

このインターフェースはAirflow全体と個々のDAG（ワークフロー）のステータスを確認するのに最適です。

---

文字通りの概観、それも超概観という感じでしょうか。
タスクとオペレーターの分けや、スケジューラーとエグゼキューターとワーカーの協調関係などを簡単に学ぶことができました。