Asakusa ~ Enterprise Batch Framework for Hadoop Hadoop Japan Conference 2011/2/22
<ul><li>自己紹介 </li></ul><ul><ul><li>神林飛志 </li></ul></ul><ul><ul><li>所属 ウルシステムズ ( 株 )  取締役 </li></ul></ul><ul><ul><ul><li>ソリ...
目的 <ul><li>Asakusa の目的 </li></ul><ul><ul><li>基幹バッチ処理を Hadoop 上で、開発・実行・運用すること </li></ul></ul><ul><ul><li>Hadoop 上で基幹を動かすことの...
実際どんなものか? <ul><li>基幹バッチ処理の例~一部抜粋 </li></ul>仕入データ 取り込み 残高 更新 照合 処理 仕入明細 データ 仕入返品 データ 費用振替 データ 売価変更 データ 出力データ 中間 TRN 入力データ 未...
さらにブレイクダウンする <ul><li>多層構造になっているのが普通 </li></ul>仕入データ 取り込み 仕入明細 データ 仕入返品 データ 費用振替 データ 売価変更 データ 仕入 TRN 在庫振替 TRN 在庫移動 TRN 未収収益...
基幹バッチの特徴 <ul><li>特に Hadoop がよく使われる BI 処理との比較でいうと・・・ </li></ul><ul><ul><li>① データの種類が多い。 </li></ul></ul><ul><ul><ul><li>4-5 ...
基幹バッチの特徴からみると・・・ <ul><li>基幹バッチで処理を行うには今の Hadoop には何が足らないのか? </li></ul><ul><ul><li>Mapreduce 自体に不足はない </li></ul></ul><ul><u...
Hadoop の何がたらないか? <ul><li>基本的に BI を前提の仕組みなっているので、足りない部分が多い </li></ul><ul><ul><li>そもそも大規模開発の手法がない </li></ul></ul><ul><ul><li...
なので・・・ <ul><li>「もしかして、普通に </li></ul><ul><li>基幹バッチを書くと、 </li></ul><ul><li>しねる?」 </li></ul><ul><li>「ええ、もう完璧に」 </li></ul>
そこで <ul><li>屋形船が登場するわけです。 </li></ul>Powered by @kis まだ案ですが!
位置づけ <ul><li>もう一つの Hadoop の上位層 </li></ul>Hadoop   Core Core ・ HDFS ・ MapReduce Pig Hive Asakusa Oozie MonkeyMagic : Ruby ベ...
Asakusa の構成 <ul><li>DAG ベースの多層 DSL 構造 </li></ul><ul><ul><li>構造化を行う多層管理 DSL </li></ul></ul><ul><ul><li>ビルディングブロックの構成により処理フロ...
DAG ベースの多層 DSL 構造 <ul><li>構造化を行う多層管理 DSL </li></ul><ul><ul><li>3 層の DSL </li></ul></ul><ul><ul><ul><li>BatchDSL ・最上位のバッチを記...
DAG の開発方法論と表裏一体 <ul><li>一連の非同期処理をどのように実装していくのか </li></ul><ul><ul><li>プロセスの設計 </li></ul></ul><ul><ul><ul><li>DAG ベースでの詳細ブレー...
<ul><li>DSL </li></ul><ul><ul><li>3 層構造の DSL </li></ul></ul>BatchDSL 最上のバッチフローを記述する FlowDSL ビルディングブロックの記述 多層的な構成 演算子 DSL デ...
DSL の記述例 <ul><li>バッチの記述例~ BatchDSL </li></ul><ul><ul><li>とりあえず何も考えなくても書ける </li></ul></ul><ul><ul><li>フローの組み合わせを記述していく </li...
DSL の記述例 <ul><li>Flowpart の記述例~ FlowDSL </li></ul>・・・・・・・・・・・・・・・・・・・・・・・・ @Override protected void describe() { //  まずは明細...
DSL の記述例 <ul><li>Flowpart の記述例~ FlowDSL ・・・その 2 </li></ul>@Override protected void describe() { NewTxApMachingOperatorFact...
DSL の記述 <ul><li>OperatorDSL </li></ul><ul><ul><li>最下層 DSL </li></ul></ul><ul><ul><ul><li>DAG でいうと頂点をにあたる部分の記述 </li></ul></...
DSL の記述 <ul><li>業務系の複雑な処理も演算子として記述可能 </li></ul><ul><li>例は非等価結合の演算子を作ってみたケース </li></ul><ul><ul><li>日付から有効なマスターデータを検索して、価格の結...
Default で準備されている DSL データ編成 CoGroup  グループ結合演算子  Confluent  合流演算子  Convert  変換演算子  Duplicate  複製演算子  GroupSort  グループ整列演算子  S...
MR コンパイラ <ul><li>Ashigel コンパイラ </li></ul><ul><ul><li>Made by @ashigeru </li></ul></ul><ul><ul><li>日本の若手ハッカーによる初の MapReduce...
<ul><li>Ashigel コンパイラ~構成図 </li></ul>データモデルと連動 コンパイルで 最適化 わりといろんな黒魔術を使っています。( by@ashigeru)
Asakusa の構成 <ul><li>Asakusa の実行時構成イメージ </li></ul>最上位でのバッチ実行・監視 Job ネットが複数の job に展開される TRX 制御 バウンダリー管理 HadoopJob の 実行管理 Had...
TX 管理 <ul><li>TX のバウンダリーの管理 </li></ul>@JobFlow(name = &quot;stock&quot;)  public class StockJob extends FlowDescription { ...
<ul><li>ModelGenerator </li></ul><ul><ul><li>HadoopIO は結構面倒くさい </li></ul></ul><ul><ul><ul><li>Writable を実装する必要がある </li></u...
こんな感じで sql ファイルをつくればおk <ul><li>平易な記述でデータモデルを作成できる </li></ul>CREATE   TABLE  ITEM_INFO ( -- Application columns CODE  BIGIN...
テスト <ul><li>Test ツールの構成図 </li></ul>
テスト <ul><li>テストは結構大事 </li></ul><ul><ul><li>テストの記述 / 実行に注力したい </li></ul></ul><ul><ul><li>Asakusa では Junit でたたけるテストドライバーが提供さ...
テストモジュールは各 DSL 単位で自動生成される <ul><li>モデル・ジェネレーターからはテストシートが自動生成される </li></ul><ul><ul><li>データモデルの生成と同時にテストシートが生成 </li></ul></ul...
外部との一体連携 <ul><li>外部連携 </li></ul><ul><ul><li>特に外部リソースとの自動連携は仕組みとして準備している </li></ul></ul><ul><ul><ul><li>一応デフォルトは Sqoop になって...
運用 <ul><li># workflow </li></ul><ul><li>jobnet(&quot;#{BATCH_ID_QUALIFIER}.tutorial&quot;, :instance_name => &quot;master&...
運用ツール <ul><li>運用ツール </li></ul><ul><ul><li>現時点ではデフォルトは、 MonkeyMagic </li></ul></ul><ul><ul><ul><li>1. とりあえず実績~すでに Hadoop クラ...
OSS 化について <ul><li>とりあえず 3 月目標です </li></ul><ul><ul><li>今、 Asakusa の実案件が 2/E の C/O です。 </li></ul></ul><ul><ul><ul><li>基幹系なので...
<ul><li>Asakusa で何がうれしいのかよくわからん </li></ul><ul><ul><li>だいたい、説明速すぎだろ・・・ </li></ul></ul><ul><ul><li>図が見づらいし・・・・ </li></ul></u...
Hadoop つかって、よかですか? <ul><ul><ul><li>俺 BI とかよく知らんし。 </li></ul></ul></ul><ul><ul><ul><li>数学とかよくわからんし。 </li></ul></ul></ul><ul...
ようするに <ul><li>そんなあなたも Hadoop </li></ul><ul><li>つかえます! </li></ul>
Asakusa で何がうれしいのか? <ul><li>基幹バッチがほいほい書ける </li></ul><ul><ul><li>というか、 Hadoop で一般業務向けの処理が書ける </li></ul></ul><ul><ul><ul><li>...
Asakusa のターゲット <ul><li>使い方 </li></ul><ul><ul><li>① Hacker な人 </li></ul></ul><ul><ul><ul><li>中身をいじって、自分用に作り替える事も可能 </li></u...
技術屋の人であれば <ul><li>とりあえず Asakusa を触ってみる </li></ul><ul><ul><li>もっとすげーコンパイラとか書いてみる? </li></ul></ul><ul><ul><ul><li>中身を見ますか? <...
Ashigel コンパイラの勉強会 <ul><li>Ashigel コンパイラの勉強会です。 </li></ul><ul><ul><li>http://atnd.org/events/12865 </li></ul></ul><ul><ul><...
Asakusa Scala DSL <ul><li>Asakusa Scala DSL </li></ul><ul><ul><li>@asami224  の浅海さんが、現在サンプルベースで、 Asakusa DSL の Scala 版をプロトタ...
Upcoming SlideShare
Loading in...5
×

Asakusa Enterprise Batch Processing Framework for Hadoop

15,782

Published on

Asakusa Enterprise Batch Processing Framework for Hadoop
Hadoop Japan Conference 2011-2-22

Published in: Technology
0 Comments
29 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
15,782
On Slideshare
0
From Embeds
0
Number of Embeds
20
Actions
Shares
0
Downloads
1
Comments
0
Likes
29
Embeds 0
No embeds

No notes for slide

Transcript of "Asakusa Enterprise Batch Processing Framework for Hadoop"

  1. 1. Asakusa ~ Enterprise Batch Framework for Hadoop Hadoop Japan Conference 2011/2/22
  2. 2. <ul><li>自己紹介 </li></ul><ul><ul><li>神林飛志 </li></ul></ul><ul><ul><li>所属 ウルシステムズ ( 株 )  取締役 </li></ul></ul><ul><ul><ul><li>ソリューション事業部 </li></ul></ul></ul><ul><ul><li>基幹系業務処理専業 </li></ul></ul><ul><ul><ul><li>B2B ミドル・ SOA - TX 管理基盤の製品開発 </li></ul></ul></ul><ul><ul><ul><li>販売・営業・コンサル・ SI ~なんでもやる </li></ul></ul></ul><ul><ul><ul><li>Hadoop での基幹処理とか、そんな感じで。 </li></ul></ul></ul>
  3. 3. 目的 <ul><li>Asakusa の目的 </li></ul><ul><ul><li>基幹バッチ処理を Hadoop 上で、開発・実行・運用すること </li></ul></ul><ul><ul><li>Hadoop 上で基幹を動かすことの狙い </li></ul></ul><ul><ul><ul><li>バッチ処理時間の短縮 </li></ul></ul></ul><ul><ul><ul><ul><li>バッチ処理の短縮で何が可能になるのか? </li></ul></ul></ul></ul><ul><ul><ul><li>① 今まで時間的な制約できなかった処理を何度も行うことができる </li></ul></ul></ul><ul><ul><ul><ul><li>月次・週次での処理を日次で行える。可能であれば「即時処理」 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>シミュレーション・確定処理・クレンジング・引当・受発注・在庫管理・予測処理 </li></ul></ul></ul></ul><ul><ul><ul><li>② 時間的に処理が不能であったデータも処理をする </li></ul></ul></ul><ul><ul><ul><ul><li>13 か月実績推定から 100 カ月超のデータも取り込む </li></ul></ul></ul></ul><ul><ul><ul><ul><li>データ種が異なるデータもまとめて処理にかける </li></ul></ul></ul></ul><ul><ul><ul><li>③ 無駄な時間がなくなり、運用のコストが劇的に下がる </li></ul></ul></ul><ul><ul><ul><ul><li>夜間バッチをなくして、運用監視の人的なコストを下げる </li></ul></ul></ul></ul>
  4. 4. 実際どんなものか? <ul><li>基幹バッチ処理の例~一部抜粋 </li></ul>仕入データ 取り込み 残高 更新 照合 処理 仕入明細 データ 仕入返品 データ 費用振替 データ 売価変更 データ 出力データ 中間 TRN 入力データ 未払 計上 在庫 計測 仕入 TRN 在庫振替 TRN 在庫移動 TRN 未収収益 TRN 売価変更 在庫変更 TRN 修正 在庫振替 TRN 修正 在庫移動 TRN 修正 未収収益 TRN 未払計上 TRN 4 種類のデータ In 9 種類のデータ In 5 種類のデータ In 5 種類のデータ Out 4 種類のデータ Out 7 種類のデータ In 計上済 仕入 TRN 計上済 未収収益 TRN 計上済 未払費用 TRN 更新済 買掛残高 TRN 請求 TRN 支払不可 消込 TRN 支払可 消込 TRN 照合済 未払費用 TRN 請求エラー TRN 照合済 未収収益 TRN 照合済 仕入 TRN 照合済 請求 TRN
  5. 5. さらにブレイクダウンする <ul><li>多層構造になっているのが普通 </li></ul>仕入データ 取り込み 仕入明細 データ 仕入返品 データ 費用振替 データ 売価変更 データ 仕入 TRN 在庫振替 TRN 在庫移動 TRN 未収収益 TRN 売価変更 在庫変更 TRN 4 種類のデータ In 5 種類のデータ Out データ 取り込み クレンジング データ 分割 Level-0 Level-1 Level-2 Level-3 階層が深くなるの普通 大抵の規模で 4-5 階層 データ 整形 日付 チェック マスター チェック 付随 データ 生成 附番 データ 一次出力
  6. 6. 基幹バッチの特徴 <ul><li>特に Hadoop がよく使われる BI 処理との比較でいうと・・・ </li></ul><ul><ul><li>① データの種類が多い。 </li></ul></ul><ul><ul><ul><li>4-5 種類は通常にある。多い時は 20-30 のデータ種を一気に処理することは普通にある。 </li></ul></ul></ul><ul><ul><ul><li>中間データの生成も多い </li></ul></ul></ul><ul><ul><ul><li>フラグの違いだけといった同じようだが、微妙に違うデータ種類が混在する </li></ul></ul></ul><ul><ul><ul><ul><li>・・・ generics の乱発とかしたくなって発狂する。 </li></ul></ul></ul></ul><ul><ul><li>② 処理の組み合わせは単純 </li></ul></ul><ul><ul><ul><li>四則演算やパターンマッチング、フラグ判断が多い </li></ul></ul></ul><ul><ul><ul><li>条件分岐と演算が組み合わさることも多い </li></ul></ul></ul><ul><ul><li>③ データフローが複雑 </li></ul></ul><ul><ul><ul><li>条件分岐・コントロールブレイク・ネスト処理 </li></ul></ul></ul><ul><ul><ul><ul><li>IF 文のネスト </li></ul></ul></ul></ul><ul><ul><ul><ul><li>条件にヒットした段階で処理を変更するフロー </li></ul></ul></ul></ul><ul><ul><li>④ 割と設計が重要 </li></ul></ul><ul><ul><ul><li>規模がおおきいので、設計の失敗は痛い </li></ul></ul></ul>
  7. 7. 基幹バッチの特徴からみると・・・ <ul><li>基幹バッチで処理を行うには今の Hadoop には何が足らないのか? </li></ul><ul><ul><li>Mapreduce 自体に不足はない </li></ul></ul><ul><ul><ul><li>ないと言えば嘘になるが、万能の技術はないでの、うまく欠点を補う必要がある </li></ul></ul></ul><ul><ul><ul><li>HDFS ・ Mapreduce ・ Core は一体の技術 </li></ul></ul></ul><ul><ul><li>まずは生 Hadoop で基幹バッチを作ってみると・・・ </li></ul></ul><ul><ul><ul><li>自作 MapReduce </li></ul></ul></ul><ul><ul><ul><ul><li>制限的なインターフェイスは仕方なし </li></ul></ul></ul></ul><ul><ul><ul><li>謹製 Writable </li></ul></ul></ul><ul><ul><ul><ul><li>HadoopIO はちょっと面倒 </li></ul></ul></ul></ul><ul><ul><ul><li>根性デバッグ </li></ul></ul></ul><ul><ul><ul><ul><li>テストツール?自分でつくるのが基本ですね </li></ul></ul></ul></ul><ul><ul><ul><li>シャーロックホームズな運用 </li></ul></ul></ul><ul><ul><ul><ul><li>Log の解析はぜひ Hadoop で。 </li></ul></ul></ul></ul><ul><ul><ul><li>ゴッドモードしかないメンテ </li></ul></ul></ul><ul><ul><ul><ul><li>責任者出てこい! </li></ul></ul></ul></ul>
  8. 8. Hadoop の何がたらないか? <ul><li>基本的に BI を前提の仕組みなっているので、足りない部分が多い </li></ul><ul><ul><li>そもそも大規模開発の手法がない </li></ul></ul><ul><ul><li>MR や Writable の実装が職人芸 </li></ul></ul><ul><ul><li>テストツールが貧弱 </li></ul></ul><ul><ul><li>運用についてはあまり考えていない </li></ul></ul><ul><li>かように、ちょっと人数が増えると制御不能になるので Pig ・ Hive のような上位層の利用が必須になる。 </li></ul><ul><li>ところが・・・ Hadoop では、基幹バッチでよく使われる「非常に多種類のデータ」の「単純な処理の組み合わせ」 を「複雑なフロー処理」で行う仕組みのための上位層がない。 Pig ・ Hive ではちょっと無理っぽい。 </li></ul><ul><li>また、開発方法論も特にない。テスト・運用ツールが不足している。 </li></ul>
  9. 9. なので・・・ <ul><li>「もしかして、普通に </li></ul><ul><li>基幹バッチを書くと、 </li></ul><ul><li>しねる?」 </li></ul><ul><li>「ええ、もう完璧に」 </li></ul>
  10. 10. そこで <ul><li>屋形船が登場するわけです。 </li></ul>Powered by @kis まだ案ですが!
  11. 11. 位置づけ <ul><li>もう一つの Hadoop の上位層 </li></ul>Hadoop   Core Core ・ HDFS ・ MapReduce Pig Hive Asakusa Oozie MonkeyMagic : Ruby ベース運用環境 MonkeyMagic は ( 株 )EC-ONE さんの製品でございます。
  12. 12. Asakusa の構成 <ul><li>DAG ベースの多層 DSL 構造 </li></ul><ul><ul><li>構造化を行う多層管理 DSL </li></ul></ul><ul><ul><li>ビルディングブロックの構成により処理フローの記述 </li></ul></ul><ul><ul><li>トランザクション管理~ロールバック制御:すげー大事 </li></ul></ul><ul><ul><li>開発方法論まで視野 </li></ul></ul><ul><li>MR コンパイラ </li></ul><ul><ul><li>Ashigel コンパイラ </li></ul></ul><ul><ul><li>ステージングコンパイラ </li></ul></ul><ul><ul><li>運用スクリプトの生成 </li></ul></ul><ul><ul><li>多層 DSL を最適な MapReduce プログラム群に生成する </li></ul></ul><ul><li>ModelGenerator </li></ul><ul><ul><li>データ層の自動化 </li></ul></ul><ul><ul><li>Writable 自動生成と DSL への組み込み </li></ul></ul><ul><ul><li>テストとのインテグレーション </li></ul></ul><ul><li>外部との一体統合 </li></ul><ul><ul><li>Import/Export </li></ul></ul><ul><ul><li>外部接続 </li></ul></ul><ul><ul><li>便利系 API </li></ul></ul>上位の開発方法論から、実装フレームワーク・コンパイラ・データモデリング・テストツール・運用連携 まで含む 「フル・スタック」 の フレームワーク
  13. 13. DAG ベースの多層 DSL 構造 <ul><li>構造化を行う多層管理 DSL </li></ul><ul><ul><li>3 層の DSL </li></ul></ul><ul><ul><ul><li>BatchDSL ・最上位のバッチを記述言語 </li></ul></ul></ul><ul><ul><ul><li>FlowDSL ・バッチのビルディングブロックを記述する言語 </li></ul></ul></ul><ul><ul><ul><li>OperatorDSL ・処理の最小単位を記述言語 </li></ul></ul></ul><ul><li>ビルディングブロックの構成により処理フローの記述 </li></ul><ul><ul><li>フロー部品を構成的・多層的に構築する </li></ul></ul><ul><ul><ul><li>Replace (可換性)の向上 </li></ul></ul></ul><ul><ul><ul><li>変更への強化 </li></ul></ul></ul><ul><ul><ul><li>再利用性の向上 </li></ul></ul></ul><ul><ul><ul><li>見通しの良さと品質の確保 </li></ul></ul></ul><ul><li>トランザクション管理~ロールバック制御 </li></ul><ul><ul><li>TX を DSL で指定することで、データを DB に保全する </li></ul></ul><ul><ul><ul><li>必要に応じてロールバックする </li></ul></ul></ul><ul><ul><ul><li>単位は MR ではなく、その上位の業務の塊で処理する </li></ul></ul></ul><ul><ul><ul><li>データのリカバリー・配布に工夫 </li></ul></ul></ul><ul><ul><ul><li>「 Hadoop 自体がぶっ壊れても、大ジョブだ、心配ない」 </li></ul></ul></ul>
  14. 14. DAG の開発方法論と表裏一体 <ul><li>一連の非同期処理をどのように実装していくのか </li></ul><ul><ul><li>プロセスの設計 </li></ul></ul><ul><ul><ul><li>DAG ベースでの詳細ブレークダウン </li></ul></ul></ul><ul><ul><ul><li>構造化手法の援用 </li></ul></ul></ul><ul><ul><ul><ul><li>STS 分割法 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>モジュール強度 </li></ul></ul></ul></ul><ul><ul><ul><li>SPF 演算子的考え方の利用 </li></ul></ul></ul><ul><ul><ul><li>GRASP 原則の適用 </li></ul></ul></ul><ul><ul><ul><ul><li>凝集度( Cohesion ) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>結合度( Coupling ) </li></ul></ul></ul></ul><ul><ul><li>データモデルの設計 </li></ul></ul><ul><ul><ul><li>静的なモデルを渡り歩くスタイル </li></ul></ul></ul><ul><ul><ul><ul><li>TX データとマスターデータの設計 </li></ul></ul></ul></ul><ul><ul><ul><li>Join の設計が影響する </li></ul></ul></ul><ul><ul><ul><ul><li>キーの扱いがポイントになるが、 No_SQL 系はキー付けの絶対性が低い </li></ul></ul></ul></ul><ul><ul><ul><ul><li>都度キーを生成する感じの「データモデルの変遷」になる </li></ul></ul></ul></ul>
  15. 15. <ul><li>DSL </li></ul><ul><ul><li>3 層構造の DSL </li></ul></ul>BatchDSL 最上のバッチフローを記述する FlowDSL ビルディングブロックの記述 多層的な構成 演算子 DSL データ操作の最小単位
  16. 16. DSL の記述例 <ul><li>バッチの記述例~ BatchDSL </li></ul><ul><ul><li>とりあえず何も考えなくても書ける </li></ul></ul><ul><ul><li>フローの組み合わせを記述していく </li></ul></ul>バッチクラスを作成して 内部で、下位の DSL で作成した job フローを連結して、記述する。
  17. 17. DSL の記述例 <ul><li>Flowpart の記述例~ FlowDSL </li></ul>・・・・・・・・・・・・・・・・・・・・・・・・ @Override protected void describe() { // まずは明細と商品マスタを結合 Join join = op.join(itemIn, orderIn); // 結合に失敗したものはエラーフラグを立てて終了させておく SetStatus missing = op.setStatus(join.missed, &quot; 商品不明 &quot;); 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
  18. 18. DSL の記述例 <ul><li>Flowpart の記述例~ FlowDSL ・・・その 2 </li></ul>@Override protected void describe() { NewTxApMachingOperatorFactory f = new NewTxApMachingOperatorFactory(); UpdateTxOperatorFactory f1 = new UpdateTxOperatorFactory(); CoreOperatorFactory core = new CoreOperatorFactory(); // 伝票 No 設定未設定で振り分ける BranchSlipWithoutNo branch1 = f.branchSlipWithoutNo(inApMached); // 伝票 No 設定済に対して、前回までの突合結果区分より「計上ずれ」「不一致」とそれ以外を振り分ける BranchGapAndUnmatch branch2 = f.branchGapAndUnmatch(branch1.out2); // 伝票情報の初期化 InitSlipInfo update1 = f.initSlipInfo(branch2.out1); // 請求情報の初期化 InitBillInfo update2 = f.initBillInfo(branch2.out1); // 伝票 No 設定済で前回までの突合結果区分が「計上ずれ」「不一致」以外と請求情報初期化したファイルを一つにまとめる Confluent<TxApMaching> confuent1 = core.confluent(branch2.out2, update2.out); // 伝票情報が入っているデータに対して、支払消込トランから赤黒ペアの未照合を抜き出す GroupSortBranchDeficitSurplusDiv grs11 = f1.groupSortBranchDeficitSurplusDiv(confuent1.out); Operator 生成 入力 edge Ope 固有処理 出力 edge 出力 edge から入力結線 出力 edge 二つから入力結線
  19. 19. DSL の記述 <ul><li>OperatorDSL </li></ul><ul><ul><li>最下層 DSL </li></ul></ul><ul><ul><ul><li>DAG でいうと頂点をにあたる部分の記述 </li></ul></ul></ul><ul><ul><ul><li>Operator クラスを記述し、その Operator の処理メソッドを記述 </li></ul></ul></ul><ul><ul><ul><li>アノテーションにより適切な挙動に制御を行い、 MapReduce へ展開する </li></ul></ul></ul>/** * 注文商品の情報と明細を結合する。 * @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 で準備されている演算子の アノテーションを利用して、演算子を記述する。 演算子クラスの記述で必要な要件はアノテーションごとに異なる。間違うとコンパイラに怒られる。
  20. 20. DSL の記述 <ul><li>業務系の複雑な処理も演算子として記述可能 </li></ul><ul><li>例は非等価結合の演算子を作ってみたケース </li></ul><ul><ul><li>日付から有効なマスターデータを検索して、価格の結合するという処理 </li></ul></ul>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 = &quot;selectItemMst&quot;) public void updateWithMaster( @Key(group = &quot;id&quot;) ItemMst master, @Key(group = &quot;itemId&quot;) HogeTrn tx) { tx.setPrice(master.getPrice()); } } 条件の記述 結合の記述
  21. 21. Default で準備されている DSL データ編成 CoGroup グループ結合演算子 Confluent 合流演算子 Convert 変換演算子 Duplicate 複製演算子 GroupSort グループ整列演算子 Split 分割演算子 業務系 MasterBranch マスタ分岐演算子 MasterCheck マスタ確認演算子 MasterJoin マスタ結合演算子 MasterJoinUpdate マスタつき更新演算子 Summarize 単純集計演算子 フロー制御 Branch 分岐演算子 Checkpoint チェックポイント演算子 Empty 空演算子 Identity 恒等演算子 Logging ロギング演算子 Stop 停止演算子 割と一般的な「アルゴリズム」や 処理を実装している。 ソート・マージ・分割 業務系の演算子の実装 拡張して業務フレームワークになっている 「マスターとの突合」処理 フロー制御のための演算子 DAG の記述をしていると発生する
  22. 22. MR コンパイラ <ul><li>Ashigel コンパイラ </li></ul><ul><ul><li>Made by @ashigeru </li></ul></ul><ul><ul><li>日本の若手ハッカーによる初の MapReduce コンパイラ </li></ul></ul><ul><ul><li>Pig ・ Hive と比べても遜色がない </li></ul></ul><ul><ul><ul><li>というか基幹バッチのようなものであれば現時点これしか選択肢がない。 </li></ul></ul></ul><ul><li>ステージングコンパイラ </li></ul><ul><ul><li>DSL を順番にコンパイルする </li></ul></ul><ul><ul><li>演算子->フロー部品->バッチ->最適化 </li></ul></ul><ul><ul><ul><li>各レイヤーを部品化することで開発効率を上げる </li></ul></ul></ul><ul><li>多層 DSL を最適な MapReduce プログラム群に生成する </li></ul><ul><ul><li>SI ・運用優先 </li></ul></ul><ul><ul><li>普通に書くと増えてしまう Map ・ Reduce のタスクを統合する </li></ul></ul><ul><ul><li>最適化も行う~今も最適化中 </li></ul></ul>
  23. 23. <ul><li>Ashigel コンパイラ~構成図 </li></ul>データモデルと連動 コンパイルで 最適化 わりといろんな黒魔術を使っています。( by@ashigeru)
  24. 24. Asakusa の構成 <ul><li>Asakusa の実行時構成イメージ </li></ul>最上位でのバッチ実行・監視 Job ネットが複数の job に展開される TRX 制御 バウンダリー管理 HadoopJob の 実行管理 Hadoop との IO 管理 MapReduce 実体 JarFile
  25. 25. TX 管理 <ul><li>TX のバウンダリーの管理 </li></ul>@JobFlow(name = &quot;stock&quot;) 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 = &quot;shipment&quot;, description = ShipmentFromDb.class) In<Shipment> shipmentIn, @Import(name = &quot;stock&quot;, description = StockFromDb.class) In<Stock> stockIn, @Export(name = &quot;shipment&quot;, description = ShipmentToDb.class) Out<Shipment> shipmentOut, @Export(name = &quot;stock&quot;, description = StockToDb.class) Out<Stock> stockOut) { this.shipmentIn = shipmentIn; this.stockIn = stockIn; this.shipmentOut = shipmentOut; this.stockOut = stockOut; } フロー部品の In と Out の結線を外につなぐことにより、外部での永続化をサポートする。 この記述をフロー部品に組み込むことで、処理の外部接続と業務 TX のバウンダリー管理を行う
  26. 26. <ul><li>ModelGenerator </li></ul><ul><ul><li>HadoopIO は結構面倒くさい </li></ul></ul><ul><ul><ul><li>Writable を実装する必要がある </li></ul></ul></ul><ul><ul><ul><li>変に作るとバグ混入 </li></ul></ul></ul><ul><ul><li>「 ModelGenerator 」 </li></ul></ul><ul><ul><ul><li>Table ・ View をつくると自動的にクラスを生成 </li></ul></ul></ul><ul><ul><ul><ul><li>HadoopIO は意識しなくてもよい </li></ul></ul></ul></ul><ul><ul><ul><li>作ったクラスは Eclipse で利用できるので、 DSL で操作できる </li></ul></ul></ul><ul><ul><ul><li>Table から Hadoop への展開は自動! </li></ul></ul></ul><ul><ul><ul><li>Hadoop から Table への戻しは自動! </li></ul></ul></ul><ul><ul><li>要は、 SQL でアクセスできます。 </li></ul></ul><ul><ul><ul><li>普通に MySQL がつかえれば、いいわけです。 </li></ul></ul></ul><ul><ul><ul><li>普通にアクセスできます。 </li></ul></ul></ul><ul><ul><ul><li>画面とか、そのままいじらずに Hadoop にアクセスできるわけです。 </li></ul></ul></ul>データモデルについても ぬかりはありません・・・
  27. 27. こんな感じで sql ファイルをつくればおk <ul><li>平易な記述でデータモデルを作成できる </li></ul>CREATE TABLE ITEM_INFO ( -- Application columns CODE BIGINT NOT NULL , NAME VARCHAR (255) NOT NULL , PRICE INT NOT NULL ) type =InnoDB; CREATE TABLE ORDER_DETAIL ( -- System columns for BulkLoader SID BIGINT PRIMARY KEY AUTO_INCREMENT, VERSION_NO BIGINT NULL , RGST_DATETIME DATETIME NULL , UPDT_DATETIME DATETIME NULL , -- Application columns ORDER_ID BIGINT NOT NULL , ITEM_CODE BIGINT NOT NULL , STATUS VARCHAR (255) NULL ) type =InnoDB; CREATE VIEW JOIN_ORDER AS SELECT ORDER_ID, ITEM_CODE, PRICE FROM ORDER_DETAIL, ITEM_INFO WHERE ORDER_DETAIL.ITEM_CODE = ITEM_INFO.CODE; CREATE VIEW SUM_ORDER AS SELECT ORDER_ID, SUM (PRICE) AS AMOUNT FROM JOIN_ORDER GROUP BY ORDER_ID; 普通に TBL をつくる こっちは IO も一緒に 書いてあるケース VIEW とかもできる View まで書くと 演算子まで勝手につくる。
  28. 28. テスト <ul><li>Test ツールの構成図 </li></ul>
  29. 29. テスト <ul><li>テストは結構大事 </li></ul><ul><ul><li>テストの記述 / 実行に注力したい </li></ul></ul><ul><ul><li>Asakusa では Junit でたたけるテストドライバーが提供される </li></ul></ul>
  30. 30. テストモジュールは各 DSL 単位で自動生成される <ul><li>モデル・ジェネレーターからはテストシートが自動生成される </li></ul><ul><ul><li>データモデルの生成と同時にテストシートが生成 </li></ul></ul><ul><ul><li>テスト内容を作成していく </li></ul></ul><ul><li>作成したフロー部品単位やジョブフロー単位でのテストドライバーも自動生成される。 </li></ul><ul><ul><li>普通に JUnit から実行可能 </li></ul></ul><ul><li>FlowDSL のテストツール </li></ul>BatchDSL FlowDSL OperatorDSL でそれぞれテストツールが提供される すべて JUnit から実行可能
  31. 31. 外部との一体連携 <ul><li>外部連携 </li></ul><ul><ul><li>特に外部リソースとの自動連携は仕組みとして準備している </li></ul></ul><ul><ul><ul><li>一応デフォルトは Sqoop になっています </li></ul></ul></ul><ul><ul><ul><li>・・・一応、現在の Prj ではもっと高機能なやつ使ってます・・・・ </li></ul></ul></ul><ul><ul><ul><ul><li>高速データ展開 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>データの排他制御・セキュリティ管理とか </li></ul></ul></ul></ul>開発的には Hadoop は 全く意識しない
  32. 32. 運用 <ul><li># workflow </li></ul><ul><li>jobnet(&quot;#{BATCH_ID_QUALIFIER}.tutorial&quot;, :instance_name => &quot;master&quot;, :credential_name => &quot;asakusa&quot;) do </li></ul><ul><li>boot_jobs(&quot;order&quot;) </li></ul><ul><li># jobflow – order </li></ul><ul><li>jobnet(&quot;order&quot;, :to => []) do </li></ul><ul><li>auto_sequence </li></ul><ul><li>jobnet(&quot;__IMPORT__&quot;) do </li></ul><ul><li>boot_jobs(&quot;bulkloader&quot;) </li></ul><ul><li>jobnet(&quot;bulkloader&quot;) do </li></ul><ul><li>auto_sequence </li></ul><ul><li>job(&quot;bulkloader.asakusa&quot;, &quot;&quot;$ASAKUSA_HOME/&quot;bulkloader/bin/importer.sh primary asakusa tutorial order &quot;$($ASAKUSA_HOME/monkeymagic/bin/execution_id.sh)&quot; 20380101000000 &quot;#{BATCH_ARGUMENTS}&quot;&quot;, :instance_name => &quot;asakusa&quot;, :credential_name => &quot;asakusa&quot;) </li></ul><ul><li>end </li></ul><ul><li>end </li></ul><ul><li>jobnet(&quot;__STAGE_GRAPH__&quot;) do </li></ul><ul><li>boot_jobs(&quot;stage0001&quot;) </li></ul><ul><li># stage - tutorial / order / stage0001 </li></ul><ul><li>hadoop_job_run(&quot;stage0001&quot;, &quot;$ASAKUSA_HOME/monkeymagic/bin/hadoop_job_run.sh com.example.tutorial.batch.tutorial.order.stage0001.StageClient &quot;$ASAKUSA_HOME/batchapps/tutorial/lib/jobflow-order.jar&quot; -D &quot;com.asakusafw.executionId=$($ASAKUSA_HOME/monkeymagic/bin/execution_id.sh)&quot; -D &quot;com.asakusafw.user=$USER&quot; -D &quot;com.asakusafw.batchArgs=#{BATCH_ARGUMENTS}&quot;&quot;, :to => [&quot;stage0002&quot;]) do </li></ul><ul><li>hadoop_job(&quot;tutorial.order.stage0001&quot;) </li></ul><ul><li>end </li></ul><ul><li># stage - tutorial / order / stage0002 </li></ul><ul><li>hadoop_job_run(“stage0002”, “$ASAKUSA_HOME/monkeymagic/bin/hadoop_job_run.sh ・・・・・・・・・・・・・・ </li></ul><ul><li>運用のためにスクリプトが生成される </li></ul><ul><ul><li>Ashigel コンパイラから自動生成 </li></ul></ul><ul><ul><li>下の例は、 MonkeyMagic 用の rb の生成 </li></ul></ul>
  33. 33. 運用ツール <ul><li>運用ツール </li></ul><ul><ul><li>現時点ではデフォルトは、 MonkeyMagic </li></ul></ul><ul><ul><ul><li>1. とりあえず実績~すでに Hadoop クラスターとか実証結構やっている </li></ul></ul></ul><ul><ul><ul><ul><li>本番の基幹なので実績は大事 </li></ul></ul></ul></ul><ul><ul><ul><li>2. 動的な言語の特性を活かして、制御できるアイテムが割と自由 </li></ul></ul></ul><ul><ul><ul><ul><li>Ruby の特性を活かしている </li></ul></ul></ul></ul><ul><ul><ul><li>3. クラウド用のライセンス体系 </li></ul></ul></ul><ul><ul><ul><ul><li>既存の体系に引きずられない </li></ul></ul></ul></ul><ul><ul><li>Asakusa 自体には experimental shell script を準備 </li></ul></ul><ul><ul><ul><li>拡張して、運用ツールと連携できる </li></ul></ul></ul><ul><ul><ul><li>OSS なので自分でスクリプト生成を書くことも可能 </li></ul></ul></ul><ul><ul><ul><li>自分用の job コントロールスクリプトも作成可能 </li></ul></ul></ul><ul><ul><ul><li>他の運用・監視用ツールとの連携も普通にできる </li></ul></ul></ul>
  34. 34. OSS 化について <ul><li>とりあえず 3 月目標です </li></ul><ul><ul><li>今、 Asakusa の実案件が 2/E の C/O です。 </li></ul></ul><ul><ul><ul><li>基幹系なので、半年間の段階リリース </li></ul></ul></ul><ul><ul><ul><li>次の Prj も仕掛中 </li></ul></ul></ul><ul><ul><ul><li>割とマジです。 </li></ul></ul></ul><ul><ul><ul><li>100 人 101 脚状態。 </li></ul></ul></ul><ul><ul><li>なので、なんとかまとめて C/O 後に Asakusa を公開します。 </li></ul></ul>β 版利用したい人は 募集中ですので 連絡ください。
  35. 35. <ul><li>Asakusa で何がうれしいのかよくわからん </li></ul><ul><ul><li>だいたい、説明速すぎだろ・・・ </li></ul></ul><ul><ul><li>図が見づらいし・・・・ </li></ul></ul><ul><ul><li>コードだされても・・・ </li></ul></ul><ul><ul><li>そもそも 30 分で説明する気 Nothing だろ、これ・・・・ </li></ul></ul>そんなあなたに ポイントだけ
  36. 36. Hadoop つかって、よかですか? <ul><ul><ul><li>俺 BI とかよく知らんし。 </li></ul></ul></ul><ul><ul><ul><li>数学とかよくわからんし。 </li></ul></ul></ul><ul><ul><ul><li>「さいゆうほう」って漢字かけないし </li></ul></ul></ul><ul><ul><ul><li>カーネル法って言われると普通にケンタッキーのおっさんが FA ですそれがなにか? </li></ul></ul></ul>
  37. 37. ようするに <ul><li>そんなあなたも Hadoop </li></ul><ul><li>つかえます! </li></ul>
  38. 38. Asakusa で何がうれしいのか? <ul><li>基幹バッチがほいほい書ける </li></ul><ul><ul><li>というか、 Hadoop で一般業務向けの処理が書ける </li></ul></ul><ul><ul><ul><li>誰でも書ける </li></ul></ul></ul><ul><ul><ul><li>アイデア勝負 </li></ul></ul></ul><ul><li>なんと言っても「お金になる」 </li></ul><ul><ul><li>マーケットは確実に BI よりも大きい </li></ul></ul><ul><ul><ul><li>BI ~ワンショットで 3000 千万とかそんな感じです。億単位はあんまりないです。 </li></ul></ul></ul><ul><ul><ul><li>基幹系~億円以下はむしろない。 </li></ul></ul></ul><ul><ul><ul><li>基幹系じゃなくても普通の業務系でも使える。 </li></ul></ul></ul><ul><ul><ul><li>正直いうと BI でも使える。 </li></ul></ul></ul><ul><ul><ul><ul><li>BI も本当に複雑な処理は一部であとは、基幹系と同じだったりするので </li></ul></ul></ul></ul><ul><ul><ul><ul><li>そのあたりの煩雑な処理とか省ける。 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>テストも便利・パーツも追加回し前提。 </li></ul></ul></ul></ul><ul><ul><li>クラウド時代で先行きどうなるの?->でも食える。割と各自に金になる </li></ul></ul><ul><ul><ul><li>インフラ? </li></ul></ul></ul><ul><ul><ul><ul><li>Amazon でいじゃね?他にいろいろあるし・・・ </li></ul></ul></ul></ul><ul><ul><ul><li>ソフト </li></ul></ul></ul><ul><ul><ul><ul><li>Hadoop + Asakusa = OSS 。 </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>ま~ <censored> とか要らんし。だいたいバッチだけなら <censored> より、はええし。 </li></ul></ul></ul></ul></ul>
  39. 39. Asakusa のターゲット <ul><li>使い方 </li></ul><ul><ul><li>① Hacker な人 </li></ul></ul><ul><ul><ul><li>中身をいじって、自分用に作り替える事も可能 </li></ul></ul></ul><ul><ul><ul><li>ツールも作れる </li></ul></ul></ul><ul><ul><ul><li>コンパイラ拡張 </li></ul></ul></ul><ul><ul><ul><li>DSL の独自設計・実装 </li></ul></ul></ul><ul><ul><ul><li>外部連携の実装 </li></ul></ul></ul><ul><ul><li>② 業務屋の人 </li></ul></ul><ul><ul><ul><li>プロトを自分作れる </li></ul></ul></ul><ul><ul><ul><li>考え方を検証できる </li></ul></ul></ul><ul><ul><li>③ SI 屋な人 </li></ul></ul><ul><ul><ul><li>大規模開発が可能 </li></ul></ul></ul><ul><ul><ul><li>ツールとかがそろっているで、 Hadoop で大規模開発が可能 </li></ul></ul></ul><ul><ul><ul><li>工数の見積もりもできる </li></ul></ul></ul>
  40. 40. 技術屋の人であれば <ul><li>とりあえず Asakusa を触ってみる </li></ul><ul><ul><li>もっとすげーコンパイラとか書いてみる? </li></ul></ul><ul><ul><ul><li>中身を見ますか? </li></ul></ul></ul><ul><ul><ul><li>-> Ashigel コンパイラの勉強会へどうぞ </li></ul></ul></ul><ul><ul><ul><li>2/25 開催。@ EC-ONE </li></ul></ul></ul><ul><ul><li>もっとおしゃれな DSL とか書いてみる? </li></ul></ul><ul><ul><ul><li>Scala ? JRuby ? </li></ul></ul></ul><ul><ul><ul><li>-> Asakusa Scala DSL の勉強会にどうぞ </li></ul></ul></ul><ul><ul><ul><li>3/10 開催。@ EC-ONE </li></ul></ul></ul><ul><ul><li>もっと中身が知りたいですか? </li></ul></ul><ul><ul><ul><li>3 月に大規模な勉強会を実施予定 </li></ul></ul></ul><ul><ul><ul><ul><li>実装者のよる解説 </li></ul></ul></ul></ul><ul><ul><ul><li>Twitter で告知予定 </li></ul></ul></ul>
  41. 41. Ashigel コンパイラの勉強会 <ul><li>Ashigel コンパイラの勉強会です。 </li></ul><ul><ul><li>http://atnd.org/events/12865 </li></ul></ul><ul><ul><li>Ashigel コンパイラの開発者である、 @ashigeru さんにコンパイラの説明をしてもらい、 Ashigel コンパイラの中身を理解してしまおう、という勉強会です。 </li></ul></ul><ul><ul><li>Ashigel コンパイラは何をしているのか~概要編 </li></ul></ul><ul><ul><li>Ashigel コンパイラは何を入力にして、何を出力しているのか~詳細編 </li></ul></ul><ul><ul><li>最適化 </li></ul></ul><ul><ul><li>2-3 時間の内容でございます。 </li></ul></ul><ul><ul><li>参加資格は特になしです。 但し「遠慮無しレベル」での話で行く予定なので 最低限 Hadoop とかは知っているかもしれないレベルは欲しいところです。 </li></ul></ul><ul><ul><li>二次会もあるので、飲みましょう。 http://atnd.org/events/12866 </li></ul></ul>
  42. 42. Asakusa Scala DSL <ul><li>Asakusa Scala DSL </li></ul><ul><ul><li>@asami224 の浅海さんが、現在サンプルベースで、 Asakusa DSL の Scala 版をプロトタイピングで作成されています。 </li></ul></ul><ul><ul><li>可能であれば、集まって、そのデザイン・レビューをしようという話になりました。 AsakusaDSL のサンプルコードも同時に見ながら、あるべき DSL 論について、議論をしようという勉強会です。 </li></ul></ul><ul><ul><li>参加者には事前に、 Asakusa Scala DSL と実際の AsakusaDSL のサンプルコードも配布します。 Asakusa は OSS として公開されることが決まっています。公開と同時に ecoSystem 化を進めようという面白い試みにもなりますので、是非ご参加ください。 </li></ul></ul><ul><ul><li>メイン討議者として @ashigeru さん 荒川さん Ashigel コンパイラの作者で AsakusaDSL デザイナー @frsyuki さん 古橋さん  msgPack ・ kumofs の作者 @masayah さん  MS の萩原さん @shot6  ショットたん </li></ul></ul><ul><ul><li>を予定しております。わりと適当に行く感じなので、そのつもりでぇえ~ </li></ul></ul><ul><ul><li>二次会もやります。 </li></ul></ul><ul><ul><li>http://atnd.org/events/13174 </li></ul></ul>

×