クックパッドの分散処理LTでGridGainをデモしました

20日に、クックパッドで開催された「techlifeライトニングトーク」に参加してきました。

今回は「分散処理」というテーマでLTが行われました。僕は、JavaのグリッドコンピューティングフレームワークGridGainScalaから使うデモをしました。

(追記: 参加者全員の発表内容が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も提供されるそうで、要注目だと思います。