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ć?

Author: Lishu, 2014-01-09

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: 8192

Każ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:

  1. W YARNIE powinieneś używać mapreduce configów, a nie mapred. EDIT: ten komentarz nie ma już zastosowania teraz, gdy edytowałeś swoje pytanie.
  2. to, co konfigurujesz, to w rzeczywistości, ile chcesz zażądać, nie to, co jest Max przeznaczyć.
  3. 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).

 74
Author: cabad,
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:

  1. Wyłącz sprawdzanie użycia pamięci wirtualnej przez ustawienie przędza.nodemanager.vmem-check-enabled to false;

  2. 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>
 37
Author: Sanjiv,
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

 10
Author: hiroprotagonist,
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.

 8
Author: Brian G,
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"
    }
  }
]
 1
Author: pandorabob,
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.
 1
Author: Rathan,
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