컨테이너가 메모리 제한을 초과하여 실행 중입니다.


85

Hadoop v1에서는 크기가 1GB 인 7 개의 매퍼와 감속기 슬롯을 각각 할당했으며 매퍼 및 감속기가 정상적으로 실행됩니다. 내 컴퓨터에는 8G 메모리, 8 프로세서가 있습니다. 이제 YARN을 사용하여 동일한 시스템에서 동일한 응용 프로그램을 실행할 때 컨테이너 오류가 발생했습니다. 기본적으로 다음 설정이 있습니다.

  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>

오류가 발생했습니다.

Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

그런 다음 mapred-site.xml에서 메모리 제한을 설정하려고했습니다.

  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
  </property>

하지만 여전히 오류가 발생합니다.

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.

지도 작업에 이렇게 많은 메모리가 필요한 이유가 혼란 스럽습니다. 내 이해에 따르면 1GB의 메모리는 내지도 / 축소 작업에 충분합니다. 컨테이너에 더 많은 메모리를 할당하면 작업이 더 많이 사용하는 이유는 무엇입니까? 각 작업이 더 많은 분할을 받기 때문입니까? 더 많은 작업이 병렬로 실행되도록 컨테이너 크기를 조금 줄이고 더 많은 컨테이너를 만드는 것이 더 효율적이라고 생각합니다. 문제는 각 컨테이너에 처리 할 수있는 것보다 더 많은 분할이 할당되지 않도록하려면 어떻게해야합니까?



안녕하세요 ! 구성 'yarn.nodemanager.vmem-pmem-ratio = 2'?
sprite

답변:


102

또한 MapReduce에 대한 최대 메모리 할당을 올바르게 구성해야합니다. 에서 이 호튼 웍스 튜토리얼 :

[...]

클러스터의 각 머신에는 48GB의 RAM이 있습니다. 이 RAM 중 일부는 운영 체제 사용을 위해> 예약되어야합니다. 각 노드에서> YARN에 대해 40GB RAM을 할당하고 운영 체제에 대해 8GB를 유지합니다.

예제 클러스터의 경우 컨테이너 (yarn.scheduler.minimum-allocation-mb) = 2GB에 대한 최소 RAM이 있습니다. 따라서 Map 작업 컨테이너에 4GB를 할당하고 Reduce 작업 컨테이너에 8GB를 할당합니다.

mapred-site.xml에서 :

mapreduce.map.memory.mb: 4096

mapreduce.reduce.memory.mb: 8192

각 컨테이너는 매핑 및 축소 작업을 위해 JVM을 실행합니다. JVM 힙 크기는 위에서 정의한 Map 및 Reduce 메모리보다 낮게 설정하여 YARN에서 할당 한 컨테이너 메모리의 경계 내에 있어야합니다.

mapred-site.xml에서 :

mapreduce.map.java.opts: -Xmx3072m

mapreduce.reduce.java.opts: -Xmx6144m

위의 설정 은 매핑 및 축소 작업이 사용할 물리적 RAM의 상한을 구성합니다 .

그것을 요 ​​약하기:

  1. YARN에서는 mapreduce구성이 아닌 구성 을 사용해야 mapred합니다. 수정 : 질문을 수정 했으므로이 댓글은 더 이상 적용되지 않습니다.
  2. 구성하는 것은 실제로 할당 할 최대 값이 아니라 요청하려는 양입니다.
  3. 최대 제한은 java.opts위에 나열된 설정 으로 구성됩니다 .

마지막으로 유사한 문제 (및 솔루션)를 설명하는 이 다른 SO 질문 을 확인할 수 있습니다 .


예. 내 문제 를 설정 mapreduce.map.java.opts하고 mapreduce.reduce.java.opts해결 함으로써 . 작업에 할당 된 실제 메모리가에 의해서만 정의되는지 알고 mapreduce.map/reduce.memory.mb있습니까? 어떻게 yarn.scheduler.minimum-allocation-mb실제 메모리 할당에 영향을 줍니까?
Lishu

