안녕하세요. 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 spaceat 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
'Engineering' 카테고리의 다른 글
가벼운 PC/모바일 겸용 자바스크립트 Swipe Library, RecoPick Swipe (2) | 2014.07.03 |
---|---|
MySQL InnoDB Replication Lag 줄이기 (0) | 2014.05.09 |
Out of memory error in Mapreduce shuffle phase (0) | 2014.05.08 |
Python boto 로 AWS EMR 사용하기 (0) | 2014.04.28 |
Hadoop Job Counter 개수 제한 초과 오류 (0) | 2014.04.14 |
DynamoDB의 Write Capacity를 낮춰서 DynamoDB 비용 줄이기 (0) | 2014.03.30 |