Develop with pleasure!

福岡でCloudとかBlockchainとか。

MapReduce

Googleが採用している分散処理アルゴリズムMapReduce。何年か前に丸山先生がとりあげてた気がする。

Javaで分散処理というと、ビジネスロジックを独立して公開し、リモートアクセスを行うEJBの実装(まぁ、RMI実装か)を考えるけどMapReduceのアルゴリズムを実装するには、EJB等の制限はない。

そもそも、EJBについてのメリットは分散処理というのもあるが、メインはビジネスロジックの公開ということろにあると思う。ビジネスロジックの公開となると当然、適切なビジネスドメインを意識した公開の粒度が求められる。分散処理をさせて負荷を軽減させること=実装の負荷分散を追及する上では、「公開すべきロジック」という仕様的な影響を受けるべきものだと思う。

MapReduceの場合は、ドメインモデルや公開すべきビジネスロジックというよりは実装中心のシンプルな分散アルゴリズム。また、EJBという環境依存の色もなければ、実装の仕方で実現方法はいくつもある。製品やJ2EE規格という意識とは別にアルゴリズム中心な印象を受ける。

MapReduceは、簡単に言うとmapとreduceという2段階のタスクによって構成される。mapタスクでは大量のデータを分解し適切な形で出力し、reduceタスクでmapタスクで抽出された情報を集約する。といっても???な感じだが。
良く解説例で出されているのが、文章の中に含まれる単語数の検出。例えば、「ab a b a c ac b」という文章があるとする。MapReduceの処理方式ではまず、単語をキーとして値1でMap形式で保持する。そのためMapは、

「ab a b a c ac b」 ⇒ Map["ab" => 1, "a" => 1, "b" => 1, "a" => 1, "c" => 1, "ac" => 1, "b" => 1]

となる。続いて、Mapをキーでソートし、同じキーを持つものを隣同士に配置する。

Sort["a" => 1, "a" => 1, "ab" => 1, "ac" => 1, "b" => 1, "b" => 1, "c" => 1]

で、最後にReduceタスクで同じキーのデータをまとめる。その際、同じキーの場合はMapのvalueを足し合わせる。

Reduce["a" => 2, "ab" => 1, "ac" => 1, "b" => 2, "c" => 1]

処理自体はシンプルで、MapでまとめてソートしReduceの処理を行う。ただ、MapタスクとReduceタスクがそれぞれ分割されているため、大量のデータをさばく際に複数のプロセスで処理を並列実行できる。EJBやCORBAに比べて非常にシンプルな構成。

ちなみに、JavaでMapReduceアルゴリズムを実装したApacheのHadoopというプロジェクトもあるみたい。
MapReduceのJava実装Apache Hadoopを使ってみた (1/3) - @IT

MapReduceのようにアルゴリズムベースの技術がクローズアップされることってそんなに無いので、今後の広がりが楽しみだ。こういったシーズを上手く活用したビジネスモデルで勝負できると良いな。