문제

루비의 간단한 WordCount 감소기는 다음과 같습니다.

#!/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 예제에서는이 인터페이스를 보았습니다. 이는 감소되기 전에 키에 의해 그룹화되고 감소기가 병렬로 실행될 수 있음을 의미합니다.

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 스트리밍으로 할 수 있습니까?

도움이 되었습니까?

해결책

스트리밍을 사용하는지 여부에 관계없이 감속기는 항상 병렬로 실행됩니다 (이 보이지 않으면 작업 구성이 여러 번 줄어드는 작업을 허용하도록 설정되어 있는지 확인하십시오. 클러스터 또는 작업 구성의 Mapred.reduce.tasks를 참조하십시오. ). 차이점은 프레임 워크가 Java 대 스트리밍을 사용할 때 당신을 위해 조금 더 잘 포장한다는 것입니다.

Java의 경우 감소 작업은 특정 키의 모든 값에 반복기를 가져옵니다. 이렇게하면 작업 감소 작업에서 맵 출력을 합산하면 값을 쉽게 걸을 수 있습니다. 스트리밍에서 문자 그대로 키 값 쌍의 스트림을 얻습니다. 너 ~이다 값은 키에 의해 주문되며 주어진 키의 경우 감소 작업을 통해 분할되지 않지만 필요한 상태 추적은 귀하에게 달려 있습니다. 예를 들어, Java에서는 맵 출력이 형식의 상징적으로 감속기에 제공됩니다.

key1, {val1, val2, val3} key2, {val7, val8}

스트리밍을 사용하면 출력이 대신 나타납니다

KEY1, VAL1 KEY1, VAL2 KEY1, VAL3 KEY2, VAL7 KEY2, VAL8

예를 들어, 각 키에 대한 값의 합을 계산하는 감소기를 작성하려면 마지막 키를 저장하려면 변수와 합을 저장하는 변수가 필요합니다. 새로운 키 값 쌍을 읽을 때마다 다음을 수행합니다.

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

HTH.

다른 팁

나는 Hadoop이 스스로 스트리밍을 시도하지 않았지만 문서를 읽음으로써 비슷한 병렬 행동을 달성 할 수 있다고 생각합니다.

관련 값이있는 키를 각 감속기에 전달하는 대신 스트리밍은 맵퍼 출력을 키로 그룹화합니다. 또한 동일한 키를 가진 값이 여러 리더기에 분할되지 않도록 보장합니다. 이것은 정상적인 Hadoop 기능과 다소 다르지만, 그럼에도 불구하고 감소 작업은 다중 감속기에 분포됩니다.

사용해보십시오 -verbose 실제로 무슨 일이 일어나고 있는지에 대한 자세한 정보를 얻는 옵션. 당신은 또한 실험을 시도 할 수 있습니다 -D mapred.reduce.tasks=X 여기서 X는 원하는 수의 감속기 수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top