ワークフローエンジン
Apache Airflowを用いた
大規模データパイプライン構築と改善
1
© 2023 MonotaRO Co., Ltd. All Rights Reserved.
Masato Nakamura(@masahito)
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
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)
わたしたちについて
3
BtoB を対象に、
自ら間接資材の在庫を持ち、
自らオンラインで売るEC 企業
コールセンター、商 品 採 用、物 流、
マーケティング、データサイエンス、
IT など多くの業務とシステムを
自社開発、自社運用している
フルスタック EC カンパニー
事業紹介
わたしたちについて
4
事業紹介
商品点数
約2000万点
ユーザー数
約800万以上
売上
約2260億円
グローバルに
サービス展開
(2022年度実績)
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
今回の発表では
大規模データ処理でのPython
についてお話しします。
5
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
本日お話しすること
• 大規模データパイプラインの構築は作るだけではなく、
改善しつづける必要があるよ
• 「何を」行うか(データの移動と変換)に集中しよう
• ワークフローエンジン(Apache Airflow)を入れると運用
で苦労しない機能が揃っていてハッピーになれるよ
6
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
アジェンダ
1. バッチ処理 から ワークフローへ
2. Pythonのワークフローエンジン Apache Airflow紹介
3. 改善し続ける
7
バッチ処理 からワークフローへ
8
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例:MonotaROでの商品情報基盤
● 商品情報の検索用のミドルウェアの移行中
○ Solr -> Elasticsearchへ
■ 検索 カテゴリーの記事 - MonotaRO Tech Blog
● 商品情報データ作成処理も再実装して移行中
○ 商品情報 約2000万
○ 商品属性 約2.5万
9
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例:MonotaROでの商品情報基盤
● 結論:商品情報データ作成処理の移行のために全体の処
理を見直しました。
○ 商品情報データ作成処理の業務ロジック部分を
BigQuery+SQLで実装
○ ワークフローエンジンを利用する
10
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例:MonotaROでの商品情報基盤
11
● 商品情報データ作成処理は(Python+BigQuery)のバッ
チ処理で作っていた
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
SQLをテーブルの依
存関係に従って順番
に実行
業務ロジック(変換)
をPython+SQLで実
装
エラーが起きたら再
実行
外部システムとの連
携処理
やらないといけないことがたくさんある 😅
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例:MonotaROでの商品情報基盤
12
● やらないといけないことを整理
○ 業務ロジックとそれ以外の処理をまずは分けた
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
業務ロジック 注力したいのはここ!
タスク依存関係の解決
外部システムとの
連携処理
リトライ処理
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 13
● 処理の移行をするために、あらためて処理を見直す
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
検索エンジンへの投入は
システムを分ける
業務ロジック
事例:MonotaROでの商品情報基盤
注力したいのはここ!
タスク依存関係の解決 リトライ処理
業務ロジックとは別でバッチ処理の機能として考えられる部分
外部システムとの
連携処理
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 14
● 処理全体をフルスタックのワークフローエンジンに
のせ、業務ロジックに集中すると決めた
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
検索エンジン
商品情報
データ
タスク依存関係の解
決
外部システムとの連
携処理
ワークフローエンジンで実装する
リトライ
業務ロジック
事例:MonotaROでの商品情報基盤
注力したいのはここ!
検索エンジンへの投入は
システムを分ける
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28 15
● 業務ロジックに集中することで移行がスムーズに!
タスク依存関係の解決や
エラー処理はワークフローエ
ンジンでカバー
ワークフローエンジン
BigQuery
ソース
データ
BigQuery
商品情報
データ
データ変換
業務ロジックを実装する
ことに専念
BigQuery+SQLで実装
Elasticsearch
商品情報
データ
事例:MonotaROでの商品情報基盤
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
● 「何を」行うか(データの移動と変換)<- これが大事
● 「どのように」行われるか
○ (依存関係の管理、タスクのスケジューリング、エ
ラーハンドリングなど)
16
[バッチ処理 から ワークフローへ]捉え方を変えることの効果
Pythonのワークフローエンジン
Apache Airflow紹介
17
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
● ワークフローエンジンは、特定の業務プロセスやタスクの実行を自動
化、管理、監視するためのツールまたはソフトウェアプラットフォー
ムです。
● Python では以下が有名です。
○ Apache Airflow, Luigi, Prefect etc
● クラウドサービスだと
○ AWS step functions, GCP Workflows etc
18
ワークフローエンジンとは?
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
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
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache Airflow
● 特徴: 各クラウドサービスとの連携がプラグインとして提
供されていて、主要な機能がすでに機能として使える状
態。外部システムとの連携を作りやすい。
○ Google Cloud - BigQuery, Cloud Dataflow,
Workflows
○ Amazon Web Service
○ Microsoft Azure
21
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache AirflowとDAG
● DAG (Directed acyclic graph; 有向非巡回グラフ)を利用
してワークフローを構築
○ 「依存のあるタスクをどの順番で実行するか」
22
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
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Apache Airflow の構成
• スケジューラー
• ワーカー
• メタデータ・データベース
• ウェブサーバー
• UI
24
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
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
Managed service利用の勧め
● MonotaROの商品情報データ作成処理ではGoogle Cloud
: Cloud Composer を採用しています
● 採用したポイント
○ 商品情報生成処理ではBigQueryを採用
○ Google Cloudの他サービスとの親和性の高さ
26
改善し続ける
27
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
改善し続けるときに気をつけていること
● 処理を再利用可能にする
● 最新のApache Airflowを使う
● アラートを意識してログを出力する
28
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
処理を再利用可能にする
● ワークフローの処理は同じような処理を書くことが多い
○ ログへの出力, BQでの処理実行 etc
● 処理を関数でまとめて使えるようにすると良い
○ TaskGroupの機能を使って処理をまとめておくとさら
に良い
29
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
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も分かりやすくなり
チームで保守しやすくなる 😄
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
最新のApache Airflowを使う
● 各クラウドサービスでの新しいプロダクトを使う際には
Apache Airflowのアップデートが必要です
● 最新を使うのをお勧めします
32
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
アラートを意識してログを出力する
● Cloud ComposerではログをCloud Loggingに直接出力で
きる
● 上手くログを出すことでチームの運用が楽になるアラー
トを簡単に作れる
33
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例紹介: ログとアラート
● 移行前のシステムとデータ比較している.失敗した時にア
ラートを出している。
失敗したことはわかるが、どこかは
ログを追わないとわからない 😭
調査には半日かかることも 😭
34
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
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
事例紹介: ログとアラート
差異が出たデータをアラート
に出力することでログを見な
くても原因が分かりやすくなっ
た😄
36
まとめ
37
Pythonのワークフローエンジン Apache Airflowを用いた大規模データパイプライン構築と改善
Python Conference APAC 2023@TOC有明コンベンションホール 2023/10/28
まとめ
● 大規模データパイプラインの構築は作るだけではな
く、運用を改善しつづける必要があるよ
● 「何を」行うか(データの移動と変換)に集中しよう
● ワークフローエンジン(Apache Airflow)を入れると運
用で苦労しない機能が揃っていてハッピーになれるよ
38
ありがとうございました
39
Any Other Questions?
40
41
© 2020 MonotaRO Co., Ltd. All Rights Reserved.

PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善