@lishu, 도움이 되었다면 대답을 수락하십시오. 마지막 질문에 대해 원사 설정은 클러스터의 모든 컨테이너 할당에 적용됩니다. 여기에는 매핑 및 축소 작업이 포함되지만 다른 유형의 응용 프로그램의 다른 작업도 포함됩니다. mapreduce 설정은 mapreduce 작업에만 적용됩니다.
cabad

@cabad, 나는 Lishu가 사용하는 lib를 개발합니다. MR 작업이 실제로 대부분의 메모리 (hadoop 스트리밍)를 할당하는 프로세스를 생성하고 있다는 것을 알고 있으므로 답변에서 변경 사항이 있는지 궁금합니다. 확실히 Xmx 설정은 자바 프로그램이 아니기 때문에 외부 프로세스에 영향을주지 않습니다. 당신의 도움을 주셔서 감사합니다.
piccolbo 2014 년

2
이제 Hortonworks의 편리한 도구 인 hdp-configuration-utils를 사용하여 권장 값을 얻을 수 있습니다. github.com/hortonworks/hdp-configuration-utils
selle

1
적절한 메모리 구성을 적용해도 문제가 해결되지 않으면 (실제로는 우분투에서 실행되는 hadoop에서 작동하지만 CentOS에서는 작동하지 않음) vmem 검사를 비활성화하십시오. blog.cloudera.com/blog/2014/04/…
Bakhshi

47

가상 및 실제 메모리 사용 비율에 대해 Yarn 수준에서 확인됩니다. VM에 충분한 물리적 메모리가 없다는 것이 문제가 아닙니다. 그러나 가상 메모리 사용량이 주어진 물리적 메모리에 대해 예상보다 많기 때문입니다.

참고 : 이것은 가상 메모리의 적극적인 할당으로 인해 Centos / RHEL 6에서 발생합니다.

다음 방법 중 하나로 해결할 수 있습니다.

  1. yarn.nodemanager.vmem-check-enabledfalse 로 설정 하여 가상 메모리 사용량 확인을 비활성화하십시오 .

  2. yarn.nodemanager.vmem-pmem-ratio 를 더 높은 값 으로 설정하여 VM : PM 비율을 높입니다.

참고 문헌 :

https://issues.apache.org/jira/browse/HADOOP-11364

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-sumption-gotchas/

yarn-site.xml에 다음 속성을 추가하십시오.

 <property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
  </property>
 <property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
  </property>

15

EMR에서 HIVE를 사용하는 것과 비슷한 문제가있었습니다. 현존하는 솔루션 중 어느 것도 저에게 효과가 없었습니다. 즉, mapreduce 구성이 저에게 효과가 없었습니다. 둘 다 yarn.nodemanager.vmem-check-enabled거짓으로 설정하지 않았습니다 .

그러나 결국 작동하는 것은 설정이었습니다 tez.am.resource.memory.mb.

hive -hiveconf tez.am.resource.memory.mb=4096

조정을 고려할 또 다른 설정은 yarn.app.mapreduce.am.resource.mb


Um @hiroprotagonist, YARN이 시작되기 전에 실 매개 변수를 "꼬임"해야하는지 아니면 적용시에만 사용되는지 (한 작업에서 다음 작업으로 변경 될 수 있는지) 알고 있습니까?
Judge Mental

1
신청 시간에 설정할 수있었습니다. 특히 하이브 대화 형 콘솔 내에서.
hiroprotagonist

8

평판이 낮아 받아 들여진 답변에 대해 언급 할 수 없습니다. 그러나 추가하고 싶습니다.이 동작은 의도적으로 설계된 것입니다. NodeManager가 컨테이너를 죽이고 있습니다. map-reduce 작업의 하위 프로세스로 실행되는 hadoop 스트리밍을 사용하려는 것 같습니다. NodeManager는 작업의 전체 프로세스 트리를 모니터링하고 각각 mapreduce.map.memory.mb 또는 mapreduce.reduce.memory.mb에 설정된 최대 값보다 더 많은 메모리를 사용하는 경우 Nodemanager가 작업을 종료 할 것으로 예상합니다. 당신의 임무는 당신이 원하지 않는 다른 컨테이너에 속한 메모리를 훔치는 것입니다.


