Le conteneur dépasse les limites de mémoire

dans Hadoop v1, j'ai assigné chaque 7 fente mapper et réducteur avec la taille de 1 Go, mes mappers & réducteurs fonctionne très bien. Ma machine a 8g de mémoire, 8 processeurs. Maintenant avec le fil, quand exécuter la même application sur la même machine, j'ai eu une erreur de conteneur. Par défaut, j'ai ce paramètre:

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

il m'a donné erreur:

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.

j'ai alors essayé de fixer la limite de mémoire dans 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>

mais encore erreur d'obtention:

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.

Je ne comprends pas pourquoi la tâche de la carte a besoin de autant de mémoire. D'après ce que j'ai compris, 1 Go de mémoire est suffisant pour ma tâche map/reduce. Pourquoi alors que j'attribue plus de mémoire au conteneur, la tâche utilise plus? Est-ce parce que chaque tâche est plus divisée? Je pense qu'il est plus efficace de réduire un peu la taille du conteneur et de créer plus de conteneurs, de sorte que plus de tâches sont en cours d'exécution en parallèle. Le problème est de savoir comment je peux m'assurer que chaque conteneur ne sera pas affecté plus de divisions qu'il peut traiter?

62
demandé sur Lishu 2014-01-09 00:18:01

6 réponses

vous devez également configurer correctement les allocations mémoire maximales pour MapReduce. De ce tutoriel de HortonWorks :

[...]

chaque machine de notre cluster a 48 Go de RAM. Une partie de cette RAM doit être >réservée pour L'Utilisation du système D'exploitation. Sur chaque noeud, nous assignerons 40 Go de RAM pour > fil à utiliser et garder 8 Go pour le système d'exploitation

pour notre exemple cluster, nous avons le minimum de mémoire vive pour un conteneur (laine.planificateur.minimum-allocation-mo) = 2 GO. Nous assignerons donc 4 Go pour les conteneurs de tâches Map, et 8 Go pour les conteneurs de tâches Reduce.

Dans mapred-site.xml:

mapreduce.map.memory.mb : 4096

mapreduce.reduce.memory.mb : 8192

chaque conteneur exécutera des JVM pour la Map et réduira les tâches. La JVM la taille des tas devrait être plus basse que la carte et réduire la mémoire défini ci-dessus, de sorte qu'ils sont dans les limites du Conteneur mémoire attribuée par fil.

Dans mapred-site.xml:

mapreduce.map.java.opts : -Xmx3072m

mapreduce.reduce.java.opts : -Xmx6144m

Les paramètres ci-dessus configurer la limite supérieure de la RAM physique Map and Reduce tasks utilisera .

Pour résumer:

  1. dans le fil, vous devez utiliser le mapreduce configs, pas le mapred ceux. EDIT: ce commentaire ne s'applique plus maintenant que vous avez modifié votre question.
  2. ce que vous configurez est en fait combien vous voulez Demander, pas quel est le max à allouer.
  3. les limites maximales sont configurées avec les paramètres java.opts énumérés ci-dessus.

enfin, vous pouvez vérifier cet autre alors question qui décrit un problème (et une solution) similaire.

74
répondu cabad 2017-05-23 12:26:20

il y a un contrôle placé au niveau du fil pour le rapport Vertuel et physique d'utilisation de la mémoire. Le problème n'est pas seulement que VM n'a pas une mémoire physique suffisante. Mais c'est parce que L'utilisation de la mémoire virtuelle est plus que prévu pour une mémoire physique donnée.

Note : ceci se produit sur Centos/RHEL 6 en raison de son allocation agressive de mémoire virtuelle.

il peut être résolu par:

  1. désactiver la vérification de l'utilisation de la mémoire virtuelle en paramétrant de fils.nodemanager.vmem-case activée à false ;

  2. augmenter le rapport VM:PM en réglant fils.nodemanager.VMEM-pmem-ratio à une valeur plus élevée.

Références :

https://issues.apache.org/jira/browse/HADOOP-11364

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas /

ajouter les biens suivants à fil-site.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
répondu Sanjiv 2015-07-16 09:23:44

j'ai eu un problème vraiment similaire en utilisant la ruche dans EMR. Aucune des solutions existantes ne fonctionnait pour moi, c'est-à-dire qu'aucune des configurations mapreduce ne fonctionnait pour moi, et ni le réglage de yarn.nodemanager.vmem-check-enabled à false.

cependant, ce qui a fini par fonctionner était le réglage tez.am.resource.memory.mb , par exemple:

hive -hiveconf tez.am.resource.memory.mb=4096

un autre paramètre à considérer est yarn.app.mapreduce.am.resource.mb

10
répondu hiroprotagonist 2016-11-09 23:41:13

Je ne peux pas commenter la réponse acceptée, en raison de la mauvaise réputation. Cependant, je voudrais ajouter, ce comportement est par la conception. Le NodeManager est en train de tuer votre conteneur. Il semble que vous essayez d'utiliser hadoop streaming qui s'exécute comme un processus enfant de la carte-réduire la tâche. Le NodeManager surveille tout l'arbre des processus de la tâche et s'il absorbe plus de mémoire que le maximum défini dans mapreduce.cartographie.mémoire.mo ou mapreduce.réduire.mémoire.mo, respectivement, nous nous attendons à ce que le Nodemanager de tuer la tâche, sinon votre tâche est de voler la mémoire appartenant à d'autres conteneurs, que vous ne voulez pas.

8
répondu Brian G 2014-08-15 03:51:42

en travaillant avec spark dans EMR j'avais le même problème et le réglage maximizeResourceAllocation=true a fait l'affaire; espérons que cela aide quelqu'un. Vous devez le configurer lorsque vous créez le cluster. Du 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

où myConfig.json devrait dire:

[
  {
    "Classification": "spark",
    "Properties": {
      "maximizeResourceAllocation": "true"
    }
  }
]
1
répondu pandorabob 2017-04-19 21:21:47

Nous avons également été confrontés à ce problème récemment. Si le problème est lié à la mémoire de mapper, deux choses que je voudrais suggérer qui doit être vérifié sont.

  • vérifier si combiner est activé ou non ? Si oui, cela signifie que la logique de réduction doit être exécutée sur tous les enregistrements (sortie de mapper). cela se produit dans la mémoire. basé sur votre application, vous devez vérifier si l'activation de combiner aide ou non. Hors commerce est entre les octets de transfert réseau et le temps pris/mémoire/CPU pour la logique de réduction sur 'X' nombre d'enregistrements.
    • si vous pensez que combiner n'a pas beaucoup de valeur, désactivez-le.
    • si vous avez besoin de combiner et que " X " est un nombre énorme (disons des millions d'enregistrements), alors envisagez de changer votre logique de split (pour les formats d'entrée par défaut, utilisez moins de taille de bloc, normalement 1 Taille de bloc = 1 split) pour mapper moins de nombre d'enregistrements à un seul mapper.
  • nombre de dossiers traités dans un seul mapper. Rappelez-vous que tous ces enregistrements doivent être triés en mémoire (sortie de mapper est triée). Envisagez de définir mapreduce.tâche.io.trier.mb (par défaut 200MB) à une valeur plus élevée si nécessaire. mapred-configs.xml
  • si l'un des éléments ci-dessus n'a pas aidé, essayez d'exécuter la logique mapper comme une application autonome et profiler l'application en utilisant un Profiler (comme JProfiler) et voir où la mémoire est utilisée. Cela peut vous donner de très bonnes idées.
1
répondu Rathan 2018-06-13 19:53:55