28
Hadoopでの基幹バッチ処理を実現する Asakusaフレームワーク ご説明資料 110701 1 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved Rev. 1.0 2011/7/1 OSSラボ株式会社

110701 asakusa説明資料

  • Upload
    oss

  • View
    1.377

  • Download
    0

Embed Size (px)

DESCRIPTION

Japanese presentation for Asakusa Framework

Citation preview

Page 1: 110701 asakusa説明資料

Hadoopでの基幹バッチ処理を実現する Asakusaフレームワーク

ご説明資料

110701 1 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Rev. 1.0

2011/7/1

OSSラボ株式会社

Page 2: 110701 asakusa説明資料

Asakusaの目的

  基幹バッチ処理をHadoop上で、開発・実行・運用すること   Hadoop上で基幹バッチ処理を動かすことの狙い →バッチ処理時間の短縮 バッチ処理の短縮で何が可能になるのか

①今まで時間的な制約できなかった処理を何度も行うことができる   月次・週次での処理を日次で行える。可能であれば「即時処理」   シミュレーション・確定処理・クレンジング・引当・受発注・在庫管理・予測処理

②時間的に処理が不能であったデータも処理をする   13か月実績推定から100カ月超のデータも取り込む   データ種が異なるデータもまとめて処理にかけ

③無駄な時間がなくなり、運用のコストが劇的に下がる   夜間バッチをなくして、運用監視の人的なコストを下げる

2 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 3: 110701 asakusa説明資料

基幹バッチ処理の特徴

  Hadoopがよく使われるBI/分析系との比較でいうと・・・ ①データの種類が多い。

  4-5種類は通常にある。多い時は20-30のデータ種を一気に処理することは普通にある。

  複数の入力から多数の中間データを生成し、複数の出力を行う   フラグの違いだけといった同じようだが、微妙に違うデータ種類が混在する

②演算処理の組み合わせは単純   四則演算やパターンマッチング、フラグ判断が多い   条件分岐と演算が組み合わさることも多い

③データフローが複雑   条件分岐・コントロールブレイク・ネスト処理

  IF文のネスト   条件にヒットした段階で処理を変更するフロー

④設計が重要   基幹業務のため規模が大きく、ウォーターフォール型でチーム開発する

3 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 4: 110701 asakusa説明資料

Hadoopに何がたらないか?

基本的にBI/分析系の用途を前提の仕組みなっているので、基幹バッチ処理開発に足りない部分が多い

  非同期分散並列処理に適用できる設計モデルがない   ウォーターフォール型大規模チーム開発の手法がない   MapReduceの実装ができる技術者の絶対数が足りない   テストツールが貧弱   複雑なジョブネットを管理できる実行運用環境が貧弱   基幹システムに要求されるデータの一貫性を保証する仕組みがない

4 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 5: 110701 asakusa説明資料

Asakusaの位置づけ   基幹バッチ処理向けのHadoopの上位層

5 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Core・HDFS・MapReduce

Pig Hive

Oozie MonkeyMagicなど ジョブ管理システム

実行 運用 環境

開発 環境

分散 処理 基盤

基幹バッチ向け BI/分析系向け 上位の開発方法論から、実

装フレームワーク コンパイラ・データモデリング・テストツール・運用連携 まで含む「フル・スタック」の

フレームワーク

MapReduceに精通した技術者でなくても、容易に開発でき、従来のエンタープライズJava開発環境以上の 開発効率を実現

Page 6: 110701 asakusa説明資料

基幹バッチ向けにHadoopを補完するAsakusa

Hadoopの問題点 Asakusaによる解決

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved 6

  非同期分散並列処理に適用できる設計モデルがない

  ウォーターフォール型大規模チーム開発の手法がない

  MapReduceの実装ができる技術者の絶対数が足りない

  テストツールが貧弱

  複雑なジョブネットを管理できる実行運用環境が貧弱

  基幹システムに要求されるデータの一貫性を保証する仕組みがない

  DAG(有向性非循環グラフ)による設計モデル

  多層DSLによるAshigelコンパイラとModelGenarator

  予め用意された演算子

  Ashigelコンパイラに組み込まれたテストツール

  MonkeMagic等のワークフロー管理ツールと連携

  ThunderGateにより、MySQLを永続化データストアとして利用

Page 7: 110701 asakusa説明資料

Asakusaフレームワーク概要

アプリモジュール/データ

