[Hadoop][Ruby]Hadoop Streaming 練習

どのユーザがどの検索ワードを使用したかを表すログデータを
集計して検索ワードランキング用のデータを生成することを考える。
ナス,193032
お弁当,39110
きゅうり,1039001
カレー 豚肉,90123
ズッキーニ,82919
パスタ トマト,1281032
からあげ,72920
じゃがいも キャベツ,402918
トマト,2101302
ナス ピーマン,822924
お弁当 おかず,291038
きゅうり サラダ,224703
豚肉 たまねぎ,90123
ハンバーグ,1038733
たいやき,547291
トマト,392018
お弁当 ウィンナー,39110
にんじん カレー,382027
キャベツ,1039200
なす トマト,2101302
卵 スープ,191938
次にMapperをrubyで書いてみる。
keyword_counter = Hash.new {|h,k| h[k] = 0 }

ARGF.each do |log|
        log.chomp!
        keyword, user_id = log.split(',')

        keywords = keyword.split(' ')
        keywords.each do |keyword|
                keyword_counter[keyword] += 1
                keyword_counter['__TOTAL__'] += 1
        end
end

keyword_counter.each do |keyword, count|
        puts "#{keyword}\t#{count}"
end
次にReducerを書く。
keyword_counter = Hash.new {|h,k| h[k] = 0 }
previous_keyword = nil

ARGF.each do |log|
        log.chomp!
        keyword, count = log.split(/\t/)

        if keyword == previous_keyword
                keyword_counter[keyword] += count.to_i
        else
                if previous_keyword
                        puts "#{previous_keyword}\t#{keyword_counter[previous_keyword]}"
                end
                previous_keyword = keyword
                keyword_counter[keyword] += count.to_i
        end
end

puts "#{previous_keyword}\t#{keyword_counter[previous_keyword]}"
Hadoopで動かす前に動きを試してみる。
$ cat keyword.log | ruby keyword_mapper.rb | ruby keyword_reducer.rb
問題なさそうだ。
次はHadoopで実行してみる。
$ hadoop fs -put keyword.log
$ hadoop jar /usr/local/hadoop/contrib/streaming/hadoop-streaming-1.1.2.jar -D mapred.child.env='PATH=$PATH:/home/hadoop/.rvm/bin' -input input -output output -mapper 'ruby keyword_mapper.rb' -reducer 'ruby keyword_reducer.rb' -file keyword_mapper.rb -file keyword_reducer.rb
$ hadoop fs -cat output/part-00000
__TOTAL__       32
おかず  1
お弁当  3
からあげ        1
きゅうり        2
じゃがいも      1
たいやき        1
たまねぎ        1
なす    1
にんじん        1
ウィンナー      1
カレー  2
キャベツ        2
サラダ  1
スープ  1
ズッキーニ      1
トマト  4
ナス    2
ハンバーグ      1
パスタ  1
ピーマン        1
卵      1
豚肉    2
うまくいった!
zuqqhi2

某Web系の会社でエンジニアをやっています。 学術的なことに非常に興味があります。 趣味は楽器演奏、ジョギング、読書、料理などなど手広くやっています。