Kontener działa poza limitami pamięci
W Hadoop v1, przypisałem każdy slot mapper 7 i reducer o rozmiarze 1GB, moje mappers & reducers działa dobrze. Moja maszyna ma pamięć 8G, 8 procesorów. Teraz z YARN, gdy uruchom tę samą aplikację na tej samej maszynie, mam 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ł mi 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.
Potem 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 wciąż dostaję 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.
Jestem zdezorientowany dlaczego zadanie map potrzebuje tego dużo pamięci. W moim rozumieniu 1GB pamięci wystarczy na zadanie map/reduce. Dlaczego, gdy przypisuję więcej pamięci do kontenera, zadanie używa więcej? Czy to dlatego, że każde zadanie dostaje więcej podziałów? Uważam, że bardziej wydajne jest zmniejszenie rozmiaru kontenera i tworzenie większej liczby kontenerów, tak aby więcej zadań działało równolegle. Problem polega na tym, jak mogę się upewnić, że do każdego kontenera nie zostanie przypisana większa ilość splitów niż jest w stanie obsłużyć?
6 answers
Powinieneś również poprawnie skonfigurować maksymalne przydziały pamięci dla MapReduce. Z tego poradnika :
[...]
Każda maszyna w naszym klastrze ma 48 GB PAMIĘCI RAM. Część tej pamięci RAM powinna być > zarezerwowana dla użycia systemu operacyjnego. Na każdym węźle przypisujemy 40 GB PAMIĘCI RAM dla >YARN do użycia i zachowamy 8 GB dla systemu operacyjnego]}
Dla naszego przykładowego klastra, mamy minimalną pamięć RAM dla kontenera (przędza.scheduler.minimalna-alokacja-mb) = 2 GB. W ten sposób przydzielimy 4 GB dla kontenerów Zadań Map i 8 GB dla kontenerów Zadań Reduce.
W mapred-site.xml:
mapreduce.map.memory.mb
: 4096
mapreduce.reduce.memory.mb
: 8192Każdy kontener uruchomi JVMs dla Mapy i zmniejszy zadania. JVM rozmiar sterty powinien być ustawiony na niższy niż mapa i zmniejszyć pamięć zdefiniowanych powyżej, tak aby znajdowały się w granicach kontenera pamięć przydzielana przez włóczkę.
W mapred-site.xml:
mapreduce.map.java.opts
:-Xmx3072m
mapreduce.reduce.java.opts
:-Xmx6144m
Powyższe ustawienia skonfiguruj górną granicę fizycznej pamięci RAM, która Zadania Map i Reduce będą używane .
Podsumowując:
- W YARNIE powinieneś używać
mapreduce
configów, a niemapred
. EDIT: ten komentarz nie ma już zastosowania teraz, gdy edytowałeś swoje pytanie. - to, co konfigurujesz, to w rzeczywistości, ile chcesz zażądać, nie to, co jest Max przeznaczyć.
- maksymalne limity są skonfigurowane za pomocą ustawień
java.opts
wymienionych powyżej.
Na koniec może warto sprawdzić ten drugi więc pytanie, które opisuje podobny problem (i rozwiązanie).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:20
Na poziomie przędzy znajduje się sprawdzanie współczynnika wykorzystania pamięci Vertualnej i fizycznej. Problem polega nie tylko na tym, że maszyna wirtualna nie ma wystarczającej pamięci pysical. Ale to dlatego, że wykorzystanie pamięci wirtualnej jest więcej niż oczekiwano dla danej pamięci fizycznej.
Uwaga: dzieje się tak w Centos/RHEL 6 ze względu na agresywną alokację pamięci wirtualnej.
Można go rozwiązać poprzez:
Wyłącz sprawdzanie użycia pamięci wirtualnej przez ustawienie przędza.nodemanager.vmem-check-enabled to false;
Zwiększ stosunek VM: PM przez ustawienie przędzy .nodemanager.vmem-pmem-ratio do jakiejś wyższej wartości.
Bibliografia :
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 / align = "left" / 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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 09:23:44
Miałem bardzo podobny problem używając 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; ani ustawienie yarn.nodemanager.vmem-check-enabled
Na false.
Jednak to, co skończyło się pracą, to ustawienie tez.am.resource.memory.mb
, na przykład:
hive -hiveconf tez.am.resource.memory.mb=4096
Kolejnym ustawieniem do rozważenia jest yarn.app.mapreduce.am.resource.mb
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 23:41:13
Nie mogę skomentować zaakceptowanej odpowiedzi, ze względu na niską reputację. Chciałbym jednak dodać, że takie zachowanie jest z założenia. NodeManager zabija Twój kontener. Wygląda na to, że próbujesz użyć strumieniowania hadoop, który działa jako proces potomny zadania Map-reduce. NodeManager monitoruje całe drzewo procesów zadania i jeśli zżera więcej pamięci niż maksimum ustawione w mapreduce.Mapa.pamięć.mb lub mapreduce.zmniejsz.pamięć.mb, spodziewalibyśmy się Nodemanager, aby zabić zadanie, w przeciwnym razie Twoim zadaniem jest kradzież pamięci należącej do innych kontenerów, których nie chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 03:51:42
Podczas pracy z spark w EMR miałem ten sam problem i ustawienie maximizeResourceAllocation=true
zadziałało; mam nadzieję, że komuś pomoże. Musisz go ustawić podczas tworzenia klastra. Z EMR docs:
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
Gdzie myConfig.json powinien powiedzieć:
[
{
"Classification": "spark",
"Properties": {
"maximizeResourceAllocation": "true"
}
}
]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 21:21:47
Ostatnio również mieliśmy do czynienia z tym problemem. Jeśli problem jest związany z pamięcią mapera, kilka rzeczy, które chciałbym zasugerować, które należy sprawdzić, to.
- Sprawdź czycombiner jest włączony czy nie ? Jeżeli tak, to oznacza, że logika reduce musi być uruchomiona na wszystkich rekordach (wyjście mappera). To dzieje się w pamięci. na podstawie Twojej aplikacji musisz sprawdzić, czy włączenie combinera pomaga, czy nie. Kompromis jest między bajtów transferu sieciowego i czasu / pamięci / procesora dla zmniejszenia logiki na 'X' liczba rekordów.
- Jeśli uważasz, że combiner nie ma dużej wartości, po prostu go wyłącz.
- Jeśli potrzebujesz combinera i 'X' jest ogromną liczbą (powiedzmy milionami rekordów), rozważając zmianę logiki podziału (dla domyślnych formatów wejściowych używaj mniej rozmiaru bloku, zwykle 1 rozmiar bloku = 1 split), aby mapować mniejszą liczbę rekordów do jednego mapera.
- Liczba rekordów przetwarzanych w jednym maperze. Pamiętaj, że wszystkie te zapisy potrzebują to be posorted in memory (Wyjście mappera jest posortowane). Rozważ ustawienie mapreduce.task.io.sort.mb (domyślnie 200MB) na wyższą wartość w razie potrzeby. mapred-configs.xml
- jeśli któreś z powyższych nie pomogło, spróbuj uruchomić logikę mappera jako samodzielną aplikację i profilować aplikację za pomocą profilera (takiego jak JProfiler) i sprawdź, gdzie pamięć zostanie wykorzystana. To może dać bardzo dobry wgląd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 19:53:55