Download - Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
takemikami’s note– http://takemikami.com/
三上威 (フリーランスITエンジニア)twitter:@takemikami
マーケティングデータ分析基盤技術勉強会
『ApacheAirflow入門』ApacheAirflowの概要・Airflowによるジョブ実行と利用シーン
1
Airflow
2017.3.16株式会社フロムスクラッチ社内勉強会
Copyright(C)2017TakeshiMikami.Allrightsreserved.
フロムスクラッチ社内勉強会
takemikami’s note– http://takemikami.com/
はじめに
• 本勉強会では、Airflowの以下の点についてお話しします。– ApacheAirflowの概要と特徴の紹介– Airflowでの簡単なワークフローを実行方法– Airflowの特徴を活かせる利用シーンの紹介
2Copyright(C)2017TakeshiMikami.Allrightsreserved.
本勉強会で説明する内容の概要を示します。
Python言語で定義したワークフローをスケジュール・モニタリングするプラットフォーム
ApacheAirflowとは
takemikami’s note– http://takemikami.com/
アジェンダ
• ApacheAirflowとは– ApacheAirflowとは– ApacheAirflowの特徴– いわゆるジョブ管理ツールとの違い– 類似ツールの紹介
• ApacheAirflowでのジョブ実行– Airflowのセットアップ– AirflowのUI– デモ
• ApacheAirflowの利用シーン– レポーティングでの利用イメージ– 機械学習での利用イメージ
3Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflow入門のアジェンダを示します。
takemikami’s note– http://takemikami.com/Copyright(C)2017TakeshiMikami.Allrightsreserved. 4
ApacheAirflowとは
• ApacheAirflowとは• ApacheAirflowの特徴• いわゆるジョブ管理ツールとの違い
• 類似ツールの紹介
takemikami’s note– http://takemikami.com/
ApacheAirflowとは
• Python言語によるタスクのワークフロー定義
• 依存関係に基づいたジョブの実行• ワークフロー管理のためのUI提供
– パイプラインのヴィジュアライズ– プロセスのモニタリング
5Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
ApacheAirflowの紹介をします。
Python言語で定義したワークフローをスケジュール・モニタリングするプラットフォーム
takemikami’s note– http://takemikami.com/
ApacheAirflowの特徴
• タスクの依存関係をPython言語で定義・管理– 特別な記法の習得が不要– ワークフローの定義を、SCMで管理しやすい
• タスクの依存関係に基づいたワークフローの動的生成– タスクの要求変換の対応が容易
• タスクの実行ログの管理と再実行– 未実行のタスクのみ実行するスケジュールが可能
6Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
Airflowの主な特徴について説明します。
takemikami’s note– http://takemikami.com/
タスクの依存関係の考え方
• 「売上」「商品原価」「媒体別広告費」→「広告効果レポート」ワークフローの依存関係は、以下の2つになる
7Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
タスクの依存関係の考え方の整理します。
広告費集計
媒体商品別広告費
広告効果集計
広告効果レポート
売上
商品原価
媒体B広告費
媒体A広告費
利益計算商品別利益
依存関係
依存関係
takemikami’s note– http://takemikami.com/
ワークフロー動的生成の基本: DAG(有向非巡回グラフ)
• DAG(DirectedAcyclicGraph,有向非巡回グラフ)であれば、タスクの依存関係はトポロジカルソートで解決できる
• DAGとはCycle(閉路)を持たない有向グラフのこと
8Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
ワークフローの動的生成に関する用語について整理します。
DAGの例:
211
510
9
7 8
3
Cycleの例:
211
510
9
7 8
3
Cycle
→依存関係を解決可能 →依存関係を解決できない
takemikami’s note– http://takemikami.com/
ワークフロー動的生成の基本: トポロジカルソート
• トポロジカルソートとは、DAGの各nodeを「どのnodeもその被依存nodeより前にあるように」並べること。
9Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
ワークフローの動的生成に関する用語について整理します。
トポロジカルソートの結果:・ 7,5,3,11,8,2,9,10(見た目において左から右、上から下への順)・ 3,5,7,8,11,2,9,10(数値的に小さなノードを前に持ってくる)・ 3,7,8,5,11,10,2,9・ 5,7,3,8,11,10,9,2(辺の数が少ないノードを前に持ってくる)・ 7,5,11,3,10,8,9,2(辺の数が多いノードを前に持ってくる)・ 7,5,11,2,3,8,9,10
※Wikipediaから (https://ja.wikipedia.org/wiki/トポロジカルソート )
7 5 3
11 8
2 9 10
takemikami’s note– http://takemikami.com/
未実行のタスクのみを実行する仕組み
• Airflowでは依存関係・実行ログの情報を元に、必要なタスクのみをスケジュールして実行出来る
10Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
Airflowで未実行のタスクのみを実行する仕組みを説明します。
7 5 3
11 8
2 9 10
2のスケジュール: 9のスケジュール:
7 5 3
11 8
2 9 10
7 5 3
11 8
2 9 10
2の実行後:
→7,5,11の実行は不要
takemikami’s note– http://takemikami.com/
いわゆるジョブ管理ツールとの違い
• もっとも大きな違いは、「タスクの依存関係に基づいてワークフローを動的に生成」
• メリット:要求出力ごとのワークフローの定義が不要→要求出力の変化が激しい処理に対応しやすい※レポーティングや機械学習の前処理など
• デメリット:ワークフローを事前に計画しにくい→処理完了時間の要求がシビアなものに適用しにくいインフラのリソースプランニングが難しい
11Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
WebSAM JobCenterやJP1などのジョブ管理ツールとの違いを説明します。
takemikami’s note– http://takemikami.com/
類似ツールの紹介
• Spotifyluigi (python)https://github.com/spotify/luigi
• PinterestPinball(python)https://github.com/pinterest/pinball
• TresureData digdag (java)https://github.com/treasure-data/digdag
• Rukawa (ruby)https://github.com/joker1007/rukawa
• mario (sacala)https://github.com/intentmedia/mario
12Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowとは
Airflowに似たツールの紹介です。
Airflowと同様の問題を解決する、類似ツールがいくつかあります。
takemikami’s note– http://takemikami.com/Copyright(C)2017TakeshiMikami.Allrightsreserved. 13
ApacheAirflowでのジョブ実行
• Airflowのセットアップ• AirflowのUI• DAGと依存関係の定義• サンプルワークフローの実行
takemikami’s note– http://takemikami.com/
Airflowのセットアップ
• Airflowは以下の流れでセットアップします。※Pythonがセットアップ済みの前提です。(Python 3.5.2::Anaconda4.1.1(x86_64)で確認)– インストール
– 作業ディレクトリの作成
– データベースの初期化
– UI起動
14Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
Airflowのセットアップ手順を示します。
$pipinstallairflow
$mkdir ~/airflow_home &&cd$_$exportAIRFLOW_HOME=`pwd`
$airflowinitdb
$airflowwebserver-p8080
takemikami’s note– http://takemikami.com/
AirflowのUI
15Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
AirflowのUIを紹介します。
依存関係の定義一覧: DAG: 処理結果ツリー:
処理結果ガントチャート:
takemikami’s note– http://takemikami.com/
DAGの定義
• 以下の流れでDAGを定義します。– DAG用ディレクトリの作成
– 「$AIRFLOW_HOME/dags/」配下にpythonでDAGを定義します※dags配下をgitなどで管理しておくと便利
16Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
DAGの定義方法を示します。
$cd$AIRFLOW_HOME$mkdir $AIRFLOW_HOME/dags
takemikami’s note– http://takemikami.com/
シンプルな(単一タスクの)DAGを定義
17Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
シンプルなDAGの定義です。 ($AIRFLOW_HOME/dags/original_dag1.py)
frombuiltins importrangefromairflow.operators importBashOperator,DummyOperatorfromairflow.models importDAGfromdatetime importdatetime,timedelta
args ={'owner':'airflow','start_date':datetime.combine(datetime.today()- timedelta(1),datetime.min.time()),
}
dag=DAG(dag_id='simple_dag',default_args=args,schedule_interval='00***',dagrun_timeout=timedelta(minutes=60))
last_task =DummyOperator(task_id='last_task',dag=dag)
if__name__=="__main__":dag.cli()
DAGの定義
タスクの定義
初期パラメータの定義
takemikami’s note– http://takemikami.com/
依存関係の追加
18Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
シンプルなDAGの定義です。 ($AIRFLOW_HOME/dags/original_dag2.py)
※省略※
last_task =DummyOperator(task_id='last_task',dag=dag)
before_task =BashOperator(task_id=’before_task',bash_command='echobeforetask',dag=dag)
last_task.set_upstream(before_task)
※省略※
• 先行タスクを追加し、依存関係を設定します
タスクの定義
依存関係の定義DAG:
takemikami’s note– http://takemikami.com/
サンプルワークフローの実行 1/3
19Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
サンプルのワークフローを実行してみます。
• 以下のサンプル「example_bash_operator」を実行していきます
• 「runme_1」 3/1分の実行
DAG:
$airflowrunexample_bash_operator runme_12017-03-01
takemikami’s note– http://takemikami.com/
サンプルワークフローの実行 2/3
20Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
サンプルのワークフローを実行してみます。
• 以下のように次々と実行していきます$airflowrunexample_bash_operator also_run_this 2017-03-02$airflowrunexample_bash_operator runme_12017-03-03$airflowrunexample_bash_operator runme_02017-03-04
結果のツリービュー:
実行したものが処理済みになる
takemikami’s note– http://takemikami.com/
サンプルワークフローの実行 2/3
21Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowでのジョブ実行
サンプルのワークフローを実行してみます。
• 3/1〜5の抜けているところを埋めるように実行します。$airflowbackfillexample_bash_operator -s2017-03-01-e2017-03-05
結果のツリービュー:実行前
歯抜け部分が処理済みになる
takemikami’s note– http://takemikami.com/Copyright(C)2017TakeshiMikami.Allrightsreserved. 22
ApacheAirflowの利用シーン
• レポーティングでの利用イメージ
• 機械学習での利用イメージ
takemikami’s note– http://takemikami.com/
追加部分
レポーティングでの利用イメージ
• レポート追加は「タスク追加」「依存関係追加」でワークフローを実現
23Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowの利用シーン
レポーティングでの適用イメージを示します。
広告費
集計
媒体商品別
広告費
広告効果集計
広告効果
レポート
売上
商品原価
媒体B広告費
媒体A広告費
利益計算商品別
利益
キャンペーン効果集計
キャンペーン効果レポート
キャンペーン
コスト
依存関係追加タスク追加
takemikami’s note– http://takemikami.com/
機械学習での利用イメージ 1/3
• 例えば、商品カテゴリ毎の購入商品点数で性別を予測したい。– 特徴量(説明変数): 商品カテゴリ毎の購入商品点数– 目的変数: 性別
24Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowの利用シーン
機械学習での適用イメージを示します。
性別 電化製品 キッチン用品
ベビー用品
アパレル カー用品 食品
男性 3 0 0 2 8 0
女性 0 5 5 0 0 0
? 3 1 0 1 1 4
? 1 0 0 0 0 8
目的変数 商品カテゴリ毎の購入商品点数
特徴量
takemikami’s note– http://takemikami.com/
機械学習での利用イメージ 2/3
• 配達希望日も特徴に加えた方が予測精度が上がるのでは?– 特徴量(説明変数): 商品カテゴリ毎の購入商品点数+配達希望日– 目的変数: 性別
25Copyright(C)2017TakeshiMikami.Allrightsreserved.
ApacheAirflowの利用シーン
機械学習での適用イメージを示します。
性別 電化製品 キッチン用品
ベビー用品
アパレル カー用品 食品 平日 休日
男性 3 0 0 2 8 0 0 9
女性 0 5 5 0 0 0 5 1
? 3 1 0 1 1 4 1 8
? 1 0 0 0 0 8 7 1
目的変数 商品カテゴリ毎の購入商品点数 配達希望日
特徴量