クックパッドの分散処理LTでGridGainをデモしました
20日に、クックパッドで開催された「techlifeライトニングトーク」に参加してきました。
今回は「分散処理」というテーマでLTが行われました。僕は、JavaのグリッドコンピューティングフレームワークGridGainをScalaから使うデモをしました。
(追記: 参加者全員の発表内容がYouTubeで公開されています)
GridGainは、Hadoopと同様にMapReduceの概念に基づくフレームワークですが、あくまでも計算処理の分散にフォーカスしているようです。よって、GridGainにはHDFS相当のファイルシステムがありませんが、その分シンプルで、非常に簡単に使用できます。
以下のように、分散させたいメソッドに@Gridifyというアノテーションを付けておき、-javaagent VMオプションでAspectJのweaver等を指定して実行すると、メソッドをエンハンスしてグリッド対応にできてしまいます。プログラムを見れば分かる通り、とても簡潔に記述できます。
import org.gridgain.grid.gridify.{Gridify, GridifyArgument, GridifyTaskSplitAdapter} import org.gridgain.grid.{GridFactory, GridJob, GridJobResult} import java.util.{ArrayList, List} object MyGrid { def main(args: Array[String]) { GridFactory.start say("the quick brown fox jumps over the lazy dog") GridFactory.stop(true) } @Gridify{val taskClass = classOf[MyTask]} def say(text: String) { println(text) } } class MyTask extends GridifyTaskSplitAdapter[Void] { def split(gridCount: Int, arg: GridifyArgument) = { val text = arg.getMethodParameters()(0).asInstanceOf[String] // 元のメソッド引数を単語境界で分割 val words = text.split(" ") // 分割された各単語を出力するジョブを生成 val jobs = new ArrayList[GridJob] for (s <- words) { jobs.add(new GridJob { def execute = { MyGrid.say(s) null } def cancel = {} }) } jobs } def reduce(results: List[GridJobResult]) = null }
GridGainのバージョンは現在2.1ですが、将来の3.0では、GridGain上に構築されたScalaベースの分散処理用DSLも提供されるそうで、要注目だと思います。