GoogleのMapReduceはとても便利な技術

GoogleMapReduceはとても便利な技術である(使えないけど)。特に、ある単語(例えばGoogle)が出現した全てのテキスト・ファイル名を抜き出す際に便利だ。

このタスクは、ファイル数が1万ならば簡単に解ける。ワン・ライナーで十分である。例えば、Rubyならばこんな感じだろう。

ruby -rfind -renumerator -e "Find.to_enum(:find, '/tmp/textdir/').each{|fn| \
File.file?(fn) and open(fn).read =~ /google/ and puts fn}"

ところがファイル数が10億となった場合、このタスクはとたんに非常に難しいタスクとなる。それは並列処理が要求されるからである。1ファイル10KBとしても、10億のファイルのサイズは10TBとなる。これだけのサイズのデータを取り扱うには並列処理が必須である。だが、その実装はきわめて難しい。

単純な実装としては次のような処理が考えられる。まず、10TBのデータを均等に分割する。そして、分割したデータを、数百台ある計算用PCに送る。そして、各計算用PCでgoogleという単語が出現したファイルのファイル名を全て抜き出す。計算用PCはファイル名を抜き出し終わったら、抽出したファイル名を集計用PCに送る。集計用PCは、計算用PCから送られたファイル名を集計し、最終的な結果を保存する。

このような単純な実装でも、きちんと動かすのはとても大変である。数百台の計算機を扱うだけも大変だが、もっと面倒なことがある。それは、これだけの台数があると、確実に壊れる計算機が発生することである。従って、計算機が壊れた場合、その計算機が担当していた処理を、別の計算機に自動的に割り振ってやる必要がある。

このような並列処理の面倒くさい仕事をMapReduceは全て引き受けてくれる。クライアントは自分のしたいタスクと、使用する計算機資源を記述するだけである。なんて便利なんだろう。

こうして、Googleの技術を考え直してみると、背景には徹底したコスト意識があるように思える。安いPCを大量に揃えるだけでなく、それらのPCのポテンシャルを最大限引き出す努力をGoogleはしている。

補足説明

10TBのデータを取り扱うのもとても大変だが(バックアップだけで頭が痛くなる)、そのあたりはGoogle File Systemが全て面倒見てくれるので安心である。また、MapReduceは大量のバッチ処理に向く技術なので、検索エンジンそのものにはMapReduceは使われていないと思う。