2011-11-05 4 views
9

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

<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"); 

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

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. 

업데이트 : 맵퍼로 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. 

업데이트 : 메모리 사용의 구성 형식을 변경하는 original JIRA 특히 자바 사용자가 래싱을 방지하기 위해 물리적 메모리에 주로 관심이 있음을 언급하고있다. 나는 이것이 내가 원하는 바라고 생각한다. 부적절한 물리적 메모리를 사용할 수 있다면 노드가 매퍼를 위로 올리는 것을 원하지 않는다. 그러나 이러한 옵션은 모두 관리하기 어려운 가상 메모리 제약 조건으로 구현 된 것 같습니다.

+0

궁금한 점 - mapred.child.java.opts/-Xmx 및 mapred.job.map.memory.mb/mapred.job.reduce.memory.mb를 사용하여 최대 메모리를 설정하는 것과는 어떤 차이가 있습니까? SO (http://goo.gl/aIBLr)에서 검색어를 제기했지만 응답이 없습니다. –

답변

6

ulimit을 확인하십시오. 버전 0.20.2에 Cloudera,하지만에서 유사한 문제는 아마도 이후 버전의 적용

을 ... 당신은 mapred.child.ulimit을 설정하면, 그것은 더 2 배 힙해야하는 것이 중요합니다 mapred.child.java.opts에 설정된 크기 값. 예제의 경우 1G 힙을 설정하면 mapred.child.ulimit를 2.5GB로 설정하십시오. 자식 프로세스는 적어도 한 번 이상 fork 할 수 있으며 fork 은 순간적으로 가상 메모리에 두 배의 오버 헤드가 필요합니다.

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

+1

'ulimit'은'mapred.job.reduce.memory.mb'보다 엄격한 제약이며 내 설치에는 설정되어 있지 않은 것으로 보입니다. 그러나 얼마나 많은 VM이 허용할만한 유용한 참고 자료입니다 ... – schmmd