アプリで仕様を 定義するもの

Asakusa 提供モジュール

フレームワーク 生成モジュール/

データ

フレームワークで仕様を

定義するもの

データフロー

入力/生成

インスタンス化

凡例

Hadoop HDFS

Hadoop MapReduce

MonkeyMagic ジョブ監視制御

MySQL

テーブル定義

マスターデータ/ トランザクションデータ

他システム連携

ユーザー I/F

DBアクセスコントロール (認証/認可/ロック/採番)

Importer/ Exporter/ Recoverer

Model Generator

モデル クラス

テストツール Template Generator Test Driver

バッチ詳細設計

バッチ定義 バッチDSL

Ashigel コンパイラ

MapReduce JOB

MonkeyMagic用JOB定義

テストデータ テスト条件

シーケンス ファイル

ThunderGate

110701 7 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 8: 110701 asakusa説明資料

Asakusaの構成   開発環境

  ModelGenerator   データ層の自動化   Writable自動生成とDSLへの組み込み

  テストとのインテグレーション   Ashigelコンパイラ

  ステージングコンパイラ   運用スクリプトの生成   多層DSLを最適なMapReduceプログラム群に生成する

  テストツール   設計モデル

  DAGベースの多層DSL構造   構造化を行う多層管理DSL   ビルディングブロックの構成により処理フローの記述

  トランザクション管理~ロールバック制御

  開発方法論まで視野

  演算処理   バッチ処理向けに用意されている演算子

  実行運用環境   ThunderGateデータ入出力管理フレームワーク   Import/Export   外部接続   API

  ジョブ管理

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved 8

Page 9: 110701 asakusa説明資料

Asakusa開発環境   既存エンタープライズJava開発の知見を活用(Eclipse/Maven上で開発)   MapReduceアプリケーションの入出力データのクラスファイルを生成する「Model Generator」、   独自のDSL(Domain Specific Language)用コンパイラである「Ashigel Compiler」、   実行ライブラリの「Rumtime Library」、   データ入出力管理フレームワークの「ThunderGate(雷門)」という四つのモジュールと、テスト環境を提供

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved 9

Page 10: 110701 asakusa説明資料

ModelGenerator

  MapReduceアプリケーションの入出力データの形式の定義   Javaの中でwritableを定義   煩雑でバグの原因となる事が多い

  「ModelGenerator」   MySQLのDDL(SQL)でTable・Viewをつくると自動的にクラスを生成

  HadoopIOは意識しなくてもよい   作ったクラスはEclipseで利用できるので、DSLで操作できる   TableからHadoopへの展開を自動化   HadoopからTableへの戻しも自動化

10 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 11: 110701 asakusa説明資料

Ashigelコンパイラ   Hadoopを利用した基幹系バッチ処理を実現するための、DSL(ドメイン特化言語)

事前 処理

残高取得処理

更新 処理

ベリファイ処理

事後 処理

BatchDSL 業務処理の流れを定義

データ 取得

データ 取得

データ 取得 再実行可能な業務トラ

ンザクション

FlowDSL 業務処理単位を汎用的処理単位に分解

ソート 処理

マージ 処理

ロジック計算

ソート 処理

それぞれの処理をDSLで記述

OperatorDSL 汎用処理単位をMap/Reduceに分解、自動生成

Map 処理

Reduce 処理

Map 処理

Reduce処理

Map/Reduce処理を自動生成

110701 11 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 12: 110701 asakusa説明資料

DAGベースの多層DSL構造   構造化を行う多層管理DSL

  3層のDSL   BatchDSL・最上位のバッチを記述言語   FlowDSL・バッチのビルディングブロックを記述する言語   OperatorDSL・処理の最小単位を記述言語

  ビルディングブロックの構成により処理フローの記述   フロー部品を構成的・多層的に構築する

  Replace(可換性)の向上   変更への強化   再利用性の向上   見通しの良さと品質の確保

  トランザクション管理~ロールバック制御   TXをDSLで指定することで、データをDBに保全する

  必要に応じてロールバックする   単位はMRではなく、その上位の業務の塊で処理する   データのリカバリー・配布まで制御

12 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 13: 110701 asakusa説明資料

BatchDSLの例   バッチの記述例~BatchDSL

  とりあえず何も考えなくても書ける   フローの組み合わせを記述していく

13

バッチクラスを作成して 内部で、下位のDSLで作成したjobフローを連結して、記述する。

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 14: 110701 asakusa説明資料

