Hadoop 학습노트(3): Combiner funcitons

6243 단어 hadoop
많은 맵Reduce 프로그램은 집단에서 사용할 수 있는 대역폭에 제한을 받기 때문에 맵과 Reduce 작업 사이에 전송해야 하는 중간 데이터를 최소화하려고 노력합니다.Hadoop은 맵의 출력을 처리하기 위해combiner function을 표시하고, 맵에 대한 처리 결과를 Reduce의 입력으로 사용할 수 있도록 합니다.combinerfunction 자체는 최적화일 뿐이기 때문에hadoop은 특정한 맵 출력에 대해 이 방법이 몇 번이나 호출될지 보장하지 않습니다.다시 말하면,combinerfunction이 몇 번 호출되었든지 간에, 대응하는reduce 출력 결과는 똑같아야 한다.
다음은 학습 노트 (1)의 예로 1950년의 날씨 데이터 읽기가 두 개의 맵으로 이루어졌다고 가정하면 첫 번째 맵의 출력은 다음과 같다. (1950, 0)(1950, 20)(1950, 10)
두 번째 맵의 출력은 (1950, 25) (1950, 15)
반면reduce가 얻은 입력은 (1950, [0, 20, 10, 25, 15]), 출력은 (1950, 25)
25는 집합 중의 최대치이기 때문에 우리는 Reduce function과 유사한combiner function을 사용하여 매 맵 출력의 최대치를 찾을 수 있다. 그러면 Reduce의 입력은 (1950,[20,25])
각 funciton은 온도값의 처리 과정에 대해 다음과 같이 표시할 수 있다. max(0, 20, 10, 25, 15) = max(0, 20, 10), max(25, 15) = max(20, 25) = 25
주의: 모든 함수가 이 속성을 가지고 있는 것은 아니다. (이 속성이 있는 함수는 우리가commutative와associative라고 부른다). 예를 들어 우리가 평균 온도를 계산하려면combiner function을 이렇게 사용할 수 없다. 왜냐하면mean(0,20,10,25,15) = 14,mean(0,20,10),mean(25,15) =mean(10,20)= 15
combiner function은 Reduce function을 대체할 수 없습니다. (reduce function 처리가 서로 다른 맵에서 온 같은 키를 가진 기록이 필요하기 때문입니다.)그러나 맵과reduce 사이에서 전송해야 하는 데이터를 줄이는 데 도움을 줄 수 있다는 점에서combinerfunction은 고려할 만하다.

Combiner 기능 선언


이제 우리는 학습 노트 (1)의mapreduce 프로그램으로 돌아왔다. 이 프로그램에 대해combiner의 실현은 Reducer의 실현과 같다. 유일한 변화는 Job에서Combiner의 구체적인 실현 클래스를 설정하는 것이다. (즉, Reducer 클래스, 코드는 아래의 밑줄 부분을 보십시오.)  
 1 public class MaxTemperatureWithCombiner {

 2   public static void main(String[] args) throws Exception {

 3     if (args.length != 2) {

 4        System.err.println("Usage: MaxTemperatureWithCombiner <input path> " +

 5              "<output path>");

 6        System.exit(-1);

 7     }

 8     Job job = new Job();

 9     job.setJarByClass(MaxTemperatureWithCombiner.class);

10     job.setJobName("Max temperature");

11 

12     FileInputFormat.addInputPath(job, new Path(args[0]));

13     FileOutputFormat.setOutputPath(job, new Path(args[1]));

14 

15     job.setMapperClass(MaxTemperatureMapper.class);

16     job.setCombinerClass(MaxTemperatureReducer.class); 17     job.setReducerClass(MaxTemperatureReducer.class);

18 

19     job.setOutputKeyClass(Text.class);

20     job.setOutputValueClass(IntWritable.class);

21 

22     System.exit(job.waitForCompletion(true) ? 0 : 1);

23   }

24 }

전재 출처 기재: http://www.cnblogs.com/beanmoon/archive/2012/12/09/2805684.html

좋은 웹페이지 즐겨찾기