はじめてのHadoop Streaming

perlでmap/reduceを書きたいのでHadoop Streamingにトライしてみる。

チュートリアル

まずはhttp://hadoop.apache.org/common/docs/r0.20.2/streaming.html#Hadoop+Streamingを真似してみるところから。
データはMap/Reduce TutorialのWordCountを使うことにする。

  • データチェック
kotaro@~$ hadoop fs -cat /users/kotaro/wordcount/input/file01
Hello World Bye World

kotaro@~$ hadoop fs -cat /users/kotaro/wordcount/input/file02
Hello Hadoop Goodbye Hadoop
  • 実行

hadoop-0.20.2-streaming.jarが$HADOOP_HOME/contrib/streamingにあることを突き止めるのに時間かかった。

kotaro@~$ hadoop jar hadoop/contrib/streaming/hadoop-0.20.2-streaming.jar -input /users/kotaro/wordcount/input -output /users/kotaro/wordcount/output -mapper /bin/cat -reducer /usr/bin/wc
  • 結果確認
hadoop fs -cat /users/kotaro/wordcount/tmp/part-00000
      2       8      52

おおおっっ!できた!

独自のmapper/reducer

  • mapper
#!/usr/bin/perl

my $line = <>;
chomp($line);
my @words = split /\s+/, $line;

for my $word (@words) {
    printf "%s\t1\n", $word;
}
  • reducer
#!/usr/bin/perl
my %word_count;
while (<>) {
    chomp;
    my ($key, $val) = split /\t/;
    next if !( $key && $val);

    $word_count{$key} += $val;
}

while (my ($key, $cnt) = each(%word_count)) {
    printf "%s\t%d\n", $key, $cnt;
}
  • job
hadoop jar hadoop/contrib/streaming/hadoop-0.20.2-streaming.jar \
 -input /users/kotaro/wordcount/input \
 -output /users/kotaro/wordcount/output \
 -mapper /home/kotaro/hadoop-sample/map.pl \
 -reducer /home/kotaro/hadoop-sample/reduce.pl
  • 結果
hadoop fs -cat /users/kotaro/wordcount/output/part-00000                                                                                                     Hadoop  2
Goodbye 1
World   2
Bye     1
Hello   2

おおおおおおお、できてる!!!
まだまだ知るべきことは多そうだけど、一通り流れは理解できた。