FlowDSLの例   Flowpartの記述例~FlowDSL

14

・・・・・・・・・・・・・・・・・・・・・・・・ @Override protected void describe() {

// まずは明細と商品マスタを結合 Join join = op.join(itemIn, orderIn);

// 結合に失敗したものはエラーフラグを立てて終了させておく SetStatus missing = op.setStatus(join.missed, "商品不明"); orderOut.add(missing.out);

// 結合に成功したものは注文ごとに集計 Sum sum = op.sum(join.joined);

// そのままでは使えないので、テーブルモデルに変換して出力 ToAmount result = op.toAmount(sum.out); resultOut.add(result.out);

// 不要な出力を除去 core.stop(result.original);

}

フローを記述していく Javaでの記述

DAGの実装に近い

頂点:Operator 辺:結線Obj

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 15: 110701 asakusa説明資料

FlowDSLの例   Flowpartの記述例~FlowDSL・・・その2

15

@Override protected void describe() { ReNewTxApMachingOperatorFactory f = new ReNewTxApMachingOperatorFactory(); UpdateTransactionsOperatorFactory f1 = new UpdateTransactionsOperatorFactory(); CoreOperatorFactory core = new CoreOperatorFactory();

// 伝票No設定未設定で振り分ける BranchSlipNoWithWithout bra11 = f.branchSlipNoWithWithout(inApMaching);

// 伝票No設定済に対して、前回までの突合結果区分より「計上ずれ」「不一致」とそれ以外を振り分ける BranchRecGapAndUnmatch bra12 = f.branchRecGapAndUnmatch(bra11.out2);

// 伝票情報の初期化 InitSlipInfo upd11 = f.initSlipInfo(bra12.out1);

// 請求情報の初期化 InitBillInfo upd12 = f.initBillInfo(bra12.out1);

// 伝票No設定済で前回までの突合結果区分が「計上ずれ」「不一致」以外と請求情報初期化したファイルを一つにまとめる Confluent<TxApMaching> cfl11 = core.confluent(bra12.out2, upd12.out);

// 伝票情報が入っているデータに対して、支払消込トランから赤黒ペアの未照合を抜き出す GroupSortBranchDeficitSurplusDiv grs11 = f1.groupSortBranchDeficitSurplusDiv(cfl11.out);

Operator生成

入力edge Ope固有処理

出力edge

出力edgeから入力結線

出力edge二つから入力結線

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 16: 110701 asakusa説明資料

OperatorDSLの例   最下層DSL

  DAGでいうと頂点をにあたる部分の記述   Operatorクラスを記述し、そのOperatorの処理メソッドを記述   アノテーションにより適切な挙動に制御を行い、MapReduceへ展開する

16

/** * 注文商品の情報と明細を結合する。 * @param info 注文商品の情報 * @param order 明細 * @return 結合した結果 */ @MasterJoin public abstract JoinOrder join(ItemInfo info, OrderDetail order);

/** * 明細の価格を、注文ごとに集計する。 * @param each それぞれの明細 * @return 集計した結果 */ @Summarize public abstract SumOrder sum(JoinOrder each);

/** * 集計結果をテーブルモデルに変換する。 * @param total 変換対象 * @return 変換後 */ @Convert public OrderAmount toAmount(SumOrder total) { amount.setAmount(total.getAmount()); amount.setOrderId(total.getOrderId()); return amount; }

Asakusaで準備されている演算子の アノテーションを利用して、演算子を記述する。

演算子クラスの記述で必要な要件はアノテーションごとに異なる。間違うとコンパイラに怒られる。

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 17: 110701 asakusa説明資料

OperatorDSLの例

  業務系の複雑な処理も演算子として記述可能

  例は非等価結合の演算子を作ってみたケース

  日付から有効なマスターデータを検索して、価格の結合するという処理

17

public abstract class ExampleOperator { /** * 有効なマスタを選択する。 * @param masters 選択対象のマスタデータ一覧 * @param tx トランザクションデータ * @return 実際に利用するマスタデータ、利用可能なものがない場合はnull */ @MasterSelection public ItemMst selectItemMst(List<ItemMst> masters, HogeTrn tx) { for (ItemMst mst : masters) { if (mst.getStart() <= tx.getDate() && tx.getDate() <= mst.getEnd()) { return mst; } } return null; } /** * マスタの価格をトランザクションデータに設定する。 * @param master マスタデータ * @param tx 変更するトランザクションデータ */ @MasterJoinUpdate(selection = "selectItemMst") public void updateWithMaster( @Key(group = "id") ItemMst master, @Key(group = "itemId") HogeTrn tx) { tx.setPrice(master.getPrice()); } }

条件の記述

結合の記述

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 18: 110701 asakusa説明資料

準備されているOperatorDSL

18

データ編成 CoGroup グループ結合演算子 Confluent 合流演算子 Convert 変換演算子 Duplicate 複製演算子 GroupSort グループ整列演算子 Split 分割演算子

業務系 MasterBranch マスタ分岐演算子 MasterCheck マスタ確認演算子 MasterJoin マスタ結合演算子 MasterJoinUpdate マスタつき更新演算子

Summarize 単純集計演算子

フロー制御 Branch 分岐演算子 Checkpoint チェックポイント演算子 Empty 空演算子 Identity 恒等演算子 Logging ロギング演算子 Stop 停止演算子

割と一般的な「アルゴリズム」や 処理を実装している。 ソート・マージ・分割

業務系の演算子の実装 拡張して業務フレームワークになって

いる 「マスターとの突合」処理

フロー制御のための演算子 DAGの記述をしていると発生する

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 19: 110701 asakusa説明資料

テスト環境

19 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 20: 110701 asakusa説明資料

テストモジュールは各DSL単位で自動生成

  モデル・ジェネレーターからはExcelのテストシートが自動生成される   データモデルの生成と同時にテストシートが生成   テストシートの項目を埋める事により、テスト内容を作成していく

20

  作成したフロー部品単位やジョブフロー単位でのテストドライバーも自動生成される。   普通にJUnitから実行可能

BatchDSL FlowDSL OperatorDSL でそれぞれテストツールが提

供される すべてJUnitから実行可能

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 21: 110701 asakusa説明資料

設計モデル

  一連の非同期処理をどのように実装するか   プロセスの設計

  DAGベースでの詳細ブレークダウン   構造化手法の援用

  STS分割法   モジュール強度

  SPF演算子的考え方の利用   Shortest Path First – グラフにおけるダイクストラ法による 経路計算法。

  GRASP原則の適用   General Responsibility Assignment Software Principle オブジェクト指向設計において用いられる、クラスやオブジェクトに責務を割り当てる方針を導くパターンや原則。

  データモデルの設計   静的なモデルを渡り歩くスタイル

  TXデータとマスターデータの設計

  Joinの設計が影響する   キーの扱いがポイントになるが、No_SQL系はキー付けの絶対性が低い   都度キーを生成する感じの「データモデルの変遷」になる

21 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 22: 110701 asakusa説明資料

実際どんなものか?

  基幹バッチ処理の例~一部抜粋

22

仕入データ 取り込み

残高 更新

照合 処理

仕入明細 データ

仕入返品 データ

費用振替 データ

売価変更 データ

計上済 仕入 TRN 計上済 未収収益

TRN 計上済 未払費用

TRN 更新済 買掛残高

TRN

請求TRN 支払不可 消込 TRN 支払可 消込 TRN 照合済 未払費用

TRN

請求エラーTRN

照合済 未収収益

TRN 照合済 仕入 TRN 照合済 請求 TRN

出力データ 中間TRN 入力データ 未払 計上

在庫 計測

仕入TRN

在庫振替 TRN

在庫移動 TRN

未収収益 TRN

売価変更 在庫変更

TRN

修正 在庫振替

TRN

修正 在庫移動

TRN

修正 未収収益

TRN

未払計上 TRN

4種類のデータIn

9種類のデータIn 5種類のデータIn

5種類のデータOut

4種類のデータOut 7種類のデータIn

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 23: 110701 asakusa説明資料

さらにブレイクダウンする

  多層構造になっているのが普通

23

仕入データ 取り込み

仕入明細 データ

仕入返品 データ

費用振替 データ

売価変更 データ

仕入TRN

在庫振替 TRN

在庫移動 TRN

未収収益 TRN

売価変更 在庫変更

TRN

4種類のデータIn 5種類のデータOut

データ 取り込み

クレンジング

データ 分割

データ 整形

日付 チェック

マスター チェック

付随 データ 生成

附番 データ 一次出力

Level-0

Level-1

Level-2

Level-3

階層が深くなるの普通 大抵の規模で4-5階層

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 24: 110701 asakusa説明資料

実行運用環境

  Asakusaの実行時構成イメージ

24

最上位でのバッチ実行・監視 Jobネットが複数の

jobに展開される TRX制御 バウンダリー管理

HadoopJobの 実行管理

Hadoopとの IO管理

MapReduce 実体

JarFile

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 25: 110701 asakusa説明資料

データの永続化

  TXのバウンダリーの管理

25

@JobFlow(name = "stock") public class StockJob extends FlowDescription { private In<Shipment> shipmentIn; private In<Stock> stockIn; private Out<Shipment> shipmentOut; private Out<Stock> stockOut; /** * コンストラクタ。 * @param shipmentIn 処理対象の注文情報 * @param stockIn 処理対象の在庫情報 * @param shipmentOut 処理結果の注文情報 * @param stockOut 処理結果の在庫情報 */ public StockJob( @Import(name = "shipment", description = ShipmentFromDb.class) In<Shipment> shipmentIn, @Import(name = "stock", description = StockFromDb.class) In<Stock> stockIn, @Export(name = "shipment", description = ShipmentToDb.class) Out<Shipment> shipmentOut, @Export(name = "stock", description = StockToDb.class) Out<Stock> stockOut) { this.shipmentIn = shipmentIn; this.stockIn = stockIn; this.shipmentOut = shipmentOut; this.stockOut = stockOut; }

フロー部品のInとOutの結線を外につなぐことにより、外部での永続化をサポートする。

この記述をフロー部品に組み込むことで、処理の外部接続と業務TXのバウンダリー管理を行う

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 26: 110701 asakusa説明資料

ThunderGate   ジョブフローごとにデータを永続化   RDBMSとHadoopクラスター間でデータのやり取りや、障害時のリカバリー、DBサーバーとHDFS上の不要になったファイルを削除する機能も備えている

  対応するRDBMSはMySQLであるが、今後Oracle等他のRDBMSに対応して行く予定

26 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 27: 110701 asakusa説明資料

ジョブ管理ツール

  運用ツール   現時点ではデフォルトは、MonkeyMagic

  1. Hadoopクラスターの実績   2.動的な言語の特性を活かして、制御できるアイテムが自由

  Rubyの特性を活かしている

  Asakusa自体にはexperimental shell scriptを準備   拡張して、運用ツールと連携できる   OSSなので自分でスクリプト生成を書くことも可能   自分用のjobコントロールスクリプトも作成可能   他の運用・監視用ツールとの連携も可能

27 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved

Page 28: 110701 asakusa説明資料

ワークフローの自動生成

# workflow jobnet("#{BATCH_ID_QUALIFIER}.tutorial", :instance_name => "master", :credential_name => "asakusa") do boot_jobs("order") # jobflow – order jobnet("order", :to => []) do auto_sequence jobnet("__IMPORT__") do boot_jobs("bulkloader") jobnet("bulkloader") do auto_sequence job("bulkloader.asakusa", "\"$ASAKUSA_HOME/\"bulkloader/bin/importer.sh primary asakusa tutorial order \"$($ASAKUSA_HOME/monkeymagic/bin/execution_id.sh)\"

20380101000000 \"#{BATCH_ARGUMENTS}\"", :instance_name => "asakusa", :credential_name => "asakusa") end end jobnet("__STAGE_GRAPH__") do boot_jobs("stage0001") # stage - tutorial / order / stage0001 hadoop_job_run("stage0001", "$ASAKUSA_HOME/monkeymagic/bin/hadoop_job_run.sh com.example.tutorial.batch.tutorial.order.stage0001.StageClient

\"$ASAKUSA_HOME/batchapps/tutorial/lib/jobflow-order.jar\" -D \"com.asakusafw.executionId=$($ASAKUSA_HOME/monkeymagic/bin/execution_id.sh)\" -D \"com.asakusafw.user=$USER\" -D \"com.asakusafw.batchArgs=#{BATCH_ARGUMENTS}\"", :to => ["stage0002"]) do

hadoop_job("tutorial.order.stage0001") end # stage - tutorial / order / stage0002 hadoop_job_run(“stage0002”, “$ASAKUSA_HOME/monkeymagic/bin/hadoop_job_run.sh・・・・・・・・・・・・・・

28

  運用のためにスクリプトが生成される   Ashigelコンパイラから自動生成

–  下の例は、MonkeyMagic用のrbの生成

110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved