Out of memory error in Mapreduce shuffle phase
www.recopick.com

안녕하세요. RecoPick 팀의 김성민 입니다.

이번에는 Hadoop Job Counter 제한 초과 오류에 이어서 Hadoop map-reduce 작업 중 발생하는 OOM (Out of memory) 에러에 대해서 공유 드리고자 합니다. 


현상


syslog logs

2014-04-28 18:38:05,051 FATAL org.apache.hadoop.mapred.Task: attempt_201402170624_239030_r_000008_0 : Map output copy failure : java.lang.OutOfMemoryError: Java heap space
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1640)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.access$3000(ReduceTask.java:1197)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier.shuffle(ReduceTask.java:2364)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1511)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1360)
        at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1292)



원인


Hadoop map-reduce 작업은 아래 그림과 같이 4단계로 이루어지는데, 


Figure 1. Shffle and sort in MapReduce



map 태스크의 결과가 reduce 태스크로 복사될 때, map의 결과 데이터 치수가 작을 경우, reduce 태스크의 JVM 메모리에 복사됩니다. 
그런데 reduce 태스크의 JVM 메모리가 작은 경우, 위와 같이 Out Of Memory Error가 발생합니다. 
reduce 태스크의 JVM 메모리로 복사될 수 있는 map 태스크의 데이터 치수는 mapred.job.shuffle.input.buffer.percent (default 값은 0.70) 설정으로 조정 가능합니다.  

해결 방법


reduce 태스크의 JVM 메모리에 맞게 mapred.job.shuffle.input.buffer.percent 값을 0.70 -> 0.20 으로 설정해서 map-reduce 작업을 수행하도록 하였습니다.

[참고 자료]

(1) 7 Deadly Hadoop Misconfigurations  by Kate Ting, Cloudera
http://archive.apachecon.com/na2013/presentations/27-Wednesday/Big_Data/14:45-7_Deadly_Hadoop_Misconfigurations-Kathleen_Ting/HadoopTroubleshootingApacheCon.pdf
http://files.meetup.com/12611842/03-27-14-Cloudera.pdf

(2) Hadoop Troubleshooting 101 by Kate Ting, Cloudera
http://www.slideshare.net/cloudera/hadoop-troubleshooting-101-kate-ting-cloudera

(3) Hadoop: The Definitive Guide, 3rd Edition 




Posted by recopick

댓글을 달아 주세요