Upload
oss
View
1.377
Download
0
Embed Size (px)
DESCRIPTION
Japanese presentation for Asakusa Framework
Citation preview
Hadoopでの基幹バッチ処理を実現する Asakusaフレームワーク
ご説明資料
110701 1 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
Rev. 1.0
2011/7/1
OSSラボ株式会社
Asakusaの目的
基幹バッチ処理をHadoop上で、開発・実行・運用すること Hadoop上で基幹バッチ処理を動かすことの狙い →バッチ処理時間の短縮 バッチ処理の短縮で何が可能になるのか
①今まで時間的な制約できなかった処理を何度も行うことができる 月次・週次での処理を日次で行える。可能であれば「即時処理」 シミュレーション・確定処理・クレンジング・引当・受発注・在庫管理・予測処理
②時間的に処理が不能であったデータも処理をする 13か月実績推定から100カ月超のデータも取り込む データ種が異なるデータもまとめて処理にかけ
③無駄な時間がなくなり、運用のコストが劇的に下がる 夜間バッチをなくして、運用監視の人的なコストを下げる
2 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
基幹バッチ処理の特徴
Hadoopがよく使われるBI/分析系との比較でいうと・・・ ①データの種類が多い。
4-5種類は通常にある。多い時は20-30のデータ種を一気に処理することは普通にある。
複数の入力から多数の中間データを生成し、複数の出力を行う フラグの違いだけといった同じようだが、微妙に違うデータ種類が混在する
②演算処理の組み合わせは単純 四則演算やパターンマッチング、フラグ判断が多い 条件分岐と演算が組み合わさることも多い
③データフローが複雑 条件分岐・コントロールブレイク・ネスト処理
IF文のネスト 条件にヒットした段階で処理を変更するフロー
④設計が重要 基幹業務のため規模が大きく、ウォーターフォール型でチーム開発する
3 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
Hadoopに何がたらないか?
基本的にBI/分析系の用途を前提の仕組みなっているので、基幹バッチ処理開発に足りない部分が多い
非同期分散並列処理に適用できる設計モデルがない ウォーターフォール型大規模チーム開発の手法がない MapReduceの実装ができる技術者の絶対数が足りない テストツールが貧弱 複雑なジョブネットを管理できる実行運用環境が貧弱 基幹システムに要求されるデータの一貫性を保証する仕組みがない
4 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
Asakusaの位置づけ 基幹バッチ処理向けのHadoopの上位層
5 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
Core・HDFS・MapReduce
Pig Hive
Oozie MonkeyMagicなど ジョブ管理システム
実行 運用 環境
開発 環境
分散 処理 基盤
基幹バッチ向け BI/分析系向け 上位の開発方法論から、実
装フレームワーク コンパイラ・データモデリング・テストツール・運用連携 まで含む「フル・スタック」の
フレームワーク
MapReduceに精通した技術者でなくても、容易に開発でき、従来のエンタープライズJava開発環境以上の 開発効率を実現
基幹バッチ向けにHadoopを補完するAsakusa
Hadoopの問題点 Asakusaによる解決
110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved 6
非同期分散並列処理に適用できる設計モデルがない
ウォーターフォール型大規模チーム開発の手法がない
MapReduceの実装ができる技術者の絶対数が足りない
テストツールが貧弱
複雑なジョブネットを管理できる実行運用環境が貧弱
基幹システムに要求されるデータの一貫性を保証する仕組みがない
DAG(有向性非循環グラフ)による設計モデル
多層DSLによるAshigelコンパイラとModelGenarator
予め用意された演算子
Ashigelコンパイラに組み込まれたテストツール
MonkeMagic等のワークフロー管理ツールと連携
ThunderGateにより、MySQLを永続化データストアとして利用
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
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
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
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
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
DAGベースの多層DSL構造 構造化を行う多層管理DSL
3層のDSL BatchDSL・最上位のバッチを記述言語 FlowDSL・バッチのビルディングブロックを記述する言語 OperatorDSL・処理の最小単位を記述言語
ビルディングブロックの構成により処理フローの記述 フロー部品を構成的・多層的に構築する
Replace(可換性)の向上 変更への強化 再利用性の向上 見通しの良さと品質の確保
トランザクション管理~ロールバック制御 TXをDSLで指定することで、データをDBに保全する
必要に応じてロールバックする 単位はMRではなく、その上位の業務の塊で処理する データのリカバリー・配布まで制御
12 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
BatchDSLの例 バッチの記述例~BatchDSL
とりあえず何も考えなくても書ける フローの組み合わせを記述していく
13
バッチクラスを作成して 内部で、下位のDSLで作成したjobフローを連結して、記述する。
110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
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
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
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
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
準備されている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
テスト環境
19 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
テストモジュールは各DSL単位で自動生成
モデル・ジェネレーターからはExcelのテストシートが自動生成される データモデルの生成と同時にテストシートが生成 テストシートの項目を埋める事により、テスト内容を作成していく
20
作成したフロー部品単位やジョブフロー単位でのテストドライバーも自動生成される。 普通にJUnitから実行可能
BatchDSL FlowDSL OperatorDSL でそれぞれテストツールが提
供される すべてJUnitから実行可能
110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
設計モデル
一連の非同期処理をどのように実装するか プロセスの設計
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
実際どんなものか?
基幹バッチ処理の例~一部抜粋
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
さらにブレイクダウンする
多層構造になっているのが普通
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
実行運用環境
Asakusaの実行時構成イメージ
24
最上位でのバッチ実行・監視 Jobネットが複数の
jobに展開される TRX制御 バウンダリー管理
HadoopJobの 実行管理
Hadoopとの IO管理
MapReduce 実体
JarFile
110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
データの永続化
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
ThunderGate ジョブフローごとにデータを永続化 RDBMSとHadoopクラスター間でデータのやり取りや、障害時のリカバリー、DBサーバーとHDFS上の不要になったファイルを削除する機能も備えている
対応するRDBMSはMySQLであるが、今後Oracle等他のRDBMSに対応して行く予定
26 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
ジョブ管理ツール
運用ツール 現時点ではデフォルトは、MonkeyMagic
1. Hadoopクラスターの実績 2.動的な言語の特性を活かして、制御できるアイテムが自由
Rubyの特性を活かしている
Asakusa自体にはexperimental shell scriptを準備 拡張して、運用ツールと連携できる OSSなので自分でスクリプト生成を書くことも可能 自分用のjobコントロールスクリプトも作成可能 他の運用・監視用ツールとの連携も可能
27 110701 Copyright 2011(C) OSS Laboratories Inc. All Rights Reserved
ワークフローの自動生成
# 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