Un réducteur de wordcount simple Ruby ressemble à ceci:Paralléliser les réducteurs Ruby dans Hadoop?
#!/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
il est dans la STDIN tous les cartographes valeurs intermédiaires. Pas d'une clé spécifique. Donc, en réalité, il n'y a qu'un seul réducteur pour tous (et non pas réducteur par mot ou par ensemble de mots).
Cependant, sur les exemples Java, j'ai vu cette interface qui obtient une clé et une liste de valeurs comme inout. Ce qui signifie que les valeurs de carte intermidiate sont regroupées par clé avant réduits et réducteurs peuvent fonctionner en parallèle:
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));
}
}
Est-ce une Java seule caractéristique? Ou puis-je le faire avec Hadoop Streaming en utilisant Ruby?