Tag Archives: Hadoop Ruby Mapreduce

RubyでMapReduceしてみる

RubyでもHadoopが使えるってことでやってみました。

mapperとreducerだけ作ればいいらしい。
ワードをカウントしてみる。

mapper.rb

ARGF.each do |line|
  line.chomp!
  unless line.empty?
    printf("%s\t1\n", line)
  end
end

reducer.rb

data = Hash.new {|h, k| h[k] = 0 }

ARGF.each do |line|
  line.chomp!
  key, value = line.split("\t")
  data[key] += 1
end

data.each do |k, v|
  print("#{k}\t#{v}")
end

inputのデータは以下のような感じで。

aaa
bbb
bbb
ccc
ddd
aaa
ddd

HDFSへ移す

./hadoop/bin/hadoop dfs -copyFromLocal word word

いざ起動!
mapされてreduceされていきます。

$/hadoop/bin/hadoop jar /home/user/hadoop/contrib/streaming/hadoop-0.19.2-streaming.jar  \
-input word -output wordout  \
-mapper "ruby mapper.rb" -reducer "ruby reducer.rb"
10/10/15 21:32:06 INFO streaming.StreamJob:  map 0%  reduce 0%
10/10/15 21:32:10 INFO streaming.StreamJob:  map 50%  reduce 0%
10/10/15 21:32:12 INFO streaming.StreamJob:  map 100%  reduce 0%
10/10/15 21:32:17 INFO streaming.StreamJob:  map 100%  reduce 100%
10/10/15 21:32:19 INFO streaming.StreamJob: Job complete: job_201010152104_0003
10/10/15 21:32:19 INFO streaming.StreamJob: Output: wordout

中身を見てみる。

$ ./hadoop/bin/hadoop dfs -cat wordout/part-00000
aaa     2
bbb     2
ccc     1
ddd     2

見事できました。