ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Batch DSLの功罪

2013-12-08 19:44:15 | PG(分散処理)

Asakusa Framework Advent Calendar 2013の8日目です。大仰なタイトルは釣りです(笑)
今日はBatch DSLについてです。

Batch DSLは、バッチを定義する為のDSLです。
ここで言う「バッチ」とは、実行する単位のことで、Windowsで言えばひとつのexeファイル、UNIXで言えばひとつのa.outのようなイメージです。(今どきのUNIXでもa.outって通じるんだろうか^^;)

例えば「Example1Batch」というバッチを定義したら、AsakusaFWが提供しているYAESSのシェルを使って、以下のようにして実行することが出来ます。

$ASAKUSA_HOME/yaess/bin/yaess-batch.sh Example1Batch

実際にBatch DSLをどう記述するかというと、以下のような感じです。

Work jobA = run(JobFlowA.class).soon();
Work jobB = run(JobFlowB.class).after(jobA);

「まずJobFlowAを実行し、JobFlowA(jobA)の後でJobFlowBを実行する」という記述ですが、詳しい説明を受けなくても、なんとなくそう読めると思います。
「.class」が出てきたり変数jobAを定義したりしているのは、Javaを使ったDSLだからですね。

このように、Batch DSLの例を見ると、「Javaをホスト言語とするDSL」がどういうものなのか掴み易いと思います。
ジョブフローが2つだけだと少々さびしいので、4つくらいのジョブフローを書いた例をよく見かけます。


しかし、実際のところは、1つのバッチの中には1つのジョブフローしか書かない事の方が多いです^^;

1つのバッチの中に複数のジョブフローを書くとなると、どういう切り分け方でジョブフローを分けるのか、という基準が必要になります。
ジョブフローはファイルを出力する(出力が一旦確定する)ので、ジョブフローを分けておくと、後続ジョブフローの実行が失敗した場合、後続ジョブフローだけリラン(再実行)するという事が可能になります。(ひとつのジョブフローでひとつのロングトランザクション(業務トランザクション)を構成する、という考え方です)

しかし個人的には、それならバッチごと分けてしまって、後続バッチをリランする、という形でもいいんじゃないかなーと思うのです。
JP1やA-AUTOといったジョブ管理ツールに登録するのはバッチ単位なので、バッチで分けておけば、リランの管理はジョブ管理ツールに任せることが出来るからです。

ついでに言えば、1バッチの中に複数のジョブフローを描いている図を見ると、Batch DSLを「(ジョブ管理ツールのような)ジョブネットを記述する言語」のように誤解する可能性もあります。(というか、自分は最初そうなのかと思いました^^;)


という訳で、ここからは空想ですが。

仮に、1バッチには常に1ジョブフローしか無いという考えだったなら、ジョブフロー(=バッチ)だけ定義すれば済むことになります。すなわち、Batch DSLというものは不要になります。
そうなると、Batch DSLを覚える必要は無くなるし、ジョブネットを記述するかのような誤解も生じません。
AsakusaFWの「ジョブブロー」はファイルを入力としてファイルを出力しますが、その「ジョブフロー」が「バッチ」という位置付けになれば、一般的なバッチもファイルを読み込んでファイルを出力するので、対応付けとしても分かりやすいのではないかと想像しました。

まぁ、分かってしまえばBatch DSLはほとんど機械的に書けるので、あまり深く考えても意味が無いかもしれません^^;
先に書いた通り、「Javaをホスト言語とするDSLの例としては、Batch DSLはとても分かり易い」というメリットもあるので。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Asakusa DSLの裏側

2013-12-05 22:37:12 | PG(分散処理)

Asakusa Framework Advent Calendar 2013の5日目です。

AsakusaFWでは、Asakusa DSLという独自言語を用いてバッチアプリケーションを記述します。
DSLは「ドメイン特化言語」と言われるもので、限定的な用途に特化した言語のことです。
例えばSQLはRDBの操作に特化した言語であり、Asakusa DSLはバッチアプリケーションの記述に特化した言語、という具合です。 

Asakusa DSLには、記述する内容に応じてBatch DSLFlow DSLOperator DSLの3種類があります。
(データモデルを記述するDMDLという言語もありますが、これは「Asakusa DSL」には含めないようです)

  • Operator DSLでは「演算子」の内容を記述します。
    • 演算子と名付けられていますが、実態は普通のJavaのメソッドそのものです。最小粒度の処理はここに記述します。
    • バッチの実行時にはこのメソッドが実際に呼ばれます。
  • Flow DSLでは、アプリケーションの処理を記述します。
    • Operator DSLで記述した演算子(メソッド)を、どの順番で呼び出すのかを記述するイメージです。
  • Batch DSLでは、バッチを記述します。
    • ひとつのアプリケーション(Windowsで例えればexeファイル)がひとつのバッチとなります。
    • バッチの中には実行する「ジョブフロー」を指定します。
      • ここで言う「ジョブフロー」はFlow DSLで記述した物の事であり、JP1やA-AUTO等のジョブ管理ツールで言うジョブではありません。むしろ、ジョブ管理ツールにはBatch DSLで作成したバッチを登録します。(バッチはYAESSというシェルを使って実行します)

