SlideShare a Scribd company logo
1 of 38
Download to read offline
Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
Airflowを広告データのワークフローエンジンとし
て運用してみた話

2020.01.24 大規模データ集積/分析基盤 Meet-up! 

Katsunori Kanda @ Dentsu Digital 

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

神田 勝規(かんだかつのり)



サイトリライアビリティエンジニア

2018年 電通デジタル入社



Twitter/Github @potix2 

Shibuya.lisp 第2期運営でした 



OS・分散システムをチョットわかる 

仕事で使う言語: golang/python 

Vimmer(;と:はスワップする派) 



いまやっていること

広告配信実績データ基盤の開発・運用 

社内の開発基盤の整備 

2

自己紹介

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

アジェンダ

● Airflowとは

● Airflow導入のきっかけ

● Airflowクラスターの構築方法

● 実際に運用しておきた問題

● 今後の改善点

● まとめ

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflow導入のきっかけ

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowの導入以前・・・



● 社内のいくつかのチームがそれぞれの方法でワークフロー組んでいた

○ Digdagサーバー

○ Treasure DataのDigdagサーバー

○ 野良EC2インスタンス

● インフラの面倒を見れるエンジニアが非常に少ない

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowの導入以前・・・

データサイエンティスト 

BIエンジニア
ソフトウェア

エンジニア

DevOps

エンジニア

EC2

EC2

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowの導入以前・・・



プロジェクトごとに

異なるワークフロー管理

少人数で運用・監視を

サポートするには効率が悪い

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflow導入の背景

そんなにこだわりをもって

選定されている訳ではない・・・



本業は別で、

ワークフロー構築には労力を割きたくない

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflow導入の背景

利用者が納得できるデフォルトの選択肢を提供

● Airflowでワークフローを構築するプロジェクトが増加

● 社内での知見共有が活発になった

○ 社内でのAirflow勉強会の開催

○ Airflowエバンジェリストが爆誕

○ 技術ブログにも記事が投稿されるように

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

どうしてAirflowを選択したのか?

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

デフォルトのワークフロー環境を選択する際に重視したこと

● AWS環境で動かせる

● 運用の手間がかからない

● ポータビリティが高い

○ BigQueryの利用が増えているのでGCP環境へワーク
フローを移行することを視野にいれる

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

AWS Glueも検討したものの・・・

● 運用の手間: ◎
● ポータビリティ: ×
● 機能が充実: DataCatalogやCrawlerなど
○ 必要なのがワークフローエンジンだけならデメリット
○ Crawlerは便利だがAWSに閉じている
Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

GCPへの移行を視野にいれると

Airflowの一択

(Cloud Composerを使いたい)

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

問題なのは、

AWS環境に「どうやって」Airflowを構築するのか?

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Amazon EKS vs AWS Fargate

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

結論・・・

● AWS Fargateを採用した

● 理由:
○ AWS Fargateでのサービス運用経験があった
○ Kubernetesの運用をしたくなかった
■ 少人数の運用チームには荷が重い
○ 構築の手間に大きな差はない
既にKubernetesの運用体制があるならEKSという選択肢もあり 

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowクラスターの構築方法

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Apache Airflowとは?

● Pythonで記述されたワークフローの実行・監視ツール

○ ETLや機械学習タスクが実行される

● Apacheトップレベルプロジェクトの一つ

○ コントリビューター:1,000+

○ スターの数: 15,000+

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowのワークフローを構成するコンセプト(1/2)

● DAG:タスクの実行順序を決定するグラフ

● Operator:テンプレート化された実行単位

● Task:パラメータが与えられたオペレータ

A
C
B
D
Operators

(Python, HTTP, Docker, S3, 

Kubernetes, etc…)

DAG

Task

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowのワークフローを構成するコンセプト(2/2)



● Task Instance:特定の実行に関連づけられたTask

● Executor:Task Instanceの実行を開始する仕組み

○ LocalExecutor

