Share
Embed
Transcript
92 slides
-
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 自己紹介 -
5 • Kaggle ◦ Grandmaster ▪ 0勝5敗 (🥇0🥈2🥉1) ▪ 結果を残せず
◦ テーブルデータメイン ▪ 仕事では computer vision多め ◦ 入社してからやってない • 趣味 ◦ 囲碁(野狐8段) ◦ マスターデュエル ▪ ソリティアが非常に得意 自己紹介 -
• Airflowを発表テーマとして選んだ理由 ◦ 7月頃から運用業務でAirflowを使用 ▪ ただ、大規模な変更を加えることはなかった ◦ 来年から本格的に触る予定 ▪ Udemy等で勉強
• 間違っているところがあったら教えて頂けると有り難いです🙏 ◦ (皆さんの方が詳しそう) • 本来であれば、コード多めのハンズオンをやりたかったのですが ◦ 発表資料が膨れ上がってしまい断念(次回やるかも) 雑談 -
• 普通にcronを使うと? ◦ 適当なシェルスクリプトを書いて、日次で実行 ◦ もちろん、シンプルな処理ならこれでOK こんな時にどうしたら良い? $ crontab -l
0 10 * * * source daily_process.sh -
• しかし。。。 ◦ 処理がたくさんあったりするとなかなか大変 ▪ エラーして落ちた部分から再実行したいんだけど?😡 ▪ ログの管理が面倒なんだけど😭 ▪ ん?どのタスクがどれくらい時間かかってるの?これ?😩
▪ タスク間の依存関係ってどうなってるんだっけ?😥 ▪ 正直、ここらへん全部GUIで出来たら嬉しいんだけどなあ。。 こんな時にどうしたら良い? Airflowを使ってみよう! -
• ワークフローをスケジューリング/モニタリングするためのプラットフォーム ◦ 本家はOSS, written in python ◦ GCPやAWS上には有料のフルマネージドサービスが存在 ▪
GCP上ならGoogle Cloud Composer ▪ AWS上ならManaged Workflows for Apache Airflow (MWAA) ◦ 特に定期的なタスクの実行に最適 ▪ 毎日朝8時にデータの存在を確認して前処理 & 推論を行いたい等 Airflowとは? 公式ロゴ -
• Airflowを使う際の注意点 ◦ 毎秒単位の処理が必要な場合は使わない ▪ ストリームデータ処理に対しては不適 ◦ Airflow”内で”重い処理を行わない ▪ AirflowはOrchestrator
• 自身は重い処理を行わず、他を管理するのが仕事 ▪ Airflow上で大きいデータの処理を行うのはアンチパターン • 簡単にmemory errorになる • 代わりに、例えばSparkにjobをsubmitする Airflowとは? -
• DAG (Directed Acyclic Graph) ◦ タスク間の依存関係を示した有向非巡回グラフ ▪ タスクの実行順序を規定 Airflowの構成要素:
DAGs 公式Docs: concepts -
• Web Server ◦ Flask web server ◦ AirflowのGUIを提供 Airflowの構成要素:
Web Server 公式Docs: UI -
• Scheduler ◦ タスクのスケジューリングを行ってくれる ▪ 全タスクとDAGをモニタリング ▪ 依存するタスクが実行されたら次のタスクを開始 ▪ 一定時間ごとにタスクがトリガーされたかを確認
• Triggerer ◦ タスクのトリガーを行う ◦ 主にDeferrable Operatorという特殊なオペレータのために用いられる Airflowの構成要素: Scheduler, Triggerer -
• Metastore ◦ 様々なmetadataを保持するデータベース ▪ パーミッションやAirflowの設定 ▪ XComs (タスク間で受け渡す情報) や各DAGの情報
▪ DAG code ◦ SQLAlchemyで操作可能 ▪ Postgres、MySQL、MSSQL, SQLiteなどが使える Airflowの構成要素: Metadata database (Metastore) -
• Executor ◦ どういう形でタスクが実行されるかを定義する ▪ Sequential Executor • 一度の一つのタスクを実行 •
スケールしない ▪ Local Executor • マルチプロセスで動作 ▪ CeleryExecutor • Celeryクラスタ上で実行 Airflowの構成要素: Executor -
• Queue ◦ 正しい順番に実行するようにタスクが積まれていく ◦ どんなタイプのExecutorに対しても、Queueが必要 • Worker (s) ◦
タスクが実際に実行される場所 Airflowの構成要素: Queue, Worker -
• 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="[email protected]", subject="Update complete") ping >> email <dag.py> -
• Operator ◦ タスクが実際に何を行うかを規定するもの(3種類) ▪ 1. Action Operators: 何らかのアクションを行うオペレータ •
PythonOperator ◦ Pythonで書かれた関数を実行 • BashOperator ◦ Bash commandを実行 • SimpleHTTPOperator ◦ HTTPリクエストを行う • etc. Airflowの基本概念: Operator -
• Operator ◦ タスクが実際に何を行うかを規定するもの(3種類) ▪ 2. Transfer Operators: データの移動を行うオペレータ •
S3ToGCSOperator ◦ S3からGCSにデータを移動 • S3ToRedShiftOperator ◦ S3からRedshiftにデータを移動 • OracleToGCSOperator ◦ OracleからGCSにデータを移動 • etc. Airflowの基本概念: Operator -
• Operator ◦ タスクが実際に何を行うかを規定するもの(3種類) ▪ 3. Sensor Operators: 条件が満たされるまで待機するオペレータ •
SqlSensor ◦ 特定の条件が満たされるまで30秒ごとにSQL文を実行し待機 • HttpSensor ◦ HTTPレスポンスが返ってくるまで待機 • FileSensor ◦ 特定のファイルかフォルダが出現するまで待機 • etc. Airflowの基本概念: Operator -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) パース -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Runオブジェクトを生成 DAG Run パース 情報を取得して反映 -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance 情報を取得して反映 -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <失敗> -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <成功> -
Airflow: 全体の動作の流れ DAG Folder Scheduler MetaStore Executor Web Server add
files (e.g. dag.py) DAG Run パース Task instance Task instance 情報を取得して反映 <終了> -
• 公式の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 -
• 基本は、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 -
• 基本は、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: -
• 基本は、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 -
• 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]) -
• 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) -
• タスク間で(比較的小さい)データの受け渡しを行う 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 -
• タスクのグループ化 ◦ groups/フォルダに以下を配置 Airflow: TaskGroupsの使用 <groups/group1.py> 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 -
• タスクのグループ化 ◦ groups/フォルダに以下を配置 Airflow: TaskGroupsの使用 <groups/group2.py> 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 -
• タスクのグループ化 Airflow: TaskGroupsの使用 <dag.py> 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 -
• タスクのグループ化 ◦ 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の使用 -
• Airflowとは ◦ ワークフローを管理するためのOSS • Airflowの構成要素/基本概念 ◦ Web Server, Scheduler,
MetaStore, worker, Executorなど ◦ DAGを用いてタスクの依存関係を記述する • GUI ◦ ログを簡単に確認出来たり、ボトルネックを洗い出せたり便利! • コードの書き方 ◦ シフト演算子、XComs, TaskGroupなど まとめ -
• 特に参考にした資料 ◦ 公式ドキュメント ◦ Airflow入門講座 ▪ 英語で有料ですが、わかりやすいのでオススメ ▪ 更新頻度も高
• 他に参考にした資料 ◦ Airflowのsubdagは注意点多いよ ◦ Operators in Apache Airflow ◦ Airflow - データパイプラインのスケジュールと監視をプログラムしてみた 参考資料