Slide 1

Slide 1 text

2022.12.01 大矢 隆 データ本部AI技術開発部第一グループ 株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies Airflow 入門

Slide 2

Slide 2 text

2 項目 01|簡単な自己紹介 02|Airflowとは?使う理由は? 03|Airflowの構成要素と基本概念 04|Airflowのコードの書き方 05|AirflowのGUI

Slide 3

Slide 3 text

3 01 簡単な自己紹介

Slide 4

Slide 4 text

4 ● Education / Research ○ 早稲田大学高等学院 (2013.4 - 2016.3) ○ 早稲田大学先進理工学部応用物理学科 (2016.4 - 2020.3) ■ 首席 ○ 早稲田大学先進理工学術院 (略) 森島研 (2020.4 - 2022.3) ■ 研究分野: Audio-Visual Learning ● 国際会議でfull paper 2本 ● Work Experience ○ ALBERT (2017.2 - 2017.11) [バイト] ■ 動物の皮膚病診断とか、諸々 ○ DeNA (2018.6 - 2018.9, 2020.8 - 2020.8) [バイト] ■ 主にベイスターズ関連 ○ DeNA 新卒入社 (2022.4 - 現在) [正社員] ■ IRIAM、ベイスターズ関係のPJ 自己紹介

Slide 5

Slide 5 text

5 ● Kaggle ○ Grandmaster ■ 0勝5敗 (🥇0🥈2🥉1) ■ 結果を残せず ○ テーブルデータメイン ■ 仕事では computer vision多め ○ 入社してからやってない ● 趣味 ○ 囲碁(野狐8段) ○ マスターデュエル ■ ソリティアが非常に得意 自己紹介

Slide 6

Slide 6 text

● Airflowを発表テーマとして選んだ理由 ○ 7月頃から運用業務でAirflowを使用 ■ ただ、大規模な変更を加えることはなかった ○ 来年から本格的に触る予定 ■ Udemy等で勉強 ● 間違っているところがあったら教えて頂けると有り難いです🙏 ○ (皆さんの方が詳しそう) ● 本来であれば、コード多めのハンズオンをやりたかったのですが ○ 発表資料が膨れ上がってしまい断念(次回やるかも) 雑談

Slide 7

Slide 7 text

7 02 Airflowとは?使う理由は?

Slide 8

Slide 8 text

● 毎日朝10時に特定の処理を決まった順序で流したい ○ 単純な例としては以下のような感じ こんな時にどうしたら良い? DBからデータ抽出 変換 機械学習モデルで推論 データの書き出し

Slide 9

Slide 9 text

● 普通にcronを使うと? ○ 適当なシェルスクリプトを書いて、日次で実行 ○ もちろん、シンプルな処理ならこれでOK こんな時にどうしたら良い? $ crontab -l 0 10 * * * source daily_process.sh

Slide 10

Slide 10 text

● しかし。。。 ○ 処理がたくさんあったりするとなかなか大変 ■ エラーして落ちた部分から再実行したいんだけど?😡 ■ ログの管理が面倒なんだけど😭 ■ ん?どのタスクがどれくらい時間かかってるの?これ?😩 ■ タスク間の依存関係ってどうなってるんだっけ?😥 ■ 正直、ここらへん全部GUIで出来たら嬉しいんだけどなあ。。 こんな時にどうしたら良い? Airflowを使ってみよう!

Slide 11

Slide 11 text

● ワークフローをスケジューリング/モニタリングするためのプラットフォーム ○ 本家はOSS, written in python ○ GCPやAWS上には有料のフルマネージドサービスが存在 ■ GCP上ならGoogle Cloud Composer ■ AWS上ならManaged Workflows for Apache Airflow (MWAA) ○ 特に定期的なタスクの実行に最適 ■ 毎日朝8時にデータの存在を確認して前処理 & 推論を行いたい等 Airflowとは? 公式ロゴ

Slide 12

Slide 12 text

● Airflowを使う際の注意点 ○ 毎秒単位の処理が必要な場合は使わない ■ ストリームデータ処理に対しては不適 ○ Airflow”内で”重い処理を行わない ■ AirflowはOrchestrator ● 自身は重い処理を行わず、他を管理するのが仕事 ■ Airflow上で大きいデータの処理を行うのはアンチパターン ● 簡単にmemory errorになる ● 代わりに、例えばSparkにjobをsubmitする Airflowとは?