○ CeleryExecutor

○ など

https://airflow.apache.org/docs/stable/concepts.html#task-lifecycle
Task Lifecycle

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

AWS Fargateで動かす

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

AZAZ
AWS Fargateのアーキテクチャとコンセプト

Task
Container
Service
サービス定義

● どのタスク定義を使うか? 

● レプリケーションの数 

● ロードバランサーとの接続設定 

● サービスディスカバリーの設定 

タスク定義

● どのコンテナを使うか? 

● 割り当てリソース(CPU/メモリ等) 

ECR
Task
Container
pull
pull

deployment

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

AirflowをAWS Fargateで動かす

● docker-airflowを利用した

○ URL: https://github.com/puckel/docker-airflow 

● CeleryExecutorを利用

● DAGはs3に配置しサイドカーコンテナで同期

● AWS Fargateで動かすために作成したもの

○ サービス定義

■ web/scheduler/worker/flower

○ タスク定義

■ コンテナは共通でCMDのオプションと環境変数を調整

○ S3同期用のコンテナイメージ

■ AWS CLIが使えるコンテナを作成

■ aws s3 syncを定期実行

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

全体の構成

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

DAGの開発フロー

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

● LocalExecutorを利用

● docker-composeを使って本番と同じイメージを使う

○ https://github.com/puckel/docker-airflow/blob/master/docker-co
mpose-LocalExecutor.yml
○ ECRからイメージ取得するように修正する

DAGの開発

% $(aws ecr get-login --no-include-email --region ap-northeast-1) 

% docker-compose -f docker-compose-LocalExecutor.yaml up 

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

DAGの開発:ローカル環境で確認すべきこと

● 文法チェック

● ライブラリの依存関係のチェック

○ 依存関係に問題があるとimportでこける(Broken DAG)

● Connections/Variablesへの依存

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

実際に運用しておきた問題

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

依存ライブラリのコンフリクト

● 現象
○ PythonOperatorから使うライブラリとAirflowが依存しているライブラリ
が被ると動かない場合がある
○ 依存ライブラリのコンフリクトすると原因究明に少し手間取る
○ DAGが正常に認識されない形で現れる
● 回避方法
○ PythonVirtualenvOperatorを使う方法があるがC拡張のライブラリは入
らない
○ DockerOperatorなど外部リソースをキックする形にしたほうがよい

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Airflowのバージョンアップが面倒

● 現象
○ リビジョン番号をあげた場合でも互換性がないときがある
○ 1.10.2 -> 1.10.3 のバージョンアップ時に設定ファイルに互換がなかっ
た
● 回避策
○ Airflowのバージョン管理はdocker-airflowプロジェクトにまかせる
○ Dockerfile内の設定ファイルを直接編集しない
○ 環境変数でパラメータ上書きする

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

Webサーバーが再起動できなくなる

● 現象
○ DAGの読み込み時間がかかりすぎるとLBのヘルスチェックでこける
● 回避策
○ DAGの定義に重い処理をかかない
○ サービス定義のヘルスチェック猶予期間を伸ばす
def task_handler(ds, **kwargs):
# 何か重い処理 <-- OK
...
return
# 何か重い処理 <-- NG
op1 = PythonOperator(
task_id=’op1’,
provided_context=True,
python_callable=task_handler,
dag = dag,
)
Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

schedulerの突然死

● 原因
○ ログが溢れる
○ CPU/メモリのオーバーコミット
● 回避策
○ タスク定義のヘルスチェックを適切に設定(WIP)
○ unhealthyになったときschedulerが自動でリプレイスされるようになる
Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

今後の改善点

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

今後の改善ポイント

● schedulerのSPOF解消

○ タスク定義のヘルスチェック設定を変更

○ CLIからヘルスチェックする機能の追加が必要かも

○ 参考: https://github.com/apache/airflow/pull/6277

● DAGファイルの同期にタイムラグを無くす

○ S3イベントを使って同期処理するサイドカーを開発する

