Asakusa Framework 演算子の処方箋

Preview:

DESCRIPTION

Asakusa Framework 演算子の処方箋 です。

Citation preview

2014/1/29 平松 雅宏

演算子の処方箋

自己紹介

職業 : ITエンジニアという名のなんでも屋。 ( 今日は、個人的な立場で本イベント参加 ) 近況 : Hadoopを(中心に)見たり、さわったり、構築したりしています。 Asakusa Frameworkとの出会い : 1年ほど前に、同僚から紹介されて知りました。 ↓ MapReduceを書きたくなかったので、 DSLでデータフローを記述すれば良いと言われ、喜びました。 ↓ DSLをJavaで記述しなくてはいけないと知り、少し悲しくなりました。 ( でも、MapReduceで書くよりは良いし、バッチ処理って他のツールでは扱いにくいから、と思い、ちょっと勉強 )

↓ しかし、Hishidamaさんがなんとかしてくれるみたいで、少し立ち直りました。

1

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

2

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

3

Asakusa Frameworkの開発環境の作り方

Jinrikisha(人力車)を使う方法が簡単です。

Jinrikishaは、Asakusa Framework開発環境用のインストーラパッケージです。

以下のソフトウェアをインストールしてくれます。

(1)Apache Maven

(2)Apache Hadoop

(3)Eclipse

(4)Asakusa Framework

以下のURLからダウンロードできます。 http://asakusafw.s3.amazonaws.com/documents/jinrikisha/ja/html/index.html

( Googleで、asakusa framework jinrikisha と検索すると、最初に出てきます。)

※ 個別にインストールする手順もあります。 [Asakusa Framework スタートガイド]

http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/introduction/start-guide.html

4

Asakusa Frameworkの開発環境の作り方

Jinrikisha(人力車)を使う際のご注意

・ 事前にJDK($JAVA_HOME)のインストールが必要です。

・ インターネット接続環境が必要です。

5

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

6

サンプルを使って演算子を理解しよう

AsakusaFrameworkのサンプルを使います。

7

ゴール設定 1 : サンプルからAsakusaのバッチ開発の流れを理解する。

ゴール設定 2 : 演算子について理解する。 ( 演算子リファレンスの読み方を理解する )

Asakusaの開発の流れ

サンプルをながめる前に、Asakusaの開発の流れについて

[1] Batch DSL

[2] Flow DSL

[3] Operator DSL 3つのDSL(+DMDL)を定義・実装していくことになります。

8

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義

2 Flow データフロー(ジョブフロー)を定義 ( 実装したOperatorを呼び出す役割 )

3 Operator データモデルの操作 (分岐/加工/集計/更新 etc …)を定義

4 DMDL バッチ処理内で使用するデータモデルを定義 ( データモデルのJavaクラスは自動生成 )

サンプルの入出力データモデル

サンプル : 商品のカテゴリ別の売上集計

9

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

入力データモデル(CSV)

店舗マスタ

店舗コード

店舗名称

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

出力データモデル(CSV)

サンプルのデータフローを考える

データフローを考えよう。

10

売上明細…

売上日時

店舗コード

商品コード

店舗マスタ

店舗コード

店舗名称

商品マスタ…

商品コード

商品名

カテゴリコード

カテゴリ別売上集計 …

カテゴリコード

販売数量

売上合計

エラー情報 …

店舗コード

商品コード

エラーメッセージ

⑤ 操作:集計

操作:エラーチェック

操作:結合

Asakusa DSLで定義することを考える

各DSLで必要な定義項目を考えよう。

11

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義 バッチ:カテゴリ別売上集計ジョブの呼出

2 Flow データフロー(ジョブフロー)を定義 フロー:各操作の呼出

3 Operator (演算子)

データモデルの操作 (分岐/加工/集計/更新 etc …)を定義 操作:エラーチェック処理 操作:結合処理 / 集計処理

4 DMDL バッチ処理内で使用するデータモデルを定義 ① 売上明細 ② 店舗マスタ ③ 商品マスタ ④ エラー情報 ⑤ カテゴリ別売上集計

DMDLの定義をながめる

各DSLの定義例 ( DMDL編 –[売上明細]の場合 )

12

■ POINT1 DMDLは拡張子が.dmdlであれば、 どんな名前でも良い。 ■ POINT2 1つのdmdlファイルに 複数のデータモデルを定義可能

■ POINT3 DMDLからコード生成は、 pom.xmlから[右クリック]で。

演算子の定義方法について考える

