2009-05-08 2 views
4

간단한 단어 수 감속기는 다음과 같습니다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으로 할 수 있습니까?

답변

5

스트리밍 사용 여부에 상관없이 리 듀서는 항상 병렬로 실행됩니다 (표시되지 않는 경우 작업 구성이 여러 개의 축소 작업을 허용하도록 설정되어 있는지 확인하십시오. 참조 : mapred.reduce.tasks 참조). 클러스터 또는 작업 구성). 차이점은 프레임 워크가 Java와 스트리밍을 사용할 때 좀 더 멋지게 패키징한다는 것입니다.

Java의 경우 축소 작업은 특정 키의 모든 값에 대한 반복자를 가져옵니다. 이렇게하면 reduce 작업에서 맵 출력을 합산하는 경우 값을 쉽게 둘러 볼 수 있습니다. 스트리밍에서는 말 그대로 키 - 값 쌍의 스트림을 얻습니다. 이며 값은 키순으로 정렬되며 지정된 키의 값은 축소 작업을 통해 분할되지 않지만 필요한 모든 상태 추적은 사용자가 결정합니다. 예를 들어, 자바지도 출력

키 1, {val1과은을 val2, val3} 키 2, {val7, val8} 스트리밍

, 당신의 출력 대신

과 같은 형태로 상징적으로 당신의 감속기에 온다 각 키에 대한 값의 합계를 계산하는 감속기를 작성하는

키 1, val1과 키 1을 val2 키 1, val3 키 2, val7 키 2, 예를 들어 val8

는, 당신은 변수가 필요합니다 마지막을 저장하다 당신이 본 열쇠와 합계를 저장하는 변수. 새 키 - 값 쌍을 읽을 때마다 다음을 수행합니다.

  1. 키가 마지막 키와 다른지 확인하십시오.
  2. 그렇다면 키와 현재 합계를 출력하고 합계를 0으로 재설정하십시오.
  3. 합계에 현재 값을 추가하고 마지막 키를 현재 키로 설정하십시오.

HTH.

1

Hadoop을 직접 스트리밍 해 보지 않았지만 문서를 읽으면 비슷한 병렬 동작을 얻을 수 있다고 생각합니다.

연관된 값이있는 키를 각 감속기에 전달하는 대신 스트리밍은 키로 매퍼 출력을 그룹화합니다. 또한 동일한 키가있는 값이 여러 개의 축소기에 분할되지 않도록합니다. 이것은 일반적인 Hadoop 기능과는 다소 다르지만, 축소 작업은 여러 개의 축소기에 분산됩니다.

-verbose 옵션을 사용하여 실제로 진행되고있는 작업에 대한 자세한 정보를 얻으십시오. -D mapred.reduce.tasks=X 옵션으로 실험 해 볼 수도 있습니다. 여기서 X는 원하는 리듀서 수입니다.