Ruby Freaks Lounge

第28回 RubyとHadoopで分散処理 Hadoop Streamingの仕組み

この記事を読むのに必要な時間:およそ 2 分

実際の例 - ワードカウント

それでは,実際の例としてワードカウントを考えてみましょう。以下に簡単なMapとReduceの例を紹介するので参考にしてみてくださいリスト1~3⁠。最終的には各ワードがkeyに,各ワードの出現回数がvalueとしてタブ(\t)区切りで出力されます。Reduceで各ワードの出現回数をカウントしていますが,同じワード(key)は同じReduceに渡されることが保証されているため,きちんとカウントを取ることができるわけです。

リスト1 入力データ(Mapの入力)

hoge fuga foo hoge foo
foo bar hoge hoge fuga

リスト2 Mapで使うプログラムの例

#!/usr/bin/ruby

ARGF.each do |line|
  line.chomp!
  line.split.each do |word|
    puts "#{word}\t1"
  end
end

リスト3 Reduceで使うプログラムの例

#!/usr/bin/ruby

count = Hash.new {|h,k| h[k] = 0}
ARGF.each do |line|
  line.chomp!
  key, value = line.split(/\t/)
  count[key] += 1
end

count.each do |k,v|
  puts "#{k}\t#{v}"
end

クックパッドでのHadoop利用環境

実際,クックパッドでは以下の環境でHadoopを利用しています。

  • Hadoop Streamingを利用
  • 使用した言語はRuby
  • EC2でHadoopクラスタを構築(インスタンスは30台~50台程度)
  • HDFSとしてS3を利用(s3fs)

先述しましたが,Hadoop Streamingを使っていて,処理はRubyで記述しています。また,このデータ解析自体がそれほど頻繁に行われるものではないため,使うときだけサーバを立ち上げられるようにAmazonのEC2とS3を利用しています。データ量に応じて気軽にサーバ台数を変更することができるため,非常に重宝しています。HadoopとEC2/S3の相性は非常に良いですね。また,EC2を利用していて,そのままではHDFS上のデータがインスタンスを起動するたびに消えてしまうため,HDFS上のデータが消えないようにS3をHDFSとして利用しています。

まとめ

今回は導入編としてHadoop Streamingの仕組みや,クックパッドでのHadoop利用環境を紹介しました。次回はデータ処理時に具体的にどのようなコードを書いたのか,実際に利用してみて困った(ハマった)ことなど,実践的な内容を紹介したいと思います。

著者プロフィール

佐々木達也(ささきたつや)

普段は主にHadoopを用いた大規模データ解析を行っている象使いエンジニア。最近はNoSQLデータベースにも興味を持っている。Ruby, Railsはもちろん、広島カープも大好き。

bloghttp://blog.livedoor.jp/sasata299/

twitterhttp://twitter.com/sasata299/