各DSLの定義例 ( Operator編 )

13

Q1. エラーチェック処理と、集計処理はどうやって実装すれば良いか?

A1. 演算子(Operator)を使って、データモデルを操作して、実装します。

Q2. どのような演算子(Operator)があるのか?

演算子のご紹介

14

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

演算子の定義方法について考える

各DSLの定義例 ( Operator編 )

15

Q1. エラーチェック処理と、集計処理はどうやって実装すれば良いか?

A1. 演算子(Operator)を使って、データモデルを操作して、実装します。

Q2. どのような演算子(Operator)があるのか?

A2. たくさんあります。

では、エラーチェック処理で使う演算子は?

エラーチェック処理で使用する演算子は?

16

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

エラーチェック処理で使用する演算子は?

17

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

?

エラーチェック処理で使用する演算子は?

各DSLの定義例 ( Operator編 )

18

Q3. MasterCheck演算子を使って、売上明細のレコードから

店舗マスタに存在しないレコードだけを取り出しました。

取り出したレコードのデータモデルを、

どうやって[エラー情報]のデータモデルにマッピングしますか?

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

MasterCheck

店舗マスタ

店舗コード

店舗名称

エラーチェック処理で使用する演算子は?

19

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

エラーチェック処理で使用する演算子は?

20

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

変換演算子 (@Convert )

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

抽出演算子 (@Extract)

エラーチェック処理で使用する演算子は?

各DSLの定義例 ( Operator編 )

21

Q3. MasterCheck演算子を使って、売上明細のレコードから

店舗マスタに存在しないレコードだけを取り出しました。

取り出したレコードのデータモデルを、

どうやって[エラー情報]のデータモデルにマッピングしますか?

A3. データ操作演算子を使います。

サンプルを確認してみましょう。

エラーチェック処理のフロー

各DSLの定義例 ( Operator編 )

22

Update

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

エラー情報

ファイル名

売上日時

店舗コード

商品コード

エラーメッセージ

MasterCheck

店舗マスタ

店舗コード

店舗名称

Restructure

売上明細とエラー情報の同一カラムは自動的にマッピングする演算子

エラーメッセージを 更新する演算子

エラーチェック処理の演算子の実装

各DSLの定義例 ( Operator編 – エラーチェック処理 )

23

Point : エラーチェック処理を実現するには、複数の演算子を使用します。

1. 店舗マスタと売上明細の突合せ ( MasterCheck )

2. 1.の結果不適合なレコードを、[エラー情報]へ再構築 ( Restructure )

3. エラーレコードにエラーメッセージを設定 ( Update )

コア演算子とユーザ演算子

24

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

結合処理 / 集計処理 で使用する演算子は?

各DSLの定義例 ( Operator編 )

25

Q4. 売上明細と商品マスタからカテゴリ別売上集計を出力したい。

どの演算子を使えば実現できるか?

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

?

?

?

結合処理 / 集計処理 で使用する演算子は?

26

グループ整列演算子 (@GroupSort)

分割演算子 (Split)

チェックポイント演算子 (checkpoint)

ロギング演算子 (Logging)

空演算子 (empty)

停止演算子 (stop)

畳み込み演算子 (@Fold)

単純集計演算子 (@ Summarize )

マスタ結合演算子 (@MasterJoin)

マスタ分岐演算子 (@MasterBranch)

マスタつき更新演算子 (@MasterJoinUpdate)

マスタ確認演算子 (@MasterCheck)

分岐演算子 (@Branch)

合流演算子 (confluent)

再構築演算子 (restructure)

更新演算子 (@Update)

射影演算子 (project)

拡張演算子 (extend)

特殊演算子

フロー演算子

データ操作 演算子

結合演算子

集計演算子

グループ結合演算子 (@CoGroup)

変換演算子 (@Convert )

抽出演算子 (@Extract)

結合処理 / 集計処理 の フロー

各DSLの定義例 ( Operator編 )

27

売上明細

売上日時

店舗コード

商品コード

数量

販売単価

販売金額

ファイル名

MasterJoin summarize

商品マスタ

商品コード

商品名

商品部門コード

商品部門名

商品カテゴリコード

商品カテゴリ名

商品単価

マスタ登録日

マスタ適用開始日

マスタ適用終了日

カテゴリ別売上集計

カテゴリコード

販売数量

売上合計

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

28

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

29

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

結合処理 / 集計処理の演算子の実装

各DSLの定義例 ( Operator編 – 結合 / 集計処理 )

