복붙노트

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

HADOOP

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

Hadoop v1에서는 매 매퍼 (mapper)와 리듀서 슬롯 (reducer slot)을 1GB 크기로 할당했습니다. 내 컴퓨터에는 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의 메모리 내지도 / 줄일 작업에 충분하다. 컨테이너에 더 많은 메모리를 할당하는 이유는 더 많이 사용합니까? 각 작업이 더 많은 분할을하기 때문에 그렇습니까? 컨테이너의 크기를 조금 줄이고 더 많은 컨테이너를 만들어 더 많은 작업을 병렬로 실행하는 것이 더 효율적이라고 생각합니다. 문제는 각 컨테이너가 처리 할 수있는 것보다 많은 분할을 할당받지 않도록하려면 어떻게해야합니까?

해결법

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

    1.또한 MapReduce의 최대 메모리 할당을 올바르게 구성해야합니다. 이 HortonWorks 튜토리얼 :

    또한 MapReduce의 최대 메모리 할당을 올바르게 구성해야합니다. 이 HortonWorks 튜토리얼 :

    그것을 요 ​​약하기:

    마지막으로 비슷한 문제 (및 해결 방법)를 설명하는 다른 SO 질문을 확인하는 것이 좋습니다.

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

    2.Vertual 및 Physical 메모리 사용 비율에 대한 Yarn 수준의 검사가 있습니다. VM에 충분한 물리적 메모리가없는 것은 아닙니다. 그러나 가상 메모리 사용량이 주어진 실제 메모리에 대해 예상보다 많기 때문입니다.

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

    참고 : 가상 메모리를 적극적으로 할당했기 때문에 CentOS / RHEL 6에서이 문제가 발생합니다.

    다음 중 한 가지 방법으로 해결할 수 있습니다.

    참고 문헌 :

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

    http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-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>
    
  3. ==============================

    3.EMR에서 HIVE를 사용하여 정말 비슷한 문제가 발생했습니다. 현존하는 해결책 중 아무 것도 나를 위해 일하지 않았습니다. 즉, mapreduce 구성 중 어느 것도 나를 위해 일하지 않았습니다. 둘 다 yarn.nodemanager.vmem-check-enabled를 false로 설정하지 않았습니다.

    EMR에서 HIVE를 사용하여 정말 비슷한 문제가 발생했습니다. 현존하는 해결책 중 아무 것도 나를 위해 일하지 않았습니다. 즉, mapreduce 구성 중 어느 것도 나를 위해 일하지 않았습니다. 둘 다 yarn.nodemanager.vmem-check-enabled를 false로 설정하지 않았습니다.

    그러나 일을 끝낸 것은 tez.am.resource.memory.mb를 설정하는 것이 었습니다. 예를 들면 다음과 같습니다.

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

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

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

    4.나는 낮은 평판으로 인해 대답에 대해서는 언급 할 수 없다. 그러나이 동작은 의도적으로 추가하는 싶습니다. NodeManager가 컨테이너를 죽이고 있습니다. map-reduce 작업의 자식 프로세스로 실행중인 hadoop 스트리밍을 사용하려는 것 같습니다. 노드 관리자는 작업의 전체 프로세스 트리를 모니터링하고 mapreduce.map.memory.mb 또는 mapreduce.reduce.memory.mb의 최대 설정보다 많은 메모리를 사용하는 경우 Nodemanager가 작업을 죽일 것으로 예상합니다. 당신의 작업은 원하지 않는 다른 컨테이너에 속한 메모리를 훔쳐 가고 있습니다.

    나는 낮은 평판으로 인해 대답에 대해서는 언급 할 수 없다. 그러나이 동작은 의도적으로 추가하는 싶습니다. NodeManager가 컨테이너를 죽이고 있습니다. map-reduce 작업의 자식 프로세스로 실행중인 hadoop 스트리밍을 사용하려는 것 같습니다. 노드 관리자는 작업의 전체 프로세스 트리를 모니터링하고 mapreduce.map.memory.mb 또는 mapreduce.reduce.memory.mb의 최대 설정보다 많은 메모리를 사용하는 경우 Nodemanager가 작업을 죽일 것으로 예상합니다. 당신의 작업은 원하지 않는 다른 컨테이너에 속한 메모리를 훔쳐 가고 있습니다.

  5. ==============================

    5.EMR에서 스파크로 작업하는 동안 동일한 문제가 있었으며 maximumizeResourceAllocation = true로 설정하면 트릭을 수행했습니다. 누군가가 도움이되기를 바랍니다. 클러스터를 만들 때 설정해야합니다. EMR 문서에서 :

    EMR에서 스파크로 작업하는 동안 동일한 문제가 있었으며 maximumizeResourceAllocation = 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"
        }
      }
    ]
    
  6. ==============================

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

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

  7. from https://stackoverflow.com/questions/21005643/container-is-running-beyond-memory-limits by cc-by-sa and MIT license