Asakusa Framework
Asakusa Frameworkとは? Hadoop 上 で 大 規 模 な 基 幹 バッチ 処 理 を 行 うため のフレームワーク 独 自 ドメイン 特 化 言 語 (Domain Specific Language, DSL)を 使 って 処 理 を 記 述 する DSLはJavaを 元 に 作 成 されている
設 計 思 想 システムの 本 質 は 設 計 である 設 計 のないシス テムでは 品 質 は 担 保 されない 品 質 のないシステ ムは 適 切 な 価 値 を 利 用 者 に 届 けることはできな い 参 考 http://www.asakusafw.com/service/
メリット 1. 品 質 を 向 上 させる 2.システム 全 体 の 再 利 用 性 を 上 げる 3.トータルでの 開 発 効 率 を 上 げる 参 考 http://www.asakusafw.com/service/
デメリット 1.アドホックな 開 発 をベースにする 短 期 イテレー ショナルなシステム 構 築 は 対 象 外 2. 品 質 よりも 開 発 スピードを 優 先 をするシステム 開 発 は 対 象 としない 3. 設 計 能 力 のない 人 材 による 力 技 の 開 発 には 向 い ていない 参 考 http://www.asakusafw.com/service/
つまり 1. 最 近 のアジャイル 的 な 開 発 には 向 かない 2.きちんと 設 計 する 時 間 を 取 って きちんと 設 計 できる 人 が 使 わないとメリットは 得 られない 3. 大 規 模 開 発 等 で 大 量 にプログラマーを 導 入 する ような 案 件 にも 向 かないと 思 われる
アーキテクチャ 公 式 サイトから 画 像 もってきたけど いいのだろうか
開 発 者 が 気 にするのは 赤 枠 の 部 分
Asakusa Frameworkの コンポーネント 1.データモデル 定 義 DSL (DMDL) 2.Asakusa DSL 3. 外 部 システム 連 携 4.バッチ 実 行 ツール 5. 自 動 テストサポート
1.データモデル 定 義 DSL (DMDL) Data Model Definition Language (DMDL)は Asakusa Frameworkで 利 用 可 能 なデータモデルを 定 義 するためのDSLです DMDLスクリプトとい うファイルにデータモデルの 名 前 や 構 造 を 定 義 し DMDLコンパイラを 実 行 することで 定 義 し たデータモデルに 対 応 するJavaのプログラムを 自 動 的 に 生 成 します 参 考 資 料 http://asakusafw.s3.amazonaws.com/documents/l atest/release/ja/html/dmdl/start-guide.html
ソース model_a = { hoge : INT; fuga : TEXT; piyo : DOUBLE; }; こんな 感 じでAsakusa Framework 上 で 扱 うデータモデルを 定 義 していく
2.Asakusa DSL Asakusa Frameworkでアプリケーションを 作 成 す るには Asakusa DSLで 処 理 の 流 れや 処 理 の 本 体 を 記 述 します 参 考 資 料 http://asakusafw.s3.amazonaws.com/documents/l atest/release/ja/html/dsl/index.html
種 類 1.Operator DSL 2.Flow DSL 3.Batch DSL 以 上 の3 種 類
Operator DSL 演 算 子 と 呼 ばれるデータフロー 処 理 の 最 小 単 位 を 記 述 する レコード データフローに 流 れるデータ1つ 分 Asakusa DSLでは データモデルオブジェクト として 表 現 される さっきのDMDL グループ レコードを 特 定 のキーでグループ 化 したもの Asakusa DSLでは データモデルオブ ジェクトのリストや 反 復 子 などで 表 現 される
演 算 子 の 種 類 Branch : レコードを 内 容 に 応 じた 出 力 に 振 り 分 ける Update : レコードの 内 容 を 更 新 して 出 力 する Convert : レコードを 別 の 種 類 のレコードに 変 換 して 出 力 する MasterJoin : レコードにマスタデータを 結 合 して 出 力 する MasterBranch : レコードとマスタデータの 内 容 に 応 じた 出 力 に 振 り 分 け る MasterJoinUpdate : レコードの 内 容 をマスタデータの 情 報 を 元 に 更 新 し て 出 力 する Summarize : グループ 化 したレコードを 集 計 して 出 力 する CoGroup : 複 数 種 類 のレコードをグループ 化 して 任 意 の 処 理 を 行 う 等
/** * レコードの 値 に100を 設 定 する * @param hoge 更 新 するレコード */ @Update public void edit(hoge hoge) { hoge.setvalue(100); } ソース
Flow DSL 演 算 子 を 組 み 合 わせてデータフローの 構 造 を 記 述 するDSL 以 下 の2 種 類 1.ジョブフロー 外 部 システムからデータを 取 り 出 して 外 部 システムにデータを 書 き 出 すデータフロー 2.フロー 部 品 データフローそのものを 演 算 子 として 定 義 する ほかのデータフローから 演 算 子 として 利 用 できる
ジョブフロー package com.example.business.jobflow; import com.asakusafw.vocabulary.flow.*; @JobFlow(name = "piyo") public class PiyoJob extends FlowDescription { In<Hoge> hoge; Out<Fuga> fuga; /** * コンストラクタ */ public StockJob( @Import(name = "hoge", description = HogeDb.class) In<Hoge> hoge, @Export(name = "fuga", description = FugaDb.class) Out<Fuga> fuga) { this.shipmentin = shipmentin; this.stockout = stockout; } @Override protected void describe() { CoreOperatorFactory core = new CoreOperatorFactory(); OpFactory op = new OpFactory(); // チェックする CheckHoge check = op.checkhoge(hoge);... // 結 果 を 書 き 出 す fugat.add(result.value); } }
フロー 部 品 package com.example.business.flowpart; import com.asakusafw.vocabulary.flow.*; @FlowPart public class PiyoPart extends FlowDescription { In<Hoget> hoge; Out<Fuga> fuga; /** * コンストラクタ */ public StockPart( In<Hoge> hoge, Out<Fuga> fuga) { this.hoge = hoge; this.fuga = fuga; } }
Batch DSL ジョブフローを 組 み 合 わせて 一 連 の 処 理 を 記 述 する
ソース package com.example.batch; import com.asakusafw.vocabulary.batch.*; @Batch(name = "piyo") public class PiyoBatch extends BatchDescription { @Override protected void describe() { Work first = run(hogeflow.class).soon(); Work second = run(fugaflow.class).after(first);... } }
3. 外 部 システム 連 携 以 下 の 三 種 類 がある 1.WindGate 2.ThunderGate 3.Direct I/O
WindGate ポータブルなThunderGate の 位 置 づけ ローカルファイルシステム 上 のフラットファイル(CSV 形 式 )に 対 する データ 入 出 力 に 対 応 DBMS 固 有 の 機 能 に 依 存 せず 標 準 SQL/JDBCインターフェースのみを 使 用 した 実 装 を 提 供 ThunderGateでは 処 理 対 象 テーブルに 対 する 管 理 カラムの 追 加 が 必 要 だが WindGateでは 不 要 ただしThunderGateが 提 供 していたロック 機 構 などの 仕 組 みが 一 部 提 供 されない
実 装 例 (データモデル) @windgate.jdbc.table(name = "PIYO") document = { "the name of this document" @windgate.jdbc.column(name = "HOGE") name : TEXT; }; "the content of this document" @windgate.jdbc.column(name = "FUGA") content : TEXT; データモデルから インポート エクスポートを 行 うクラスの 骨 組 み を 自 動 生 成 してくれる
インポート エクスポートクラス public class HogeDb extends JdbcImporterDescription {... } public class WordIntoDb extends JdbcExporterDescription {... } インポートクラスはJdbcImporterDescription エクスポートクラスはJdbcExporterDescription を 継 承 する それぞれ 各 メソッドを 実 装 String getprofilename() Class<?> getmodeltype() String gettablename() List<String> getcolumnnames() Class<? extends DataModelJdbcSupport<?>> getjdbcsupport() インポートクラスは String getcondition() も 実 装 する
ThunderGate バッチ 処 理 中 のデータに 対 する 排 他 制 御 をサポート ジョブフロー 内 でのロングランニングトランザクションをサポート 変 更 差 分 のみをインポートするキャッシュ 機 能 をサポート MySQL 向 けに 最 適 化 を 実 施 テーブルメタデータからのデータモデル 自 動 生 成
ただし 以 下 の 制 約 がある 現 在 はMySQLのみ 対 応 データベースサーバー 上 での 実 行 が 必 要 ThunderGate 用 の 管 理 テーブルや 管 理 カラムが 必 要
インポート エクスポートクラス public class Hoge extends DbImporterDescription {... } public class Fuga extends DbExporterDescription {... } インポートクラスはDbImporterDescription エクスポートクラスはDbExporterDescription を 継 承 する ThunderGateはたくさん 機 能 や 設 定 があるので 公 式 サイトを 要 参 照 http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/th undergate/index.html
Direct I/O Hadoopクラスターからバッチの 入 出 力 データを 直 接 読 み 書 きするための 機 構 ThunderGateやWindGateと 異 なりデータ 転 送 用 の 特 別 なツールは 不 要 代 わりにHadoopクラスターから 直 接 参 照 できないリソースを 利 用 できない 転 送 に 時 間 のかかるデータを 入 出 力 する 場 合 に 適 している
YAESS 4.バッチ 実 行 ツール
YAESS バッチを 開 発 環 境 やテスト 環 境 上 で 試 験 的 に 実 行 する ジョブ 管 理 ツールからYAESSを 経 由 してバッチを 実 行 する 他 のツールにYAESSをライブラリとして 組 み 込 んで 利 用 する
TestDriver 5. 自 動 テストサポート
TestDriver Hadoopや 外 部 入 出 力 と 自 動 的 に 連 携 したテストが 可 能 入 出 力 と 検 査 ルールを 定 義 してバッチやデータフローを 検 証 JUnitなどの 様 々なテストハーネスから 利 用 可 能
演 算 子 のテスト データフローのテスト フロー 部 品 のテスト ジョブフローのテスト バッチのテスト テスト
例 えば 演 算 子 のテスト @Test public void testcheckshipment_shipped() { StockOpImpl operator = new StockOpImpl(); Shipment shipment = new Shipment(); shipment.setshippeddate(new DateTime()); shipment.setcost(100); ShipmentStatus actual = operator.checkshipment(shipment); } assertthat("costが 指 定 されていたらCOMPLETED", actual, is(shipmentstatus.completed)); 参 照 元 http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/te sting/start-guide.html
Jinrikisha 実 際 に 動 かしてみる
Jinrikisha Asakusa Framework の 開 発 環 境 を 手 軽 に 構 築 するためのインストーラ パッケージ Linux-32bit 版 Linux-64bit 版 MacOSX 版 (Experimental) の 三 つがある 僕 はMacOSX 版 (Experimental)を 使 おうかと http://asakusafw.s3.amazonaws.com/documents/jinrikisha/ja/html/index.h tml
最 後 に 書 籍 が 無 いので 資 料 は 技 術 サイトを 見 ると 良 いです http://asakusafw.s3.amazonaws.com/documents/latest/release/ja/html/index.h サイトに 導 入 事 例 のメニューがあるのですが まだ 更 新 されていない 模 様 他 にも 開 発 者 さんのブログを 見 ると 何 か 情 報 があるかも? http://d.hatena.ne.jp/okachimachiorz/