복붙노트

[HADOOP] hadoop으로 메모리 제한 지정하기

HADOOP

hadoop으로 메모리 제한 지정하기

Hadoop 클러스터 (0.20.203)에서 높은 메모리 작업을 실행하려고합니다. 일부 메모리 제한을 적용하기 위해 mapred-site.xml을 수정했습니다.

  <property>
    <name>mapred.cluster.max.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.max.reduce.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapred.cluster.map.memory.mb</name>
    <value>2048</value>
  </property>
  <property>
    <name>mapred.cluster.reduce.memory.mb</name>
    <value>2048</value>
  </property>

제 직업에서 나는 얼마나 많은 기억이 필요한지를 지정하고 있습니다. 불행히도 -Xmx2g (내 작업을 콘솔 응용 프로그램으로이 많은 메모리로 잘 실행됩니다)로 프로세스를 실행하더라도 내 매퍼에 대해 훨씬 더 많은 메모리를 요청해야합니다 (하위 쿼리로, 왜 이럴까요?) 또는 살해됐다.

val conf = new Configuration()
conf.set("mapred.child.java.opts", "-Xms256m -Xmx2g -XX:+UseSerialGC");
conf.set("mapred.job.map.memory.mb", "4096");
conf.set("mapred.job.reduce.memory.mb", "1024");

감속기는 신원 감속기를 수행하고 있기 때문에 거의 메모리가 필요하지 않습니다.

  class IdentityReducer[K, V] extends Reducer[K, V, K, V] {
    override def reduce(key: K,
        values: java.lang.Iterable[V],
        context:Reducer[K,V,K,V]#Context) {
      for (v <- values) {
        context write (key, v)
      }
    }
  }

그러나 감속기는 여전히 많은 메모리를 사용하고 있습니다. 감속기에 매퍼보다 다른 JVM 인수를 제공 할 수 있습니까? Hadoop은 감속기를 죽이고 3960MB의 메모리를 사용한다고 주장합니다! 그리고 감속기는 결국 실패하게됩니다. 이것이 어떻게 가능한지?

TaskTree [pid=10282,tipID=attempt_201111041418_0005_r_000000_0] is running beyond memory-limits.
Current usage : 4152717312bytes.
Limit : 1073741824bytes.
Killing task.

업데이트 : mapper로 cat을 사용하여 스트리밍 작업을 지정하고 감속기로 uniq를 지정하고 -Xms512M -Xmx1g -XX : UseSerialGC로 작업 할 때도 가상 메모리 2g 이상을 차지합니다! 이것은 최대 힙 크기의 4 배에서 사치스럽게 보인다.

TaskTree [pid=3101,tipID=attempt_201111041418_0112_m_000000_0] is running beyond memory-limits.
Current usage : 2186784768bytes.
Limit : 2147483648bytes.
Killing task.

업데이트 : 메모리 사용량에 대한 설정 포맷을 변경하기위한 원래 JIRA는 스레 싱을 방지하기 위해 Java 사용자가 대부분 실제 메모리에 관심이 있다고 언급했습니다. 이것이 정확히 내가 원하는 것 같아요 : 사용할 수있는 물리적 메모리가 부적절한 경우 노드가 매퍼를 회전 시키길 원하지 않습니다. 그러나 이러한 옵션은 모두 관리하기 어려운 가상 메모리 제약 조건으로 구현 된 것 같습니다.

해결법

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

    1.ulimit을 확인하십시오. Cloudera에서 버전 0.20.2로 출시되었지만 유사한 문제가 이후 버전에도 적용될 수 있습니다.

    ulimit을 확인하십시오. Cloudera에서 버전 0.20.2로 출시되었지만 유사한 문제가 이후 버전에도 적용될 수 있습니다.

    프로그래밍 방식으로 mapred.child.java.opts를 "너무 늦게 설정"할 수도 있습니다. 실제로 적용되는지 확인한 다음 mapred-site.xml에 넣으십시오.

  2. from https://stackoverflow.com/questions/8017500/specifying-memory-limits-with-hadoop by cc-by-sa and MIT license