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

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의 메모리는 내지도 / 축소 작업에 충분합니다. 컨테이너에 더 많은 메모리를 할당하면 작업이 더 많이 사용하는 이유는 무엇입니까? 각 작업이 더 많은 분할을 받기 때문입니까? 더 많은 작업이 병렬로 실행되도록 컨테이너 크기를 조금 줄이고 더 많은 컨테이너를 만드는 것이 더 효율적이라고 생각합니다. 문제는 각 컨테이너에 처리 할 수있는 것보다 더 많은 분할이 할당되지 않도록하려면 어떻게해야합니까?



답변

또한 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 질문 을 확인할 수 있습니다 .


답변

가상 및 실제 메모리 사용 비율에 대해 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>


답변

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


답변

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


답변

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"
    }
  }
]


답변

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

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


답변

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

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