apache airflow入門 (マーケティングデータ分析基盤技術勉強会)

26
takemikami’s note – http://takemikami.com/ 三上 威 (フリーランスITエンジニア) twitter: @takemikami マーケティングデータ分析基盤技術勉強会 Apache Airflow 入門』 Apache Airflowの概要・Airflowによるジョブ実行と利用シーン 1 Airflow 2017.3.16 株式会社フロムスクラッチ 社内勉強会 Copyright (C) 2017 Takeshi Mikami. All rights reserved. フロムスクラッチ 社内勉強会

Upload: takeshi-mikami

Post on 14-Apr-2017

534 views

Category:

Software


2 download

TRANSCRIPT

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

目的変数 商品カテゴリ毎の購入商品点数 配達希望日

特徴量

takemikami’s note– http://takemikami.com/

追加部分

機械学習での利用イメージ 3/3

• 特徴量の追加もレポート追加同様に、「タスク追加」「依存関係追加」で、動的にワークフローを生成

26Copyright(C)2017TakeshiMikami.Allrightsreserved.

ApacheAirflowの利用シーン

機械学習での適用イメージを示します。

売上

顧客

購入点数集計

顧客別

購入点数

予測用

データ

予測用

データ集計 学習と予測性別予測済み

顧客

配送配達日

集計

顧客別

配達日数

依存関係追加タスク追加