W Hadoop v1 przypisałem każde 7 gniazd mapowania i reduktora o rozmiarze 1 GB, moje mapery i reduktory działają dobrze. Moja maszyna ma pamięć 8G, procesor 8. Teraz z YARN, po uruchomieniu tej samej aplikacji na tym samym komputerze, otrzymałem błąd kontenera. Domyślnie mam takie ustawienia:
<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>
Dało mi to błąd:
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.
Następnie próbowałem ustawić limit pamięci w 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>
Ale nadal pojawia się błąd:
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.
Nie wiem, dlaczego zadanie mapy wymaga tak dużej ilości pamięci. W moim rozumieniu 1 GB pamięci wystarczy na moje zadanie mapowania / redukcji. Dlaczego przypisując więcej pamięci do kontenera, zadanie zużywa więcej? Czy to dlatego, że każde zadanie ma więcej podziałów? Wydaje mi się, że bardziej wydajne jest niewielkie zmniejszenie rozmiaru kontenera i utworzenie większej liczby kontenerów, aby więcej zadań było wykonywanych równolegle. Problem polega na tym, jak mogę się upewnić, że do każdego kontenera nie zostanie przypisanych więcej podziałów, niż może obsłużyć?
Odpowiedzi:
Należy również poprawnie skonfigurować maksymalne alokacje pamięci dla MapReduce. Z tego samouczka HortonWorks :
Podsumowując:
mapreduce
konfiguracji, a niemapred
tych. EDYTUJ: ten komentarz nie ma już zastosowania po edycji pytania.java.opts
ustawień wymienionych powyżej.Na koniec możesz sprawdzić to inne pytanie SO, które opisuje podobny problem (i rozwiązanie).
źródło
mapreduce.map.java.opts
imapreduce.reduce.java.opts
rozwiązując mój problem. CZY wiesz, czy rzeczywista pamięć przypisana do zadania jest definiowana tylko przezmapreduce.map/reduce.memory.mb
? Jakyarn.scheduler.minimum-allocation-mb
wpływa na faktyczne przypisanie pamięci?Na poziomie Yarn znajduje się sprawdzenie współczynnika wykorzystania pamięci wirtualnej i fizycznej. Problem polega nie tylko na tym, że maszyna wirtualna nie ma wystarczającej pamięci fizycznej. Ale dzieje się tak, ponieważ użycie pamięci wirtualnej jest większe niż oczekiwano dla danej pamięci fizycznej.
Uwaga : dzieje się tak na Centos / RHEL 6 ze względu na agresywną alokację pamięci wirtualnej.
Można to rozwiązać:
Wyłącz sprawdzanie użycia pamięci wirtualnej, ustawiając yarn.nodemanager.vmem-check-enabled na false ;
Zwiększ współczynnik VM: PM, ustawiając współczynnik yarn.nodemanager.vmem-pmem- na wyższą wartość.
Piśmiennictwo :
https://issues.apache.org/jira/browse/HADOOP-11364
http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/
Dodaj następującą właściwość w yarn-site.xml
źródło
Miałem bardzo podobny problem podczas używania HIVE w EMR. Żadne z istniejących rozwiązań nie działało dla mnie - tj. Żadna z konfiguracji mapreduce nie działała dla mnie; i też nie ustawiono
yarn.nodemanager.vmem-check-enabled
na fałsz.Jednak to, co ostatecznie działało, to ustawienie
tez.am.resource.memory.mb
, na przykład:Innym ustawieniem, które należy rozważyć, jest
yarn.app.mapreduce.am.resource.mb
źródło
Nie mogę wypowiedzieć się na temat zaakceptowanej odpowiedzi z powodu złej reputacji. Chciałbym jednak dodać, że takie zachowanie jest zgodne z projektem. NodeManager zabija twój kontener. Wygląda na to, że próbujesz użyć przesyłania strumieniowego hadoop, które działa jako proces potomny zadania zmniejszania mapy. NodeManager monitoruje całe drzewo procesów zadania i jeśli zużywa więcej pamięci niż maksimum ustawione odpowiednio w mapreduce.map.memory.mb lub mapreduce.reduce.memory.mb, spodziewalibyśmy się, że Nodemanager zabije zadanie, w przeciwnym razie Twoim zadaniem jest kradzież pamięci należących do innych pojemników, których nie chcesz.
źródło
Podczas pracy z iskrą w EMR miałem ten sam problem i ustawienie
maximizeResourceAllocation=true
załatwiło sprawę; mam nadzieję, że to komuś pomoże. Musisz to ustawić podczas tworzenia klastra. Z dokumentów EMR:Gdzie myConfig.json powinien powiedzieć:
źródło
Niedawno też mieliśmy do czynienia z tym problemem. Jeśli problem dotyczy pamięci mappera, chciałbym zasugerować kilka rzeczy, które należy sprawdzić.
źródło
Uruchomienie przędzy w podsystemie Windows Linux z systemem Ubunto OS, błąd „działanie poza limitami pamięci wirtualnej, zabijanie kontenera” Rozwiązałem ten problem, wyłączając sprawdzanie pamięci wirtualnej w pliku yarn-site.xml
źródło
Osobiście nie sprawdziłem, ale błędy hadoop-yarn-container-virtual-memory-zrozumienia-and-solving-container-is-running-outside-virtual-memory-limits-limits brzmi bardzo rozsądnie
Rozwiązałem problem, zmieniając
yarn.nodemanager.vmem-pmem-ratio
na wyższą wartość i zgadzam się, że:źródło