● CLIが使えない

○ AWS SSM Agentをコンテナ内に配置する

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

まとめ

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

まとめ

● デフォルトワークフローエンジンとしてAirflowを導入した

● AWS Fargate上にAirflowクラスターを構築

○ docker-airflowを利用

○ ECSへのデプロイ設定を作成

● 実際に運用が開始されるとさまざまな問題が発生

○ インフラ構築・運用にまつわる問題

○ DAGの書き方に起因する問題

Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

電通デジタルでは、

大規模データを一緒に処理してくれる仲間を探しています!

詳しくは、こちらまで。 

関連資料:

● AWSを活用した少人数チームのためのコンテナデプロイ戦略 @ DevOps Days Tokyo 2019 

● 新米Pythonistaが贈るAirflow入門&活用事例紹介 @ PyCon JP 2019

● BigQueryで傾向スコア分析 @ DentsuDigital Tech Blog 




More Related Content

What's hot

イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 

What's hot (20)

pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
 
AWSではじめるMLOps
AWSではじめるMLOpsAWSではじめるMLOps
AWSではじめるMLOps
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
 
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 

Similar to Airflowを広告データのワークフローエンジンとして運用してみた話

Similar to Airflowを広告データのワークフローエンジンとして運用してみた話 (20)

Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
CData Sync × Google BigQuery 3ステップで各データソースとのデータ連携を実現
CData Sync × Google BigQuery  3ステップで各データソースとのデータ連携を実現CData Sync × Google BigQuery  3ステップで各データソースとのデータ連携を実現
CData Sync × Google BigQuery 3ステップで各データソースとのデータ連携を実現
 
kintoneのデータをSQLで操作!? ~Drivers/Gateway/Sync 徹底比較~
kintoneのデータをSQLで操作!? ~Drivers/Gateway/Sync 徹底比較~kintoneのデータをSQLで操作!? ~Drivers/Gateway/Sync 徹底比較~
kintoneのデータをSQLで操作!? ~Drivers/Gateway/Sync 徹底比較~
 
CData Drivers HandsOn 20180326
CData Drivers HandsOn 20180326CData Drivers HandsOn 20180326
CData Drivers HandsOn 20180326
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
[Cloud OnAir] お客様事例紹介 -リクルートライフスタイルにおける デジタルトランスフォーメーションとクラウド活用- 2018年7月12日 放送
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
 
Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2Gaming cicd-pipeline gaming-technight-2
Gaming cicd-pipeline gaming-technight-2
 
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
 
iot@Loft#14-LT4-AI /機械学習に活用できる AWSのエッジソリューションのご紹介
iot@Loft#14-LT4-AI /機械学習に活用できる AWSのエッジソリューションのご紹介iot@Loft#14-LT4-AI /機械学習に活用できる AWSのエッジソリューションのご紹介
iot@Loft#14-LT4-AI /機械学習に活用できる AWSのエッジソリューションのご紹介
 
20200811 AWS Black Belt Online Seminar CloudEndure
20200811 AWS Black Belt Online Seminar CloudEndure20200811 AWS Black Belt Online Seminar CloudEndure
20200811 AWS Black Belt Online Seminar CloudEndure
 
CData API Server ハンズオン
CData API Server ハンズオンCData API Server ハンズオン
CData API Server ハンズオン
 
CData General Proposal
CData General ProposalCData General Proposal
CData General Proposal
 
