asakusa framework 演算子の処方箋
DESCRIPTION
Asakusa Framework 演算子の処方箋 です。TRANSCRIPT
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 : 演算子について理解する。 ( 演算子リファレンスの読み方を理解する )