Tech Tips

  1. プログラミング
  2. 197 view

[Hadoop][Ruby]Hadoop Streaming 練習

どのユーザがどの検索ワードを使用したかを表すログデータを
集計して検索ワードランキング用のデータを生成することを考える。
keyword.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ナス,193032
お弁当,39110
きゅうり,1039001
カレー 豚肉,90123
ズッキーニ,82919
パスタ トマト,1281032
からあげ,72920
じゃがいも キャベツ,402918
トマト,2101302
ナス ピーマン,822924
お弁当 おかず,291038
きゅうり サラダ,224703
豚肉 たまねぎ,90123
ハンバーグ,1038733
たいやき,547291
トマト,392018
お弁当 ウィンナー,39110
にんじん カレー,382027
キャベツ,1039200
なす トマト,2101302
卵 スープ,191938
次にMapperをrubyで書いてみる。
keyword_mapper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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_reducer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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で動かす前に動きを試してみる。
Verify
1
$ cat keyword.log | ruby keyword_mapper.rb | ruby keyword_reducer.rb
問題なさそうだ。
次はHadoopで実行してみる。
Run
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ 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
うまくいった!

プログラミングの最近記事

  1. C# でオブジェクトの概要を Console.WriteLine で出力する方法

  2. コマンドで C# コンソールアプリケーションを作成する方法

  3. PubSubClient の便利さと注意点

  4. Java の環境構築方法メモ

  5. PlatformIO IDE for VSCode を使用して VSCode で Ardu…

関連記事

PAGE TOP