Microsoft open tech night 2020 feb18
Microsoft open tech night 2020 feb18Microsoft open tech night 2020 feb18
Microsoft open tech night 2020 feb18
 
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化2021/03/19 パブリッククラウドを活かす運用プロセス自動化
2021/03/19 パブリッククラウドを活かす運用プロセス自動化
 
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphereQuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
 
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
Attunity社のソリューションの日本国内外適用事例及びロードマップ紹介[ATTUNITY & インサイトテクノロジー IoT / Big Data フ...
 
CData Drivers for PCA 概要
CData Drivers for PCA 概要CData Drivers for PCA 概要
CData Drivers for PCA 概要
 
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
 
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善PyConAPAC2023 ワークフローエンジン  Apache Airflowを用いた 大規模データパイプライン構築と改善
PyConAPAC2023 ワークフローエンジン Apache Airflowを用いた 大規模データパイプライン構築と改善
 

More from Katsunori Kanda

自動テストのすすめ
自動テストのすすめ自動テストのすすめ
自動テストのすすめ
Katsunori Kanda
 

More from Katsunori Kanda (14)

Airflow 2.0 migration ガイド
Airflow 2.0 migration ガイドAirflow 2.0 migration ガイド
Airflow 2.0 migration ガイド
 
Web Privacy Survival Guide
Web Privacy Survival GuideWeb Privacy Survival Guide
Web Privacy Survival Guide
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
 
GCSでstatic web hosting
GCSでstatic web hostingGCSでstatic web hosting
GCSでstatic web hosting
 
Dockerだけではないコンテナのはなし
DockerだけではないコンテナのはなしDockerだけではないコンテナのはなし
Dockerだけではないコンテナのはなし
 
RealSenseを使ってCrazyflieを自律飛行させてみた
RealSenseを使ってCrazyflieを自律飛行させてみたRealSenseを使ってCrazyflieを自律飛行させてみた
RealSenseを使ってCrazyflieを自律飛行させてみた
 
KINECT WITH ROS
KINECT WITH ROSKINECT WITH ROS
KINECT WITH ROS
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Hadoopことはじめ
HadoopことはじめHadoopことはじめ
Hadoopことはじめ
 
データファースト開発
データファースト開発データファースト開発
データファースト開発
 
Spark Summit 2015 参加報告
Spark Summit 2015 参加報告Spark Summit 2015 参加報告
Spark Summit 2015 参加報告
 
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
 
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
 
自動テストのすすめ
自動テストのすすめ自動テストのすすめ
自動テストのすすめ
 

Airflowを広告データのワークフローエンジンとして運用してみた話

  • 1. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved Airflowを広告データのワークフローエンジンとし て運用してみた話
 2020.01.24 大規模データ集積/分析基盤 Meet-up! 
 Katsunori Kanda @ Dentsu Digital 

  • 2. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 神田 勝規(かんだかつのり)
 
 サイトリライアビリティエンジニア
 2018年 電通デジタル入社
 
 Twitter/Github @potix2 
 Shibuya.lisp 第2期運営でした 
 
 OS・分散システムをチョットわかる 
 仕事で使う言語: golang/python 
 Vimmer(;と:はスワップする派) 
 
 いまやっていること
 広告配信実績データ基盤の開発・運用 
 社内の開発基盤の整備 
 2
 自己紹介

  • 3. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 アジェンダ
 ● Airflowとは
 ● Airflow導入のきっかけ
 ● Airflowクラスターの構築方法
 ● 実際に運用しておきた問題
 ● 今後の改善点
 ● まとめ

  • 4. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflow導入のきっかけ

  • 5. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowの導入以前・・・
 
 ● 社内のいくつかのチームがそれぞれの方法でワークフロー組んでいた
 ○ Digdagサーバー
 ○ Treasure DataのDigdagサーバー
 ○ 野良EC2インスタンス
 ● インフラの面倒を見れるエンジニアが非常に少ない

  • 6. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowの導入以前・・・
 データサイエンティスト 
 BIエンジニア
ソフトウェア
 エンジニア
 DevOps
 エンジニア
 EC2
 EC2

  • 7. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowの導入以前・・・
 
 プロジェクトごとに
 異なるワークフロー管理
 少人数で運用・監視を
 サポートするには効率が悪い

  • 8. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflow導入の背景
 そんなにこだわりをもって
 選定されている訳ではない・・・
 
 本業は別で、
 ワークフロー構築には労力を割きたくない

  • 9. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved

  • 10. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflow導入の背景
 利用者が納得できるデフォルトの選択肢を提供
 ● Airflowでワークフローを構築するプロジェクトが増加
 ● 社内での知見共有が活発になった
 ○ 社内でのAirflow勉強会の開催
 ○ Airflowエバンジェリストが爆誕
 ○ 技術ブログにも記事が投稿されるように

  • 11. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 どうしてAirflowを選択したのか?

  • 12. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 デフォルトのワークフロー環境を選択する際に重視したこと
 ● AWS環境で動かせる
 ● 運用の手間がかからない
 ● ポータビリティが高い
 ○ BigQueryの利用が増えているのでGCP環境へワーク フローを移行することを視野にいれる

  • 13. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 AWS Glueも検討したものの・・・
 ● 運用の手間: ◎ ● ポータビリティ: × ● 機能が充実: DataCatalogやCrawlerなど ○ 必要なのがワークフローエンジンだけならデメリット ○ Crawlerは便利だがAWSに閉じている
  • 14. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 GCPへの移行を視野にいれると
 Airflowの一択
 (Cloud Composerを使いたい)

  • 15. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 問題なのは、
 AWS環境に「どうやって」Airflowを構築するのか?

  • 16. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Amazon EKS vs AWS Fargate

  • 17. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 結論・・・
 ● AWS Fargateを採用した
 ● 理由: ○ AWS Fargateでのサービス運用経験があった ○ Kubernetesの運用をしたくなかった ■ 少人数の運用チームには荷が重い ○ 構築の手間に大きな差はない 既にKubernetesの運用体制があるならEKSという選択肢もあり 

  • 18. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowクラスターの構築方法

  • 19. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Apache Airflowとは?
 ● Pythonで記述されたワークフローの実行・監視ツール
 ○ ETLや機械学習タスクが実行される
 ● Apacheトップレベルプロジェクトの一つ
 ○ コントリビューター:1,000+
 ○ スターの数: 15,000+

  • 20. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowのワークフローを構成するコンセプト(1/2)
 ● DAG:タスクの実行順序を決定するグラフ
 ● Operator:テンプレート化された実行単位
 ● Task:パラメータが与えられたオペレータ
 A C B D Operators
 (Python, HTTP, Docker, S3, 
 Kubernetes, etc…)
 DAG
 Task

  • 21. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowのワークフローを構成するコンセプト(2/2)
 
 ● Task Instance:特定の実行に関連づけられたTask
 ● Executor:Task Instanceの実行を開始する仕組み
 ○ LocalExecutor
 ○ CeleryExecutor
 ○ など
 https://airflow.apache.org/docs/stable/concepts.html#task-lifecycle Task Lifecycle

  • 22. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 AWS Fargateで動かす

  • 23. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 AZAZ AWS Fargateのアーキテクチャとコンセプト
 Task Container Service サービス定義
 ● どのタスク定義を使うか? 
 ● レプリケーションの数 
 ● ロードバランサーとの接続設定 
 ● サービスディスカバリーの設定 
 タスク定義
 ● どのコンテナを使うか? 
 ● 割り当てリソース(CPU/メモリ等) 
 ECR Task Container pull
pull
 deployment

  • 24. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 AirflowをAWS Fargateで動かす
 ● docker-airflowを利用した
 ○ URL: https://github.com/puckel/docker-airflow 
 ● CeleryExecutorを利用
 ● DAGはs3に配置しサイドカーコンテナで同期
 ● AWS Fargateで動かすために作成したもの
 ○ サービス定義
 ■ web/scheduler/worker/flower
 ○ タスク定義
 ■ コンテナは共通でCMDのオプションと環境変数を調整
 ○ S3同期用のコンテナイメージ
 ■ AWS CLIが使えるコンテナを作成
 ■ aws s3 syncを定期実行

  • 25. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 全体の構成

  • 26. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 DAGの開発フロー

  • 27. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 ● LocalExecutorを利用
 ● docker-composeを使って本番と同じイメージを使う
 ○ https://github.com/puckel/docker-airflow/blob/master/docker-co mpose-LocalExecutor.yml ○ ECRからイメージ取得するように修正する
 DAGの開発
 % $(aws ecr get-login --no-include-email --region ap-northeast-1) 
 % docker-compose -f docker-compose-LocalExecutor.yaml up 

  • 28. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 DAGの開発:ローカル環境で確認すべきこと
 ● 文法チェック
 ● ライブラリの依存関係のチェック
 ○ 依存関係に問題があるとimportでこける(Broken DAG)
 ● Connections/Variablesへの依存

  • 29. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 実際に運用しておきた問題

  • 30. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 依存ライブラリのコンフリクト
 ● 現象 ○ PythonOperatorから使うライブラリとAirflowが依存しているライブラリ が被ると動かない場合がある ○ 依存ライブラリのコンフリクトすると原因究明に少し手間取る ○ DAGが正常に認識されない形で現れる ● 回避方法 ○ PythonVirtualenvOperatorを使う方法があるがC拡張のライブラリは入 らない ○ DockerOperatorなど外部リソースをキックする形にしたほうがよい

  • 31. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Airflowのバージョンアップが面倒
 ● 現象 ○ リビジョン番号をあげた場合でも互換性がないときがある ○ 1.10.2 -> 1.10.3 のバージョンアップ時に設定ファイルに互換がなかっ た ● 回避策 ○ Airflowのバージョン管理はdocker-airflowプロジェクトにまかせる ○ Dockerfile内の設定ファイルを直接編集しない ○ 環境変数でパラメータ上書きする

  • 32. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 Webサーバーが再起動できなくなる
 ● 現象 ○ DAGの読み込み時間がかかりすぎるとLBのヘルスチェックでこける ● 回避策 ○ DAGの定義に重い処理をかかない ○ サービス定義のヘルスチェック猶予期間を伸ばす def task_handler(ds, **kwargs): # 何か重い処理 <-- OK ... return # 何か重い処理 <-- NG op1 = PythonOperator( task_id=’op1’, provided_context=True, python_callable=task_handler, dag = dag, )
  • 33. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 schedulerの突然死
 ● 原因 ○ ログが溢れる ○ CPU/メモリのオーバーコミット ● 回避策 ○ タスク定義のヘルスチェックを適切に設定(WIP) ○ unhealthyになったときschedulerが自動でリプレイスされるようになる
  • 34. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 今後の改善点

  • 35. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 今後の改善ポイント
 ● schedulerのSPOF解消
 ○ タスク定義のヘルスチェック設定を変更
 ○ CLIからヘルスチェックする機能の追加が必要かも
 ○ 参考: https://github.com/apache/airflow/pull/6277
 ● DAGファイルの同期にタイムラグを無くす
 ○ S3イベントを使って同期処理するサイドカーを開発する
 ● CLIが使えない
 ○ AWS SSM Agentをコンテナ内に配置する

  • 36. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 まとめ

  • 37. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 まとめ
 ● デフォルトワークフローエンジンとしてAirflowを導入した
 ● AWS Fargate上にAirflowクラスターを構築
 ○ docker-airflowを利用
 ○ ECSへのデプロイ設定を作成
 ● 実際に運用が開始されるとさまざまな問題が発生
 ○ インフラ構築・運用にまつわる問題
 ○ DAGの書き方に起因する問題

  • 38. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
 電通デジタルでは、
 大規模データを一緒に処理してくれる仲間を探しています!
 詳しくは、こちらまで。 
 関連資料:
 ● AWSを活用した少人数チームのためのコンテナデプロイ戦略 @ DevOps Days Tokyo 2019 
 ● 新米Pythonistaが贈るAirflow入門&活用事例紹介 @ PyCon JP 2019
 ● BigQueryで傾向スコア分析 @ DentsuDigital Tech Blog