복붙노트

[HADOOP] Mapreduce shuffle 단계의 메모리 부족 오류

HADOOP

Mapreduce shuffle 단계의 메모리 부족 오류

단어 수 계산과 같은 mapreduce 프로그램을 실행하는 동안 이상한 오류가 발생합니다. 나는 각각 20GB의 RAM을 가진 20 개의 슬레이브가있는 클러스터를 가지고있다. 내지도 작업을 300MB의 힙을 갖도록 구성했고 줄이기 작업 슬롯은 1GB를 얻습니다. 2 개의 맵 슬롯과 1 개의 노드 당 하나의 슬롯을 줄입니다. 지도 작업의 첫 번째 라운드가 끝날 때까지 모든 것이 잘 진행됩니다. 그런 다음 100 %로 진행됩니다. 복사 단계가 진행되고 있다고 가정합니다. 각지도 작업은 다음과 같은 것을 생성합니다.

Map output bytes    4,164,335,564
Map output materialized bytes   608,800,675

(나는 압축을 위해 SnappyCodec을 사용하고있다)

약 1 시간 동안 정지 한 후에는 다음과 같은 예외를 제외하고 작업을 줄입니다.

    Error: java.lang.OutOfMemoryError: Java heap space at  
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1703) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1563) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1401) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1333

나는 인터넷 검색을하고 있었지만이 링크를 찾았지만 무엇을 만들지 정말로 모르겠습니다. hadoop 공통 링크

나는 왜 hadoop이 테라 영역 벤치 마크를 수행 할 수 있다면 복사 및 병합에 문제가 발생하는지 이해하지 못합니다. 모든지도 출력이 감속기 스레드의 RAM에 맞아야한다는 것은 아닙니다. 그럼 여기서 뭐하고있는거야?

위에 제공된 링크에서 다음 매개 변수 조정에 대한 토론이 있습니다.

mapreduce.reduce.shuffle.input.buffer.percent = 0.7
mapreduce.reduce.shuffle.memory.limit.percent = 0.25
mapreduce.reduce.shuffle.parallelcopies = 5

그들은 매개 변수의 결과가> 1이라는 사실이 heapsize 오류를 허용한다고 주장합니다. 편집 : 참고 5 * 1.25 * 0.7 그래서 여전히 두 번째 솔루션 게시물에 초점을 맞 춥니 다!) 이 집중적 인 시뮬레이션을 재시작하기 전에 나는 거의 일주일 동안 괴롭히기 때문에 내가 직면하고있는 문제에 관한 누군가의 의견을 듣고 매우 행복 할 것입니다. 또한이 복사 단계에서 어떤 일이 일어나고 있는지 완전하게 이해하지 못하는 것 같습니다. 디스크의 병합 정렬이 많은 힙 크기를 필요로하지 않을 것으로 기대합니까?

도움이되는 의견과 답변을 미리 보내 주셔서 감사합니다.

해결법

  1. ==============================

    1.단서 단계에서 감소 작업의 힙이 거의 완전히 필요하다는 단서가 있다고 생각합니다. 그러나 셔플 단계는 동일한 힙 공간에 대해 경쟁하고 있습니다. 충돌로 인한 일자리가 파손되었습니다. Shuffle.input.buffer.percent를 낮추면 왜 더 이상 작업이 중단되지 않는지 설명합니다.

    단서 단계에서 감소 작업의 힙이 거의 완전히 필요하다는 단서가 있다고 생각합니다. 그러나 셔플 단계는 동일한 힙 공간에 대해 경쟁하고 있습니다. 충돌로 인한 일자리가 파손되었습니다. Shuffle.input.buffer.percent를 낮추면 왜 더 이상 작업이 중단되지 않는지 설명합니다.

  2. ==============================

    2.mapred.job.shuffle.input.buffer.percent를 인용 한 매개 변수는 분명히 하둡 2 이전 매개 변수입니다. 필자는 1.04 워드 프로세서마다 mapred-default.xml에서 해당 매개 변수를 찾을 수 있었지만 이름은 2.2.0 워드 프로세서마다 mapreduce.reduce.shuffle.input.buffer.percent로 변경되었습니다.

    mapred.job.shuffle.input.buffer.percent를 인용 한 매개 변수는 분명히 하둡 2 이전 매개 변수입니다. 필자는 1.04 워드 프로세서마다 mapred-default.xml에서 해당 매개 변수를 찾을 수 있었지만 이름은 2.2.0 워드 프로세서마다 mapreduce.reduce.shuffle.input.buffer.percent로 변경되었습니다.

    문서 당 매개 변수의 설명은 다음과 같습니다.

    Sort and Shuffle에 대한 완전한 이해를 위해서는 Hadoop Definitive Guide의 6.4 장을보십시오. 이 책은 mapred.job.shuffle.input.buffer.percent 매개 변수의 대체 정의를 제공합니다.

    mapred.job.shuffle.input.buffer.percent의 값을 0.7에서 0.2로 줄이면 문제가 해결된다는 것을 관찰했기 때문에 문제의 해결을 도울 수 있다고 말하는 것이 안전합니다. 감속기의 힙 크기.

  3. ==============================

    3.shuffle.input.buffer.percent를 0.2로 변경 한 후에도 나에게는 효과가 없으며 동일한 오류가 발생합니다.

    shuffle.input.buffer.percent를 0.2로 변경 한 후에도 나에게는 효과가 없으며 동일한 오류가 발생합니다.

    단일 노드 클러스터에서 히트 앤 트라이얼을 한 후에, 프로세스가 엎질러 졌을 때 그 공간을 사용하기 때문에 / 디렉토리에 충분한 공간이 필요하다는 것을 알게되었습니다.

    유출 디렉토리도 변경해야합니다.

  4. ==============================

    4.관련 버그 - https://issues.apache.org/jira/browse/MAPREDUCE-6724

    관련 버그 - https://issues.apache.org/jira/browse/MAPREDUCE-6724

    계산 된 maxSingleShuffleLimit> MAX_INT 인 경우 NegativeArraySizeException이 발생할 수 있습니다.

  5. from https://stackoverflow.com/questions/19298357/out-of-memory-error-in-mapreduce-shuffle-phase by cc-by-sa and MIT license