MapReduce::Liteで手軽に分散処理

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)」を読み終えたので,id:naoyaさんの作ったMapReduce::LiteでMapReduceを試してみた.以下は,MapReduce::Liteを使ってみたメモなど.あくまでもメモなので,くわしくMapReduceの勉強をしたいひとは,id:naoyaさんの記事(MapReduce - naoyaのはてなダイアリー)がおすすめです.

MapReduceは,MapとReduceの二つを組み合わせて実現できる処理を,分散処理化するGoogleの技術.すばらしい抽象化ですね.

id:naoyaさんの作ったMpaReduce::Liteは,MapReduceの仕組みをPerl上で実現したモジュール.ただ,MapReduce::Liteでは,処理をマシンごとに割り当てて分散しているわけではなく,スレッドごとに処理を割り当てるみたい.

あくまでスレッドによる並列処理なので,本当に処理を分散できるわけではない.*1しかし,そうはいっても,並列処理は,IOバウンドな処理には結構効果がありそうなので,簡単な仕組みで並列処理が実現できるMapReduce::Liteはなかなか良さそう.

ためしに,指定のURLの指すHTML内の画像をダウンロードするスクリプトを,MapReduce::Lite使用版/未使用版で作ってみた.

http://github.com/hakobe/forblog/tree/master/mapreduce_test

fetch_img.pl
MapReduce::Liteを使ってみたバージョン.MapReduce::LiteのexampleコードのMapperとReducerを修正しただけ.
fetch_img_no_mapreduce.pl
ほぼ同じ処理をスレッドを使わずに実装したバージョン.

両スクリプトとも引数にURLのリストが記録されたファイルをとる.この二つのコードの実行速度を測ってみると,

3.43s user 0.42s system 40% cpu 9.448 total # MapReduce::Lite 使用版
0.57s user 0.21s system 2% cpu 30.513 total # MapReduce::Lite 未使用版

となって,スレッドが走るMapReduce::Lite使用版のほうが3倍くらい速い.このとき,MapReduce::Lite使用版において,実質書いたコードはMapperとReducerだけで,MapReduce::Liteを使っていない版とコードの量はほとんど変わらない.なぜなら,分散処理に係る部分はうまく隠蔽されていて,自分が分散処理のためのコードを考えて書く必要がないから.

MapとReduceの組み合わせのみに処理をしぼることで,ちょーお手軽に分散処理を実現できてしまう,MapReduceのセンスはすばらしいなぁ.こういう,かっこいいアイディアを思いつきたいものです.

*1:このへんは,Hadoopとかと組み合わせると真の分散処理になるのかも.要調査.