More Related Content Similar to Airflowを広告データのワークフローエンジンとして運用してみた話 (20) More from Katsunori Kanda (14) Airflowを広告データのワークフローエンジンとして運用してみた話2. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
神田 勝規(かんだかつのり)
サイトリライアビリティエンジニア
2018年 電通デジタル入社
Twitter/Github @potix2
Shibuya.lisp 第2期運営でした
OS・分散システムをチョットわかる
仕事で使う言語: golang/python
Vimmer(;と:はスワップする派)
いまやっていること
広告配信実績データ基盤の開発・運用
社内の開発基盤の整備
2
自己紹介
5. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
Airflowの導入以前・・・
● 社内のいくつかのチームがそれぞれの方法でワークフロー組んでいた
○ Digdagサーバー
○ Treasure DataのDigdagサーバー
○ 野良EC2インスタンス
● インフラの面倒を見れるエンジニアが非常に少ない
10. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
Airflow導入の背景
利用者が納得できるデフォルトの選択肢を提供
● Airflowでワークフローを構築するプロジェクトが増加
● 社内での知見共有が活発になった
○ 社内でのAirflow勉強会の開催
○ 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に閉じている
17. Copyright(C)2020 DENTSU DIGITAL. All Rights Reserved
結論・・・
● AWS Fargateを採用した
● 理由:
○ AWS Fargateでのサービス運用経験があった
○ Kubernetesの運用をしたくなかった
■ 少人数の運用チームには荷が重い
○ 構築の手間に大きな差はない
既にKubernetesの運用体制があるならEKSという選択肢もあり
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
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を定期実行
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への依存
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が自動でリプレイスされるようになる
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をコンテナ内に配置する
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