간단한 단어 수 감속기는 다음과 같습니다Hadoop에서 Ruby reducers를 병렬 처리 하시겠습니까? 루비
#!/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 모든 매퍼 중간 값에서 가져옵니다. 특정 키가 아닙니다. 그래서 실제로 모든 단어에 대해 감속기가 하나만 있습니다 (단어 당 또는 단어 집합 당 감속기가 아닙니다).
그러나 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으로 할 수 있습니까?