Slide 13

Slide 13 text

競合サービスとのGitHub Star数の比較 Star History 今の所Airflowが1番人気。

Slide 14

Slide 14 text

14 03 Airflowの構成要素と基本概念

Slide 15

Slide 15 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 16

Slide 16 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 17

Slide 17 text

● DAG (Directed Acyclic Graph) ○ タスク間の依存関係を示した有向非巡回グラフ ■ タスクの実行順序を規定 Airflowの構成要素: DAGs 公式Docs: concepts

Slide 18

Slide 18 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 19

Slide 19 text

● Web Server ○ Flask web server ○ AirflowのGUIを提供 Airflowの構成要素: Web Server 公式Docs: UI

Slide 20

Slide 20 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 21

Slide 21 text

● Scheduler ○ タスクのスケジューリングを行ってくれる ■ 全タスクとDAGをモニタリング ■ 依存するタスクが実行されたら次のタスクを開始 ■ 一定時間ごとにタスクがトリガーされたかを確認 ● Triggerer ○ タスクのトリガーを行う ○ 主にDeferrable Operatorという特殊なオペレータのために用いられる Airflowの構成要素: Scheduler, Triggerer

Slide 22

Slide 22 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 23

Slide 23 text

● Metastore ○ 様々なmetadataを保持するデータベース ■ パーミッションやAirflowの設定 ■ XComs (タスク間で受け渡す情報) や各DAGの情報 ■ DAG code ○ SQLAlchemyで操作可能 ■ Postgres、MySQL、MSSQL, SQLiteなどが使える Airflowの構成要素: Metadata database (Metastore)

Slide 24

Slide 24 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 25

Slide 25 text

● Executor ○ どういう形でタスクが実行されるかを定義する ■ Sequential Executor ● 一度の一つのタスクを実行 ● スケールしない ■ Local Executor ● マルチプロセスで動作 ■ CeleryExecutor ● Celeryクラスタ上で実行 Airflowの構成要素: Executor

Slide 26

Slide 26 text

● Airflowのアーキテクチャ Airflowの構成要素 公式Docs: concepts

Slide 27

Slide 27 text

● Queue ○ 正しい順番に実行するようにタスクが積まれていく ○ どんなタイプのExecutorに対しても、Queueが必要 ● Worker (s) ○ タスクが実際に実行される場所 Airflowの構成要素: Queue, Worker

Slide 28

Slide 28 text

● Task ○ Airflowの実行単位。Taskが組み合わさってDAGを構成する。 ○ Operatorを呼ぶことによって生成する ● Task Instance ○ DAGの実行時に生成されるタスクのインスタンスのこと ■ 例えば、8月11日実行分の ”ping” のtask instanceとか Airflowの基本概念: Task, Task instance with DAG("my-dag") as dag: ping = SimpleHttpOperator(endpoint="http://example.com/update/") email = EmailOperator(to="admin@example.com", subject="Update complete") ping >> email

Slide 29

Slide 29 text

● Operator ○ タスクが実際に何を行うかを規定するもの(3種類) ■ 1. Action Operators: 何らかのアクションを行うオペレータ ● PythonOperator ○ Pythonで書かれた関数を実行 ● BashOperator ○ Bash commandを実行 ● SimpleHTTPOperator ○ HTTPリクエストを行う ● etc. Airflowの基本概念: Operator

Slide 30

Slide 30 text

● Operator ○ タスクが実際に何を行うかを規定するもの(3種類) ■ 2. Transfer Operators: データの移動を行うオペレータ ● S3ToGCSOperator ○ S3からGCSにデータを移動 ● S3ToRedShiftOperator ○ S3からRedshiftにデータを移動 ● OracleToGCSOperator ○ OracleからGCSにデータを移動 ● etc. Airflowの基本概念: Operator

Slide 31

Slide 31 text

● Operator ○ タスクが実際に何を行うかを規定するもの(3種類) ■ 3. Sensor Operators: 条件が満たされるまで待機するオペレータ ● SqlSensor ○ 特定の条件が満たされるまで30秒ごとにSQL文を実行し待機 ● HttpSensor ○ HTTPレスポンスが返ってくるまで待機 ● FileSensor ○ 特定のファイルかフォルダが出現するまで待機 ● etc. Airflowの基本概念: Operator

