yojikのlog

yojikのブログです

GridGain

ちょっと本来の作業にうまくのれなかったので、web巡回をしていたら面白そうなフレームワークを発見しました。*1
http://www.gridgain.com/index.html
Javaによる計算グリッド構築のためのライブラリです。目的が「計算」に特化しているためか凄くシンプルで扱いやすい感じ。Globus Toolkitがかったるそうだなーと思って手を出してなかった俺でも簡単に動かせます。
手順はこんな感じです。

  1. グリッドのノードを立ち上げる
  2. クライアント側から、グリッドに実行してもらいたいタスクを投げる

最小のクライアントのサンプルは以下のような形になります。AOPを使えば見た目はもう少しシンプルになるけど、個人的にはこちらの方が好み。

GridFactory.start();
try {
  Grid grid = GridFactory.getGrid();
  grid.execute(GridHelloWorldTask.class.getName(), "Hello World").get();
} finally {
  GridFactory.stop(true);
}

GridHelloWorldTaskの方は本家のサイト参照GridTaskの設計は、みんな大好きGoogleのMapReduceの影響を受けているそうですよ。

ちなみに、このサンプルを動かす程度なら、ほとんど設定する項目がありません。環境変数にインストールディレクトリを設定するだけです。このシンプルさの理由はクライアントやグリッドのノード間でクラスローダを共有している点にあります。
Javaでそれなりの処理を実行するためには、各種ライブラリを利用する必要があります。当然いろいろなjarファイルにクラスパスを通したりするわけです。一般的なフレームワークなら、各ノード側に、それらのjarファイルの場所を教えてあげるための設定やデプロイ作業が必要になるでしょう。Globus Toolkitではwarファイルみたいなアーカイブ(garファイル)を作ってデプロイするようです。*2
しかしGridGainの場合、クラスが必要になればクライアントやノード間で協力してダウンロードしてくる、"Peer Class Loading"機能があります。利用者からはノード間で同じクラスローダを共有しているように見えます。新しくタスクやクライアントの種類が増えても、グリッドのノード側にその情報を伝える必要が全くありません。なんらかのデプロイ作業も当然不要です。基本的にはTaskを生成して投げる側(グリッドのクライアント)に必要なライブラリを揃える形になると思います。*3
つまり、必要になったら何も考えずにノードを追加するだけで処理能力が増大するということになります。開発/テスト/本番のデプロイ形態も劇的に変わる気がします。これはすごいですよ。Javaの長所を上手く利用している感じです。*4
いわゆる企業内アプリの構築に利用できそうです。サーバサイドのロジックをグリッドで構成したりしたらどうなるんだろう。妄想がひろがりんぐです。
日本語の参考文献が殆ど無いのが残念。英語のドキュメントはかなーり充実してます。
この手の分散処理基盤は、まだJavaが結構活躍する分野かも。

*1:実は9月にブックマークしてるんだけど存在を忘れていた。意味ねー

*2:ちなみにGridGainにもgarデプロイ機能はあります

*3:クラスロード時の性能は当然不利になるため、必要に応じてそれぞれのノードにjarをインストールする機能もあります

*4:クラスローダ周りの複雑さはJavaの短所でもありますが