はじめての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
おおおおおおお、できてる!!!
まだまだ知るべきことは多そうだけど、一通り流れは理解できた。