Batch DSL・Flow DSLもJavaで記述します(「Javaをホスト言語とするDSL」と言われる所以です)が、書いたメソッドがバッチの実行時に呼ばれるわけではありません。
なので、Batch DSLやFlow DSLの中で、通常のJavaの感覚で初期処理とか終了処理を書いても、実行時には呼ばれません。 


で、ここからが今日の本題です。
と言いつつ普通のAsakusaFWユーザーは全く知る必要が無い事柄なのですが^^;

AsakusaFWは、Batch DSL・Flow DSLで書かれた内容をコンパイルして実行用のクラスを生成します。
この「コンパイル」ですが、実はBatch DSL・Flow DSLで書かれたクラスを実行しているのです!

例えば記述したBatchクラスをnewしてstart()メソッドを呼び出すと、中でdescribe()メソッド(Batch DSLで記述した本体)が呼ばれるのです。そしてgetWorks()を呼び出すと、記述されていたジョブフローの一覧が取得できたりします。 

何が言いたいのかと言うと、一般的に「コンパイル」と言うとソースファイルを解析して云々というイメージですが、AsakusaFWのコンパイルはBatchクラスやFlowクラスを実行する(のであり、ソースファイルを解釈しているのではない)という事です。
(まぁ、汎用言語をホストとする外部DSLは全般的にこういうものかもしれませんが、「Javaで」っていうのが意外と盲点だったもので、驚いたのです) 

なので、たぶん、describeメソッド内にSystem.out.println()を入れるとコンパイル時に表示されるし、無限ループを仕込むとコンパイルが終わらなくなると思います(爆)
「Javaをホスト言語とするDSL」である以上、自由にJavaの文が書けてしまうので、仕方ないですね^^;
ただ、AsakusaFWが想定している動作ではないはずなので、こういうことはしない方が良いでしょう。
(なら書くなって声もありそうだけど、書きたかったんじゃー!w) 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Asakusa Frameworkの使いどころ

2013-12-03 21:03:58 | PG(分散処理)

Asakusa Framework Advent Calendar 2013の3日目です。

今日はAsakusaFWの使いどころについて書いてみたいと思います。


自分はHadoopの勉強をしていてAsakusaFWを知ったので、当初はHivePigCascading等と同様の“Hadoopをラップ(隠蔽)するフレームワーク(ツール)”という認識でした。
しかし、AsakusaFWのコンセプトはバッチアプリケーションを作成するフレームワークであり、実行基盤としてHadoopを利用しているという位置付けです。
(そのせいか、Hadoopエコシステムの仲間としてAsakusaFWが紹介される事はあまりありません^^;(ロゴの方向性もHadoopやHiveとは違うしw(こんな絵もあったけど(爆))))

そういうわけで、「どういう時にAsakusaFWを採用すべきか?」と言うと、「Hadoop上で動くバッチアプリケーションを作りたいとき」という事になるでしょう。何のひねりも無いですが(苦笑)


Hadoopを使ってプログラミングする為の言語と言うと、日本ではHiveが一番多いのではないかと思います。
自分も素のMapReduceを試して、その次に勉強したのはHiveでした。
HiveはSQLに似ているので、SQLを知っている自分にとっては学習コストが低いと思ったからですね。コンソールがあるので実際にHiveQLを実行しながら試すことが出来ますし。
(Pigも関数型言語に似ていて面白いですけどね) 

一方、AsakusaFWはAsakusa DSLを勉強する必要があります。
最小限のアプリケーションを作ってみようと思っても、DMDLOperator DSLFlow DSLを書く必要があります。
学習の初期コストは、HiveよりもAsakusaFWの方が高いのは否定しづらいです^^;

しかし、今までのバッチ処理でも、SQLだけで構築していたでしょうか?
自分はJavaでバッチアプリケーションを作ることが多かったです。その中でSQLを実行して、値に応じて色々な処理を行っていました。ある程度複雑な処理を記述しようとすると、SQLだけでバッチを作るのは無理だと思います。
AsakusaFWでプログラミングする際には、最小粒度の部分は普通にJavaでのコーディングなので、今までのJavaアプリケーションと同様です。

そういう訳で、Hadoopでバッチアプリケーションを作るなら、HiveよりもAsakusaFWの方が良いと思います。
特に、Hiveで複雑な処理をしようとしてUDFを作ったりCASE-WHENを多用したりするのだったら、AsakusaFWにした方が良いんじゃないかと思います。
(もちろん、(バッチ処理でなく)対話型の処理や、HiveQLのクエリー数個で済む処理だったらHiveの方が良いです)
(あと、SQLとHiveQLは結局似て非なるものなので、SQLの感覚でHiveQLを書こうとして逆にハマる可能性も無きにしも非ず) 

