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を用いれば、ロードバランシング機能を持つ実装も出来るだろう。