작은 테이블과 큰 비뚤어진 테이블간에 간단한 돼지 조인을합니다. 우리가 mapred.job.shuffle.input.buffer.percent=0.30
로 변경하는 경우mapred.job.shuffle.input.buffer.percent = 0.70 일 때 pig join은 감속기에서 OutOfMemoryError를 얻습니다.
org.apache.hadoop.mapred.Task: attempt_201305151351_21567_r_000236_0 :
Map output copy failure : java.lang.OutOfMemoryError: GC overhead limit exceeded
가 잘 완료 : 우리 때문에 또 다른 버그 (pig skewed join with a big table causes "Split metadata size exceeded 10000000") :(우리가 기본 mapred.job.shuffle.input.buffer.percent=0.70
우리 이경 일부는 셔플 단계에서 실패를 사용하는 경우
가 "using skewed"
을 사용할 수 없습니다
SpillableMemoryManager: first memory handler call-
Usage threshold init = 715849728(699072K) used = 504241680(492423K) committed = 715849728(699072K) max = 715849728(699072K)
는 이유는 무엇입니까 :이 같은 로그 2시간에 있지만 (우리가 사용하는 1000 감속기 중 3 보온재 감속기가있다), 우리는 지체 감속기에서 볼 수 이 일이 일어날까요? 셔플 입력 버퍼가 70 %에있을 때 SplilableMemoryManager가 어떻게 우리를 보호하지 못하게합니까?
매우 자세히 설명해 주셔서 감사합니다. 그래서 기본적으로 SpillableMemoryManager는 돼지 기능이므로 내 문제와 아무런 관련이 없습니다. 내 문제는 자체 RAM 관리자를 사용하고있는 그 아래의 hadoop 수준에 있습니다. S0와 S1에서 너무 많은 메모리를 차지하는 것이 무엇인지 짐작할 수 있습니까? 셔플 스테이지가 RAM 관리자를 사용한다면, 이것은 메모리의 유일한 큰 요소가 될 것이며, 큰 객체는 다른 메모리를 차지하지 않을 것이라고 기대합니다. – ihadanny
예, SpillableMemoryManager는 문제와 아무 관련이 없습니다. S0, S1, Eden 및 Old Space 사이의 관계를 명확하게 설명하기는 다소 어렵습니다. GC가 발생하면 Eden의 일부 살아있는 객체가 S0/S1 또는 Old로 복사됩니다. 따라서 S0/S1/Old는 이러한 객체를 보관할 여유 공간이 필요합니다. 그래서 JVM은 생각보다 많은 메모리가 필요합니다.최종 질문에 대한 대답은 일반적으로 예입니다. 그러나 ReduceTask.java에서 일부 코드를 변경하면이 가정이 깨질 수 있습니다. –
위의 답변을 업데이트했습니다. combine()가 메모리를 소비하는 경우 추가 큰 객체가 셔플 페이즈에 존재할 수 있습니다. –