Slide 32

Slide 32 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py)

Slide 33

Slide 33 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) パース

Slide 34

Slide 34 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Runオブジェクトを生成 DAG Run パース 情報を取得して反映

Slide 35

Slide 35 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance 情報を取得して反映

Slide 36

Slide 36 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映

Slide 37

Slide 37 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映

Slide 38

Slide 38 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映

Slide 39

Slide 39 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <失敗>

Slide 40

Slide 40 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <成功>

Slide 41

Slide 41 text

Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <終了>

Slide 42

Slide 42 text

42 04 AirflowのGUI

Slide 43

Slide 43 text

● 公式のdocker-compose.yamlをダウンロード ○ 適当なフォルダ (e.g. airflow-materials) を作ってそこに配置 ● .envファイルを作成し、以下を記述 ● 以下のコマンドを実行 Dockerを使った導入 AIRFLOW_IMAGE_NAME=apache/airflow:2.4.2 AIRFLOW_UID=50000 $ docker-compose up -d Status: Downloaded newer image for apache/airflow:2.4.2 Creating materials_redis_1 ... done Creating materials_postgres_1 ... done Creating materials_airflow-init_1 ... done Creating materials_airflow-worker_1 ... done Creating materials_airflow-webserver_1 ... done Creating materials_airflow-scheduler_1 ... done Creating materials_airflow-triggerer_1 ... done

Slide 44

Slide 44 text

● localhost:8080を開き、以下のページが表示されることを確認 ○ Username: airflow, password: airflowでログイン GUIに接続

Slide 45

Slide 45 text

● ログインすると、DAGs Viewが表示される Airflow GUI: DAGs View

Slide 46

Slide 46 text

● Toggle ○ DAGのオンオフ切り替えが可能 Airflow GUI: DAGs View

Slide 47

Slide 47 text

● DAG ○ DAGの名前とタグ。 Airflow GUI: DAGs View

Slide 48

Slide 48 text

● Owner ○ そのDAGの所有者。 Airflow GUI: DAGs View

Slide 49

Slide 49 text

● Runs ○ 過去と現在のすべてのDAG Runsのステータス。数字が表示される。 Airflow GUI: DAGs View

Slide 50

Slide 50 text

● Runs ○ 以下の4つのDAG Runのステータスの合計数を表示 Airflow GUI: DAGs View

Slide 51

Slide 51 text

● Schedule ○ 実行間隔を設定するためのCron expression ■ @dailyみたいな書き方もOK Airflow GUI: DAGs View

Slide 52

Slide 52 text

● Last Run ○ DAGが前回実行された日次 Airflow GUI: DAGs View

Slide 53

Slide 53 text

● Next Run ○ DAGが次回トリガーされる日次 Airflow GUI: DAGs View

Slide 54

Slide 54 text

● Recent Tasks ○ DAG Runではなく、Taskのステータスの表示 ■ 多すぎるので全ステータスの解説は割愛 Airflow GUI: DAGs View

Slide 55

Slide 55 text

● Actions ○ DAGの手動実行と削除が可能 Airflow GUI: DAGs View

Slide 56

Slide 56 text

● Links ○ DAGをモニタリングするために有用な画面に飛べる ■ 実はDAGの名前をクリックしても飛べるので、正直不要 Airflow GUI: DAGs View

Slide 57

Slide 57 text

● DAGs Viewで、DAGの名前をクリック Airflow GUI: Grid View

Slide 58

Slide 58 text

● DAGs Viewで、DAGの名前をクリック ○ Grid Viewに飛べる Airflow GUI: Grid View

Slide 59

Slide 59 text

● DAGのフィルター ○ 表示数を選んだり、日付を指定したり、Stateで選択したり。 Airflow GUI: Grid View

Slide 60

Slide 60 text

● カラーと状態の対応付け ○ 黄緑→Running、赤→failed, etc. Airflow GUI: Grid View

Slide 61

Slide 61 text

● 一本の長い棒が、一つのDAG Runに対応 ○ 実行時間も分かりますね! Airflow GUI: Grid View

Slide 62

Slide 62 text

● 各タスクの状況 ○ こっちもホバーすると実行時間も分かります Airflow GUI: Grid View

Slide 63

Slide 63 text

