2009-05-08 3 views
4

簡単な語数の減速は、次のようになります。HadoopでRuby reducersを並列化する? Rubyで

#!/usr/bin/env ruby 
wordcount = Hash.new 
STDIN.each_line do |line| 
keyval = line.split("|") 
wordcount[keyval[0]] = wordcount[keyval[0]].to_i+keyval[1].to_i 
end 

wordcount.each_pair do |word,count| 
puts "#{word}|#{count}" 
end 

それはSTDINにすべての中間値をマッパ取得します。特定のキーからではありません。 実際には、すべての人に1つの減速器しかありません(単語ごとまたは単語のセットごとに減速器ではありません)。

しかし、Javaの例では、キーと値のリストをinoutとして取得するこのインタフェースを見ました。つまり、中間のマップ値は縮小前のキーでグループ化され、縮小は平行して実行できます。

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 
      public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
       int sum = 0; 
       while (values.hasNext()) { 
       sum += values.next().get(); 
       } 
       output.collect(key, new IntWritable(sum)); 
      } 
      } 

これはJavaの機能ですか?または、Rubyを使用してHadoop Streamingでそれを行うことはできますか?

答えて

5

ストリーミングを使用しているかどうかにかかわらず、リューカは常に並列に実行されます(表示されない場合は、複数の縮小タスクを許可するようにジョブ設定が設定されていることを確認してください - mapred.reduce.tasksクラスタ構成またはジョブ構成)。違いは、フレームワークが、Javaとストリーミングを使用するときに、あなたのために少しうまくパッケージ化することです。

Javaの場合、reduceタスクは、特定のキーのすべての値に対してイテレータを取得します。これにより、reduceタスクでマップの出力を合計している場合は、値を簡単に参照することができます。ストリーミングでは、文字通り、キーと値のペアのストリームを取得するだけです。 です。値はキー順に並べられ、指定されたキーの値はreduceタスク全体に分割されませんが、必要な状態の追跡はあなた次第です。たとえば、Javaで地図の出力が

KEY1、{VAL1、VAL2、val3は} KEY2、{val7、val8}

がストリーミングでフォームに象徴あなたの減速に来る、あなたの出力ではなく

のように見えます

KEY1、例えばVAL1 KEY1、val2の KEY1、KEY2 val3は 、val7 KEY2、val8

は、各キーの値の合計を計算減速を書くために、あなたは変数をする必要があります最後のあなたが見たキーとその合計を格納する変数。新しいキーと値のペアを読むたびに、次の操作を行います。

  1. キーが最後のキーと異なるかどうかを確認します。
  2. の場合は、キーと現在の合計を出力し、合計をゼロにリセットします。
  3. 合計に現在の値を加え、最後のキーを現在のキーに設定します。

HTH。

1

私はHadoop Streamingを自分で試したことはありませんが、ドキュメントを読むことで、同様の並列動作を達成できると思います。

関連する値を持つキーを各レデューサーに渡す代わりに、ストリーミングはマッパー出力をキーでグループ化します。また、同じキーを持つ値が複数のレデューサーに分割されないようにします。これは、通常のHadoopの機能とは多少異なりますが、それでも削減作業は複数のレデューサーに分散されます。

実際に何が起こっているかの詳細については、-verboseオプションを使用してみてください。 -D mapred.reduce.tasks=Xオプションで試してみてください。ここで、Xは希望するレデューサー数です。

関連する問題