30

Point : 結合 / 集計処理を実現するには、以下の演算子を使用します。

1. 売上明細と商品マスタを結合します ( MasterJoin + DMDL )

2. 1.の結果から、カテゴリ別の売上を集計します( Summarize + DMDL )

Asakusa DSLで定義することを細かく考える

各DSLで必要な定義項目を考えよう。

31

# Asakusa DSL 定義すること

3 Operator (演算子)

データモデルの操作 (分岐/加工/集計/更新 etc …)を定義 操作:エラーチェック処理 MasterCheck / Restructure / Update 演算子 操作:結合処理 / 集計処理 MasterJoin / Summarize 演算子

4 DMDL バッチ処理内で使用するデータモデルを定義 ① 売上明細 ② 店舗マスタ ③ 商品マスタ ④ エラー情報 ⑤ カテゴリ別売上集計 ( summarize ) ⑥ 売上明細+商品マスタ ( joined )

Flow(ジョブフロー)の実装

各DSLの定義例 ( Flow編 – 演算子を呼び出します )

32

describeメソッドの実装 ■ POINT1 演算子はFactoryクラスを、 インスタンス化して使用します。

■ POINT2 Factoryクラスは、 自動生成されます

Flow(ジョブフロー)の実装

各DSLの定義例 ( Flowの実装の面倒なところ決まり事 )

33

■ POINT1 Flowに必要なINPUTとOUTPUTを 宣言する必要があります。

■ POINT2 Flowに必要なINPUTとOUTPUTを 実装する必要があります。

■ POINT3 salesDetail+storeInfoの結合モデルは、 ファイル出力しないから宣言不要

Batchの実装

各DSLの定義例 ( Batch編 –ジョブフローを呼び出します)

34

Asakusa DSLで定義することを細かく考える

各DSLで必要な定義項目を考えよう。

35

# Asakusa DSL 定義すること

1 Batch バッチ業務単位に使用するFlowを定義 バッチ:カテゴリ別売上集計ジョブの呼出

2 Flow データフロー(ジョブフロー)を定義 フロー:各操作の呼出 MasterCheck / Restructure / Update MasterJoin / Summarize 演算子の呼出 インポータ(INPUT) エクスポータ(OUTPUT)の実装と宣言 INPUT : ① 売上明細 ② 店舗マスタ ③ 商品マスタ OUTPUT : ④ エラー情報 ⑤ カテゴリ別売上集計

サンプルを使って演算子を理解しよう

まとめ

1.最初に、データフローを定義することから

Asakusa Frameworkの開発は始まります。

2. フローが決まれば、データモデル(DMDL)、演算子(Operator)

ジョブフロー(Flow)、バッチ(Batch)と実装していきます。

3. 演算子は多数あります。

[point1] : コア演算子/ユーザ演算子があります。

[point2] : DMDLに定義が必要な演算子もあります。

[point3] : フロー/集計/データ操作/結合演算子があります。

36

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

37

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンス

Asakusa Framework Documentationのサイトマップにリンクがあります。 (http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/index.html )

38

演算子リファレンスとの戦い方

39

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

40

演算子リファレンスとの戦い方

41

Flow DSLからUpdate演算子の呼出

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関)

各演算子の説明がありますが、読み方には心得が必要です。

まず、更新演算子(Update)を例にとってみましょう。

演算子リファレンスとの戦い方

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

42

演算子リファレンスとの戦い方

43

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

演算子リファレンスとの戦い方

44

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

演算子リファレンスとの戦い方

45

Asakusa Frameworkの演算子リファレンスを読み解こう!(最難関パート2)

各演算子の説明がありますが、読み方には心得が必要です。

次に、結合演算子(MasterJoin)を例にとってみましょう。

演算子リファレンスとの戦い方

まとめ

演算子を知るには、演算子リファレンスを読み解く必要があります。

少し敷居が高いので、サンプルなどをヒントに撃破しましょう。

Asakusa Framework Documentationのサイトマップに

サンプルプログラム集のリンクがあります。 (http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/index.html )

46

アジェンダ

[1] Asakusa Frameworkの開発環境の作り方 [2] サンプルを使って演算子を理解しよう [3] 演算子リファレンスとの戦い方 [4] まとめ

47

まとめ

48

ゴール設定 1 : サンプルからAsakusaのバッチ開発の流れを理解する。

ゴール設定 2 : 演算子について理解する。 ( 演算子リファレンスの読み方を理解する )

Recommended