● DAGの詳細情報 ○ 最大実行時間など Airflow GUI: Grid View

Slide 64

Slide 64 text

● Grid の横をクリック ○ Graph Viewが開ける Airflow GUI: Graph View

Slide 65

Slide 65 text

● Grid の横をクリック ○ Graph Viewが開ける Airflow GUI: Graph View

Slide 66

Slide 66 text

● DAG Runの選択 ○ 日付等から選べます Airflow GUI: Graph View

Slide 67

Slide 67 text

● 使われてるオペレータの種類 ○ BashOperator、EmptyOperatorが使われてる Airflow GUI: Graph View

Slide 68

Slide 68 text

● 各タスクインスタンスの情報 ○ Clickするといろいろなものが見えます ■ インスタンスの詳細、ログ、XCom Airflow GUI: Graph View

Slide 69

Slide 69 text

● 各タスクインスタンスの情報 ○ Clickするといろいろなものが見えます ■ インスタンスの詳細、ログ、XCom Airflow GUI: Graph View

Slide 70

Slide 70 text

● 各タスクインスタンスの情報 ○ Clickするといろいろなものが見えます ■ Failedになってるインスタンスのログを確認するのが運用時重要 Airflow GUI: Graph View

Slide 71

Slide 71 text

● 以下の場所をクリック ○ Calendar Viewが開ける Airflow GUI: Calendar View

Slide 72

Slide 72 text

● 見ての通りカレンダーです ○ 今後いつ実行される予定か、いつエラーが出たか、などなど Airflow GUI: Calendar View

Slide 73

Slide 73 text

● 以下の場所をクリック ○ Landing Times Viewが開ける Airflow GUI: Landing Times View

Slide 74

Slide 74 text

● どのタスクにどれくらい時間食ってるかを長い期間で表示 ○ 今月は処理対象のデータが多かった、とかも分かる Airflow GUI: Landing Times View 公式Docs: UI

Slide 75

Slide 75 text

● 以下の場所をクリック ○ Gantt Viewが開ける Airflow GUI: Gantt View

Slide 76

Slide 76 text

● 各DAG Runのガントチャート ○ それぞれのタスクにかかる時間が可視化出来る ○ ボトルネックを洗い出すのに便利! Airflow GUI: Gantt View

Slide 77

Slide 77 text

● 以下の場所をクリック ○ Code Viewが開ける Airflow GUI: Code View

Slide 78

Slide 78 text

● 各DAGのコードを表示 ○ ちゃんとコードの変更が反映されてるか確認出来る Airflow GUI: Code View

Slide 79

Slide 79 text

● 各DAGのコードを表示 ○ ちゃんとコードの変更が反映されてるか確認出来る Airflow GUI: Code View

Slide 80

Slide 80 text

80 04 Airflowのコードの書き方

Slide 81

Slide 81 text

● 基本は、dagsというフォルダの下にdag.pyを配置する ○ dag.pyの中でDAGを定義 ■ まずは必要なoperatorなどをimport Airflow: 基本的な記法 """Example DAG demonstrating the usage of the BashOperator.""" from __future__ import annotations import datetime import pendulum from airflow import DAG from airflow.operators.bash import BashOperator from airflow.operators.empty import EmptyOperator

Slide 82

Slide 82 text

● 基本は、dagsというフォルダの下にdag.pyを配置する ○ dag.pyの中でDAGを定義 ■ With DAG()で囲うと、それが一つのDAGになる Airflow: 基本的な記法 with DAG( dag_id='example_bash_operator', schedule='0 0 * * *', start_date=pendulum.datetime(2021, 1, 1, tz="UTC"), catchup=False, dagrun_timeout=datetime.timedelta(minutes=60), tags=['example', 'example2'], params={"example_key": "example_value"}, ) as dag:

Slide 83

Slide 83 text

● 基本は、dagsというフォルダの下にdag.pyを配置する ○ dag.pyの中でDAGを定義 ■ オペレータを呼んでタスクを定義し、DAGを構成 ● >>を使って依存関係を定義する Airflow: 基本的な記法 run_this_last = EmptyOperator( task_id='run_this_last', ) run_this = BashOperator( task_id='run_after_loop', bash_command='echo 1', ) run_this >> run_this_last

Slide 84

Slide 84 text