CascadingもJavaをホスト言語とするDSLみたいな感じなので、概念的にはAsakusaFWと似ている部分があるかもしれません。
ただ、Cascadingは、関数の出力結果がどういうフィールドになるのかがコーディング時に分かりにくいんですよね…。
AsakusaFWはデータモデルというもので入出力のレコードレイアウトをきっちり決めるので、そこが分かりにくいということはありません。


ちなみに、AsakusaFWの開発環境を作るのは最近ではすごく簡単になりました。
UNIXならJinrikishaで一発ですし、WindowsでもGradleプラグインで一発で開発環境を構築できるようになりました。
(WindowsではBatch DSL・Flow DSLの単体テストが動かせないだけで、Asakusaアプリケーションの開発を行うことは出来ます。単体テストが通ってからでないとソースをコミットしちゃ駄目、という運用だと適合しませんが><)

開発環境を作るとAsakusaFWのサンプルアプリケーションのソースが入っていますので、どんなものか見てみるのは簡単です。
興味があったら是非見てみて下さい。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

OSSのサポートとは

2013-12-01 11:11:11 | プログラミング

Asakusa Frameworkのアドベントカレンダーの1日目を書いてて、ついでにOSS(オープンソースソフトウェア)について書きたくなったのでw

OSSの厳密な定義は知らないんだけど^^;、「ソースが公開されているソフトウェア」という事だと思う。
したがって、そのソフトウェアが無料で使えるかどうかとは直接は関係ない。(無料で使えるOSSの方が多いと思うけど)

ソースが公開されているので、何か問題があったらソースを自分で調べることが出来る。
場合によっては自分用に改造することも出来る。
というのがOSSだと思う。

そして、自分でそういう事が出来ない人は、他の人に頼んでやってもらうしかない。
他の人に頼んだら報酬を支払うのも当然。(特に仕事なら)
「OSSのサポート」というのは、「あなたが出来ないこと(対象ソフトウェアの調査改修等)を引き受けますよ」という商売なので、有償なのはおかしいことではない。(対象ソフトウェア自体が無料であっても) 

ちょっと前に、絵描きに絵を頼む際の支払いとか自治体が何かを無償で募集するとかコンピューターの修理をタダで引き受けてはいけないとかの話が話題にあがっていたけれど、自分が出来ないことを他人にやってもらって正当な報酬を出さないのは、やっぱりおかしいよね?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Asakusa Frameworkとは

2013-12-01 10:22:06 | PG(分散処理)

Asakusa Framework Advent Calendar 2013の1日目です。
最終日には豪華プレゼントもあるよ!(嘘)


Asakusa Frameworkのアドベントカレンダーは初めて(去年も一昨年も無かった、つまり宇宙開闢以来初)なので、最初は「Asakusa Frameworkとは?」について書いておきたいと思います。

Asakusa Frameworkは、バッチアプリケーションを開発・実行する為のフレームワークです。

(レコード数やデータの種類が)大量のデータを入力とし、複数マシンで分散して処理するバッチアプリケーションをターゲットとしています。
OSS(オープンソースソフトウェア)です。

  • 開発にはAsakusa DSLというバッチアプリケーション記述用の言語を使う。
    • Javaをホスト言語とするDSLなので、文法としてはJavaを知っていれば問題ない。
  • 実行基盤として(現状では)Hadoopを使う。
    • Asakusa DSLで記述したソースをコンパイルするとHadoopのMapReduceプログラムが生成される。
    • 将来Hadoopより良い実行基盤が現れたら、それもサポートされる可能性がある。そのときには、基本的には既存のAsakusaプログラムをリコンパイルするだけで移行できるよう考慮されるんじゃないかと思う。 

特徴はもっと色々あるので、詳しくは検索してみて下さい(笑)


ちなみに、検索したときに引っかかりそうな事を書いておきますと。

個人的にはAsakusa FrameworkをAsakusaFWと略すことが多いですが、これは公式な略し方ではないです^^; 「asakusafw」はURLの一部などに使われていますが、略すときはたいてい「Asakusa」になっています。
が、検索キーワードが「Asakusa」だと地名の浅草が出てきそうな気がするので、個人的にはAsakusaFWを使っています。

AsakusaFWが最初にお披露目されたのはAshigelコンパイラの勉強会(2011-02-25)だと思います。
(AsakusaFWを実際に作っているのはashigeruさんなので、AsakusaFWのコンパイラーはAshigelコンパイラという名前らしいです(笑) 最近は「ashigelコンパイラ」という言葉は見かけませんね。なんだか懐かしいw

(そういえば、2011-03-11に大地震があって大変でしたね…) 

実際に公開された(AsakusaFWがダウンロードできるようになった)のは2011-03-31です。
ニュースサイト等にリリース情報が出されています。
当時はAsakusaFWはウルシステムズという会社が開発していたので記事にはウルシステムズの名前が出ていますが、現在はノーチラス・テクノロジーズ(2011-10-03設立)が開発しています。
ちなみに、ノーチラス・テクノロジーズ設立時にニュースサイトによっては「Hadoop専業」みたいな書かれ方をしていましたが、別にHadoop専業ではないです。
詳しいことを知りたかったらokachimachiorzさんに聞いてみて下さい(笑)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする