本日の社内勉強会で、id:a_bicky先生にHadoop + MapReduceの話をしてもらった。面白かった。その時に、気軽にMapReduce処理を試せるHapyrus (https://www.hapyrus.com/) というサービスを教えてもらったので、試しにHapyrusに登録して(現在Beta版らしい)アプリケーション作ってみた。
登録とかについては特に難しいこともなんもないので、割愛。
アプリを作成した後、こちらから (1) データソースとなるtextファイル(4000文字まで) or Amazon S3のデータ, (2) map用スクリプト/reduce用スクリプト の計3つを登録してやれば、雲のむこうのHadoopでMapReduce処理をしてもらえるらしい。
現在利用出来る言語はPerl/Ruby/Python(裏はHadoop Streamingなのかしら?)。今回はPerlで作成。また、データソースにはハムレットの一幕一場、父王の亡霊が退場するところまでのテキストファイルを使った。行う処理は、とりあえず初歩の初歩として、いわゆるword count。
mapとreduceの処理は以下のような感じ。サンプルのRubyをみるとどうやらコマンドラインから入ってきたものを上から全部ぺろぺろする、いわゆるcatのような食い方をしてほしそうだったのでそれに合わせた。
map script
use strict; use warnings; while( <> ) { my $line = $_; chomp $line; my @words = split /\b/, $line; print "$_\t1\n" for grep { $_ =~ /\w+/ } @words; }
reduce script
use strict; use warnings; my %hash; while( <> ) { my $line = $_; chomp $line; my ($word, $i) = split /\t/, $line; $hash{$word}++; } for my $key (keys %hash) { print $key . "\t" . $hash{$key} . "\n"; }
色々適当だけど気にしない方向で。データソースは長いので省略。ちなみに長いとはいっても4000文字以下のものなので、現実問題としてHadoop MRで処理する意味のないデータサイズだけどその辺はトライアルなので気にしない。
結果
https://gist.github.com/1074484
Hamletを適当にword countできてるみたいですね。結果がsortされてないけど、その辺どうなってるのかまで良く解らんとです。というかkeyを指定する方法はあるんだろうか?
Hapyrusはまだこなれていない部分が多いようですが、今後に期待のサービスであります。
(余談)
bicky先生が、まさに僕の欲しいuser scriptを書いていた! http://d.hatena.ne.jp/a_bicky/20110610/1307713778