● AがBに依存 ● AがBとCに依存 ● AとBがCとDに依存 Airflow: 依存関係の表現 op1 >> op2 op4 >> [op3, op2] from airflow.models.baseoperator import cross_downstream # Replaces # [op1, op2] >> op3 # [op1, op2] >> op4 cross_downstream([op1, op2], [op3, op4])

Slide 85

Slide 85 text

● Chainを使った記法 ● 上流タスクと下流タスクを明示的に設定 Airflow: 依存関係の表現 from airflow.models.baseoperator import cross_downstream # Replaces # [op1, op2] >> op3 # [op1, op2] >> op4 cross_downstream([op1, op2], [op3, op4]) first_task.set_downstream(second_task, third_task) third_task.set_upstream(fourth_task)

Slide 86

Slide 86 text

● タスク間で(比較的小さい)データの受け渡しを行う Airflow: XComs (クロスコミュニケーションズ) def _task1(ti): ti.xcom_push(key='example', value=0) def _task2(ti): print(ti.xcom_pull(key='example', task_ids='task1')) with DAG("xcom_dag", start_date=datetime(2022, 1, 1), schedule_interval='@daily', catchup=False) as dag: task1 = PythonOperator( task_id='task1', python_callable=_task1 ) task2 = PythonOperator( task_id='task2', python_callable=_task2 ) task1 >> task2

Slide 87

Slide 87 text

● タスクのグループ化 ○ groups/フォルダに以下を配置 Airflow: TaskGroupsの使用 from airflow.operators.bash import BashOperator from airflow.utils.task_group import TaskGroup def tasks_1(): with TaskGroup("tasks_1", tooltip="tasks 1") as group: task_1a = BashOperator( task_id='task_1a', bash_command='echo 0' ) task_1b = BashOperator( task_id='task_1b', bash_command='echo 0' ) return group

Slide 88

Slide 88 text

● タスクのグループ化 ○ groups/フォルダに以下を配置 Airflow: TaskGroupsの使用 from airflow.operators.bash import BashOperator from airflow.utils.task_group import TaskGroup def tasks_2(): with TaskGroup("tasks_2", tooltip="tasks 2") as group: task_2a = BashOperator( task_id='task_2a', bash_command='echo 1' ) task_2b = BashOperator( task_id='task_2b', bash_command='echo 1' ) return group

Slide 89

Slide 89 text

● タスクのグループ化 Airflow: TaskGroupsの使用 from airflow import DAG from airflow.operators.bash import BashOperator from groups.group1 import tasks_1 from groups.group2 import tasks_2 from datetime import datetime with DAG('group_dag', start_date=datetime(2022, 1, 1), schedule_interval='@daily', catchup=False) as dag: first_tasks = tasks_1() mid_task = BashOperator( task_id='mid task', bash_command='echo 2' ) second_tasks = tasks_2() first_tasks >> mid_task >> second_tasks

Slide 90

Slide 90 text

● タスクのグループ化 ○ Subdagを使う手もあるが、基本的には非推奨 ■ Airflow 2.2でdepreciatedになった ■ Cloud Composerでも明確に非推奨 ● “SubDAG は使用しないでください。” ■ Astronomerでも明確に非推奨 ● “Don't use SubDAGs.” ■ 公式Docsでも問題点が書かれている ● “Using LocalExecutor can be problematic as it may over-subscribe your worker, running multiple tasks in a single slot.” Airflow: TaskGroupsの使用

Slide 91

Slide 91 text

● Airflowとは ○ ワークフローを管理するためのOSS ● Airflowの構成要素/基本概念 ○ Web Server, Scheduler, MetaStore, worker, Executorなど ○ DAGを用いてタスクの依存関係を記述する ● GUI ○ ログを簡単に確認出来たり、ボトルネックを洗い出せたり便利! ● コードの書き方 ○ シフト演算子、XComs, TaskGroupなど まとめ

Slide 92

Slide 92 text

● 特に参考にした資料 ○ 公式ドキュメント ○ Airflow入門講座 ■ 英語で有料ですが、わかりやすいのでオススメ ■ 更新頻度も高 ● 他に参考にした資料 ○ Airflowのsubdagは注意点多いよ ○ Operators in Apache Airflow ○ Airflow - データパイプラインのスケジュールと監視をプログラムしてみた 参考資料