1

EMR에서 spark로 작업하는 동안 동일한 문제가 발생했으며 설정 maximizeResourceAllocation=true이 트릭을 수행했습니다. 누군가에게 도움이되기를 바랍니다. 클러스터를 만들 때 설정해야합니다. 로부터 EMR 워드 프로세서 :

aws emr create-cluster --release-label emr-5.4.0 --applications Name=Spark \
--instance-type m3.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

myConfig.json이 말해야하는 위치 :

[
  {
    "Classification": "spark",
    "Properties": {
      "maximizeResourceAllocation": "true"
    }
  }
]

1

우리는 또한 최근에이 문제에 직면했습니다. 문제가 매퍼 메모리와 관련된 경우 확인해야 할 몇 가지 사항이 있습니다.

  • 컴 바이 너가 활성화되어 있는지 확인하십시오 . 그렇다면 모든 레코드 (매퍼의 출력)에 대해 리듀서 로직을 실행해야 함을 의미합니다. 이것은 메모리에서 발생합니다. 응용 프로그램에 따라 결합기를 활성화하는 것이 도움이되는지 확인해야합니다. 트레이드 오프는 'X'레코드 수에 대한 논리 감소를 위해 네트워크 전송 바이트와 소요 시간 / 메모리 / CPU 사이에 있습니다.
    • 컴 바이 너가 그다지 가치가 없다고 생각되면 비활성화하십시오.
    • 결합기가 필요하고 'X'가 엄청난 수 (예 : 수백만 개의 레코드) 인 경우 분할 논리 (기본 입력 형식의 경우 더 적은 블록 크기 사용, 일반적으로 1 블록 크기 = 1 분할)를 변경하여 적은 수의 레코드를 단일 매퍼.
  • 단일 매퍼에서 처리되는 레코드 수입니다. 이러한 모든 레코드 는 메모리에서 정렬 되어야합니다 (매퍼의 출력이 정렬 됨). 설정을 고려 mapreduce.task.io.sort.mb를 필요한 경우 더 높은 값 (기본 200MB가있다). mapred-configs.xml
  • 위의 방법 중 하나라도 도움이되지 않으면 매퍼 로직을 독립형 애플리케이션으로 실행하고 프로파일 러 (예 : JProfiler)를 사용하여 애플리케이션을 프로파일 링하고 메모리가 사용되는 위치를 확인하십시오. 이것은 당신에게 아주 좋은 통찰력을 줄 수 있습니다.

1

Ubunto OS가 설치된 Windows Linux 하위 시스템에서 yarn 실행, "가상 메모리 제한을 초과하여 실행 중, 컨테이너 종료"오류가 발생했습니다. yarn-site.xml 파일에서 가상 메모리 검사를 비활성화하여 문제를 해결했습니다.

<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> 

WSL에서 오류 메시지에는 어리석은 숫자가 있습니다 (적어도 나에게는) : "... is running over virtual memory limits. 현재 사용량 : 338.8MB의 2GB 실제 메모리 사용, 481.1GB의 4.2GB 가상 메모리 사용. 컨테이너를 죽이는 중 . "
Samik R

@SamikR 예, 비슷한 상황이 있습니다. 하둡 문제가 아니라 WSL 문제라고 생각합니다. 데모를 실제 Linux OS 컴퓨터로 전송해야 할 수도 있습니다
Bingoabs

0

개인적으로 확인하지는 않았지만 hadoop-yarn-container-virtual-memory-understanding-and-solving-container-is-running-beyond-virtual-memory-limits-errors는 매우 합리적으로 들립니다.

yarn.nodemanager.vmem-pmem-ratio더 높은 값 으로 변경하여 문제를 해결했으며 다음에 동의합니다.

덜 권장되는 또 다른 해결책은 yarn.nodemanager.vmem-check-enabled를 false로 설정하여 가상 메모리 검사를 비활성화하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.