AkkaとJythonでMapReduce

前回、JythonでActor modelライブラリの1つであるAkkaを使えることを確認した
応用として、Akkaを使ってMapReduceを実装することにした。Actor modelは並行処理のためのモデルの1つであり、最近の並行処理といえばMapReduceだからだ。


MapReduceについてはWikipediaに丸投げする。実装はhttp://blog.doughellmann.com/2009/04/implementing-mapreduce-with.htmlを参考にした。

MapReduceActorが(function, input_data)をメッセージとして受け取り、処理結果を返すActorになる。functionはinput_dataを引数として取るMapかReduceの処理に当たる。ここでは、Map関数がfile_to_wordsで、Reduce関数がcount_wordsである。

各Actorの処理終了を待つために、Futureを返すactor.sendRequestReplyFuture()使っている。

実際に動かするために、Works of Edgar Allan Poe - Volume 1 ~ 4 by Edgar Allan Poeのテキストファイル(総サイズ:約2.69MB)を使って単語の数をカウントさせてみた。


$ CLASSPATH=java/lib/akka-modules-1.0/akka-modules-1.0.jar:$CLASSPATH
$ time jython mapreduce_main.py
TOP 30 WORDS BY FREQUENCY

i         :  7380
s         :  1112
said      :   653
time      :   592
little    :   583
say       :   535
great     :   526
man       :   523
long      :   484
gutenberg :   465
project   :   448
did       :   447
having    :   441
like      :   433
length    :   387
day       :   386
mr        :   377
way       :   372
eyes      :   359
far       :   352
head      :   349
night     :   337
work      :   334
thought   :   324
good      :   319
let       :   311
water     :   311
came      :   303
old       :   303
just      :   295

BOTTOM 30 WORDS BY FREQUENCY

jeopardized    :     1
lichen         :     1
flatu          :     1
unawed         :     1
bubastis       :     1
entablatures   :     1
harpooner      :     1
hove           :     1
demnition      :     1
relentless     :     1
enumerated     :     1
hasp           :     1
perkins        :     1
poete          :     1
enthusiast     :     1
entrances      :     1
tenements      :     1
charming       :     1
tool           :     1
chaining       :     1
worships       :     1
quadruple      :     1
subterrene     :     1
johannisberger :     1
waywardness    :     1
reinstate      :     1
actuates       :     1
judgments      :     1
specials       :     1


processing time (sec):  6.19600009918

real    0m13.179s
user    0m18.794s
sys     0m1.031s

起動に幾らか時間がかかっているが、処理は4つのActorで並行して高速に行われていることが分かる。
AkkaのRemote Actorを用いれば、ロードバランシング機能を持つ実装も出来るだろう。