More Related Content Similar to PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
Similar to PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善 (20) More from 株式会社MonotaRO Tech Team
More from 株式会社MonotaRO Tech Team (20) PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善2. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
{
"name":"Masato Nakamura",
"SNS": {
"X(a.k.a. Twitter)": "masahito",
"GitHub": "masahitojp"
},
"loves": [
"Python", "JS", "Java/Scala",
"Coffee☕ "
]
"PyCon JP Speaker": [2014, 2023]
}
2
自己紹介(self-introduction)
11. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例:MonotaROでの商品情報基盤
11
● 商品情報データ作成処理は(Python+BigQuery)のバッ
チ処理で作っていた
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
SQLをテーブルの依
存関係に従って順番
に実行
業務ロジック(変換)
をPython+SQLで実
装
エラーが起きたら再
実行
外部システムとの連
携処理
やらないといけないことがたくさんある 😅
13. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 13
● 処理の移行をするために、あらためて処理を見直す
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
検索エンジンへの投入は
システムを分ける
業務ロジック
事例:MonotaROでの商品情報基盤
注力したいのはここ!
タスク依存関係の解決 リトライ処理
業務ロジックとは別でバッチ処理の機能として考えられる部分
外部システムとの
連携処理
14. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 14
● 処理全体をフルスタックのワークフローエンジンに
のせ、業務ロジックに集中すると決めた
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
タスク依存関係の解
決
外部システムとの連
携処理
ワークフローエンジンで実装する
リトライ
業務ロジック
事例:MonotaROでの商品情報基盤
注力したいのはここ!
検索エンジンへの投入は
システムを分ける
15. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 15
● 業務ロジックに集中することで移行がスムーズに!
タスク依存関係の解決や
エラー処理はワークフローエ
ンジンでカバー
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
業務ロジックを実装する
ことに専念
BigQuery+SQLで実装
Elasticsearch
商品情報
データ
事例:MonotaROでの商品情報基盤
18. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
● ワークフローエンジンは、特定の業務プロセスやタスクの実行を自動
化、管理、監視するためのツールまたはソフトウェアプラットフォー
ムです。
● Python では以下が有名です。
○ Apache Airflow, Luigi, Prefect etc
● クラウドサービスだと
○ AWS step functions, GCP Workflows etc
18
ワークフローエンジンとは?
19. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache Airflow
● 2014年にAirbnb社が開発したオープンソースのワークフローエンジン、2016年より
Apache財団に寄贈。開発言語は Python で、処理もPythonで書ける。
● ETL(ELT)ツールと呼ばれることもある
○ Extract、Transform、Loadの略で、複数のシステムからデータを抽出し、抽出
したデータを変換/加工した上でデータウェアハウス等へ渡す処理、およびそれ
を支援するソフトウェアのこと
19
20. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache Airflow
● 2014年にAirbnb社が開発したオープンソースのワークフローエンジン、2016年より
Apache財団に寄贈。開発言語は Python で、処理もPythonで書ける。
● ETL(ELT)ツールと呼ばれることもある
○ Extract、Transform、Loadの略で、複数のシステムからデータを抽出し、抽出
したデータを変換/加工した上でデータウェアハウス等へ渡す処理、およびそれ
を支援するソフトウェアのこと
○ -> 今回は商品情報データの変換処理なので用途にあう!
20
23. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache AirflowとDAG
● DAGの例
# BigQueryに配置しているソースデータから新しいデータを作成
with DAG(dag_id='my_dag', ...) as dag:
wait_table = BigQueryTableExistenceSenosr( # 中間テーブル作成完了を待つ
task_id='wait_table',...
)
execute = BigQueryInsertJobOperator( # 中間テーブルを参照して新たにテーブル作成
task_id='extract_and_transform_and_load',...
)
wait_table >> execute ## タスクを列挙して、実行の順番を定義する
23
25. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Managed service利用の勧め
● Airflowの安定運用は難しい😅
○ 構成要素を全部安定運用できる前提
○ ワーカーのスケールを考えるとK8sでの運用が必要
● マネージドサービスでの運用をお勧めしたい
○ Google Cloud : Cloud Composer
○ Amazon Managed Workflows for Apache Airflow
25
30. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
TaskGroupの勧め
def check_source_and_create_table(wait_tables: List[str], sql_file) -> TaskGroup:
with TaskGroup(group_id=group_id) as task_group:
# 中間テーブル作成完了を待つ
wait_tables = BigQueryTableExistenceSensor(..)
# 中間テーブルを参照して新たにテーブル作成
create_table = BigQueryInsertJobOperator(...)
wait_tables >> create_table
return task_group
with DAG() as dag
....
ham = check_source_and_create_table([‘ham’], ‘./create_ham_table.sql’)
spam = check_source_and_create_table([‘spam’], ‘./create_spam_table.sql’)
eggs = check_source_and_create_table([‘eggs’], ‘./create_eggs_table.sql’)
start >> [ham, spam, eggs] >> end
関数にまとめることで、 DAG
の可読性が上がる
30
31. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
TaskGroupの勧め
with DAG() as dag
....
ham = check_source_and_create_table([‘ham’], ‘./create_ham_table.sql’)
spam = check_source_and_create_table([‘spam’], ‘./create_spam_table.sql’)
eggs = check_source_and_create_table([‘eggs’], ‘./create_eggs_table.sql’)
start >> [ham, spam, eggs] >> end
31
DAGも分かりやすくなり
チームで保守しやすくなる 😄
35. Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例紹介: ログとアラート
# import Python logging module.
import logging
def _check_diff_field(**kwargs):
# 差分を確認する
if diff_set:
# Data Comparison Warning: という文字列ログを残すことで Cloud Monitoring 側でアラート通知を行う
logger.warning(f"Data Comparison Warning:[{diff_table_name.id}]:{diff_set}")
return None
check_diff_data = PythonOperator(
task_id='check_diff_data',
python_callable=_check_diff_field)
35