Combiner는 Map 프로그램에서 나온 출력에 대해서 리듀스로 보내기 위한 셔플링/소팅이 발생하기 전에 리듀서를 적용하는 것으로 Mini-Reducer 라고 하기도 한다. Combiner는 Map-Reduce 에서 필수적으로 필요한 것은 아니지만 Combiner를 적용하면 성능 개선이 가능하다.
리듀서로 출력을 보내기 전에 맵 출력단에서 리듀서 프로그램을 적용하여 리듀서로 가는 데이터의 크기를 줄이는게 가능하다.
http://alnova2.tistory.com/776 의 WordCount의 Main 함수에 다음과 같이 Combiner를 지정해 보자.
public static void main(String[] args) throws Exception { job.setJarByClass(WordCount.class); FileInputFormat.addInputPath(job, new Path(args[0])); job.waitForCompletion(true); |
실제 실행해 보면 http://alnova2.tistory.com/776 에서의 출력 결과가 다음과 같이 달라진다.
Combiner 적용 전 | Combiner 적용 후 |
Map-Reduce Framework |
Map-Reduce Framework Map output materialized bytes=337557364 Map input records=2099659 Reduce shuffle bytes=328482946 Spilled Records=122860130 Map output bytes=5745757790 CPU time spent (ms)=1102410 Total committed heap usage (bytes)=7865761792 Combine input records=475839838 SPLIT_RAW_BYTES=4180 Reduce input records=11053415 Reduce input groups=7094943 Combine output records=76493781 Physical memory (bytes) snapshot=9413738496 Reduce output records=7094943 Virtual memory (bytes) snapshot=26577494016 Map output records=410399472 |
Map의 출력단과 리듀스의 입력이 상당한 차이를 보이고 네트워크 상에서의 전송을 생각할때 성능 개산선이 꽤 이루어질 것으로 예상된다.