2011-11-05 16 views
9

Próbuję uruchomić zadanie o wysokiej pamięci w klastrze Hadoop (0.20.203). Zmodyfikowałem mapred-site.xml, aby wymusić pewne limity pamięci.Określanie limitów pamięci za pomocą 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> 

W pracy określam, ile pamięci będę potrzebować. Niestety, mimo że uruchamiam mój proces za pomocą -Xmx2g (zadanie będzie działało dobrze przy tak dużej ilości pamięci jako aplikacji konsolowej), muszę zażądać znacznie więcej pamięci dla mojego programu odwzorowującego (jako podpytanie, dlaczego to jest?) Lub jest ono zabity.

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

Reduktor nie potrzebuje prawie żadnej pamięci, ponieważ wykonuję redukcję tożsamości.

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) 
     } 
    } 
    } 

Jednak reduktor wciąż zużywa dużo pamięci. Czy możliwe jest nadanie reduktorowi różnych argumentów JVM niż mapper? Hadoop zabija reduktor i twierdzi, że używa 3960 MB pamięci! A reduktory kończą się niepowodzeniem. Jak to jest możliwe?

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

UPDATE: nawet kiedy określić zadania strumieniowego z cat jako odwzorowującego i uniq jako reduktor i -Xms512M -Xmx1g -XX:+UseSerialGC moje zadania przejmie 2G pamięci wirtualnej! Wydaje się to ekstrawaganckie przy rozmiarze 4x maks. Sterty.

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

Aktualizacja: original JIRA do zmiany formatu konfiguracji zużycie pamięci szczególnie wspomina, że ​​użytkownicy Java są głównie zainteresowani w pamięci fizycznej, aby zapobiec lanie. Myślę, że to jest dokładnie to, czego chcę: nie chcę, aby węzeł uruchamiał mapera, jeśli dostępna jest niewystarczająca pamięć fizyczna. Jednak wszystkie te opcje wydają się być implementowane jako ograniczenia pamięci wirtualnej, które są trudne do zarządzania.

+0

Po prostu ciekawa - jaka jest różnica między ustawieniem maksymalnej pamięci za pomocą mapred.child.java.opts/-Xmx i mapred.job.map.memory.mb/mapred.job.reduce.memory.mb? Podniosłem zapytanie w SO (http://goo.gl/aIBLr), ale nie ma odpowiedzi. –

Odpowiedz

6

Sprawdź swoją ulimit. Od Cloudera, w wersji 0.20.2, ale podobny problem prawdopodobnie dotyczy późniejszych wersjach:

... jeśli ustawisz mapred.child.ulimit, ważne jest, że musi być więcej niż dwa razy hałdy wartość rozmiaru ustawiona w mapred.child.java.opts. Dla przykładu, jeśli ustawisz stertę 1G, ustaw plik mapred.child.ulimit na 2,5 GB. Dziecko procesy są teraz gwarantowane widelec co najmniej raz, a widelec chwilowo wymaga dwukrotnie większe obciążenie w pamięci wirtualnej.

Możliwe jest również programowe ustawianie mapred.child.java.opts "za późno"; możesz sprawdzić, czy naprawdę działa i umieścić go w pliku mapred-site.xml, jeśli nie.

+1

Wygląda na to, że 'ulimit' jest bardziej rygorystycznym ograniczeniem niż' mapred.job.reduce.memory.mb' i nie jest ustawione w mojej instalacji. To pomocne odniesienie do tego, jak dużo VM pozwala na ... – schmmd

Powiązane problemy