web-dev-qa-db-fra.com

erreur de mémoire insuffisante dans Hadoop

J'ai essayé d'installer Hadoop après http://hadoop.Apache.org/common/docs/stable/single_node_setup.html document . 

bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 

Je reçois l'exception suivante

Java.lang.OutOfMemoryError: Java heap space

Veuillez suggérer une solution pour que je puisse essayer l'exemple. L'exception entière est listée ci-dessous. Je suis nouveau sur Hadoop, j’aurais peut-être fait quelque chose de stupide. Toute suggestion sera très appréciée.

anuj@anuj-VPCEA13EN:~/hadoop$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
11/12/11 17:38:22 INFO util.NativeCodeLoader: Loaded the native-hadoop library
11/12/11 17:38:22 INFO mapred.FileInputFormat: Total input paths to process : 7
11/12/11 17:38:22 INFO mapred.JobClient: Running job: job_local_0001
11/12/11 17:38:22 INFO util.ProcessTree: setsid exited with exit code 0
11/12/11 17:38:22 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.Apache.hadoop.util.LinuxResourceCalculatorPlugin@e49dcd
11/12/11 17:38:22 INFO mapred.MapTask: numReduceTasks: 1
11/12/11 17:38:22 INFO mapred.MapTask: io.sort.mb = 100
11/12/11 17:38:22 WARN mapred.LocalJobRunner: job_local_0001
Java.lang.OutOfMemoryError: Java heap space
    at org.Apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.Java:949)
    at org.Apache.hadoop.mapred.MapTask.runOldMapper(MapTask.Java:428)
    at org.Apache.hadoop.mapred.MapTask.run(MapTask.Java:372)
    at org.Apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.Java:212)
11/12/11 17:38:23 INFO mapred.JobClient:  map 0% reduce 0%
11/12/11 17:38:23 INFO mapred.JobClient: Job complete: job_local_0001
11/12/11 17:38:23 INFO mapred.JobClient: Counters: 0
11/12/11 17:38:23 INFO mapred.JobClient: Job Failed: NA
Java.io.IOException: Job failed!
    at org.Apache.hadoop.mapred.JobClient.runJob(JobClient.Java:1257)
    at org.Apache.hadoop.examples.Grep.run(Grep.Java:69)
    at org.Apache.hadoop.util.ToolRunner.run(ToolRunner.Java:65)
    at org.Apache.hadoop.examples.Grep.main(Grep.Java:93)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.Java:68)
    at org.Apache.hadoop.util.ProgramDriver.driver(ProgramDriver.Java:139)
    at org.Apache.hadoop.examples.ExampleDriver.main(ExampleDriver.Java:64)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.hadoop.util.RunJar.main(RunJar.Java:156)
56
Anuj

Vous pouvez affecter plus de mémoire en modifiant le fichier conf/mapred-site.xml et en ajoutant la propriété:

  <property>
    <name>mapred.child.Java.opts</name>
    <value>-Xmx1024m</value>
  </property>

Cela démarrera les machines virtuelles Java hadoop avec plus d’espace mémoire.

39
Tudor

Pour toute personne utilisant des packages RPM ou DEB, la documentation et les conseils courants sont trompeurs. Ces paquets installent les fichiers de configuration hadoop dans/etc/hadoop. Ceux-ci auront priorité sur les autres paramètres.

Le fichier /etc/hadoop/hadoop-env.sh définit la mémoire de pile Java maximale pour Hadoop. Par défaut, il correspond à:

    export HADOOP_CLIENT_OPTS = "- Xmx128m $ HADOOP_CLIENT_OPTS"

Ce paramètre Xmx est trop bas, changez-le simplement et relancez-le

    export HADOOP_CLIENT_OPTS = "-Xmx2048m  $ HADOOP_CLIENT_OPTS "
76
Zach Garner

Une autre possibilité est l'édition de hadoop-env.sh, qui contient export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS". Changer de 128m à 1024m m'a été utile (Hadoop 1.0.0.1 sur Debian).

12
Andris Birkmanis

Après avoir essayé autant de combinaisons, j'ai finalement conclu que la même erreur sur mon environnement (Ubuntu 12.04, Hadoop 1.0.4) était due à deux problèmes.

  1. Identique à Zach Gamer mentionné ci-dessus. 
  2. n'oubliez pas d'exécuter "ssh localhost" en premier. Crois le ou non! Aucun SSH ne lancerait également un message d'erreur sur l'espace mémoire Java.
6
etlolap

Vous devez apporter des modifications à mapreduce.{map|reduce}.Java.opts et également à mapreduce.{map|reduce}.memory.mb.

Par exemple:

  hadoop jar <jarName> <fqcn> \
      -Dmapreduce.map.memory.mb=4096 \
      -Dmapreduce.map.Java.opts=-Xmx3686m

ici est une bonne ressource pour répondre à cette question

5
tworec

Vous pouvez résoudre ce problème en modifiant le fichier /etc/hadoop/hadoop-env.sh

Hadoop donnait la priorité au répertoire/etc/hadoop config par rapport au répertoire conf.

J'ai aussi rencontré la même situation.

4
wufawei

La même exception avec Ubuntu, Hadoop 1.1.1. La solution était simple: modifiez la variable shell $ HADOOP_CLIENT_OPTS définie par un script init. Mais il a fallu beaucoup de temps pour le trouver = (

2
Odysseus

Nous avons fait face à la même situation.

Modifier le hadoop-env.sh a fonctionné pour moi.

EXPORT HADOOP_HEAPSIZE serait commenté, décommentez cela et fournissez la taille de votre choix.

Par défaut, HEAPSIZE attribuée est de 1000 Mo.

2
Mitra Bhanu

Exécutez votre travail comme celui ci-dessous:

bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.Java.opts=-Xmx1024M input output 'dfs[a-z.]+' 

L'espace de tas, par défaut, est défini sur 32 ou 64 Mo. Vous pouvez augmenter l'espace de segment de mémoire dans le fichier de propriétés, comme l'a souligné Tudor, ou le modifier pour ce travail particulier en définissant cette propriété pour ce travail particulier.

2
Nishant Nagwani

J'ai installé hadoop 1.0.4 à partir du fichier binaire tar et ai eu le problème de manque de mémoire. J'ai essayé les solutions de Tudor, Zach Garner, Nishant Nagwani et Andris Birkmanis, mais aucune d'entre elles n'a fonctionné pour moi. 

Editer le bin/hadoop pour ignorer $ HADOOP_CLIENT_OPTS a fonctionné pour moi:

...
Elif [ "$COMMAND" = "jar" ] ; then
     CLASS=org.Apache.hadoop.util.RunJar
    #Line changed this line to avoid out of memory error:
    #HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
    # changed to:
     HADOOP_OPTS="$HADOOP_OPTS "
...

Je suppose qu'il existe un meilleur moyen de le faire mais je ne l'ai pas trouvé.

2
Brian C.

Configurez la taille de segment de mémoire JVM pour votre carte et réduisez les processus. Ces tailles doivent être inférieures à la mémoire physique configurée dans la section précédente. En règle générale, ils doivent représenter 80% de la taille des paramètres de la mémoire physique YARN.

Configurez mapreduce.map.Java.opts et mapreduce.reduce.Java.opts pour définir la carte et réduire les tailles de tas, par exemple.

<property>  
   <name>mapreduce.map.Java.opts</name>  
   <value>-Xmx1638m</value>
</property>
<property>  
   <name>mapreduce.reduce.Java.opts</name>  
   <value>-Xmx3278m</value>
</property>
1
Pravat Sutar

Exporter les variables en exécutant la commande suivante a fonctionné pour moi:

. conf/hadoop-env.sh
0
Satyajit Rai

Sur Ubuntu utilisant l’installation DEB (du moins pour Hadoop 1.2.1), un lien symbolique /etc/profile.d/hadoop-env.sh a été créé vers /etc/hadoop/hadoop-env.sh, ce qui le charge à chaque ouverture de session. À mon avis, cela n’est pas nécessaire, puisque le wrapper /usr/bin/hadoop le nommera à travers /usr/libexec/hadoop-config.sh). Sur mon système, j'ai supprimé le lien symbolique et je ne reçois plus de problèmes étranges lorsque je modifie la valeur de -Xmx dans HADOOP_CLIENT_OPTIONS (car à chaque exécution de ce script hadoop-env.sh, la variable d'environnement des options client est mise à jour, tout en conservant l'ancienne valeur).

0
borice

Assurez-vous que le mapreduce.child.Java.opts dispose de suffisamment de mémoire pour exécuter le travail mapred. Assurez-vous également que mapreduce.task.io.sort.mb doit être inférieur à mapreduce.child.Java.opts

Exemple: 

 mapreduce.child.Java.opts=Xmx2048m

 mapreduce.task.io.sort.mb=100

Sinon, vous frappez le problème de MOO, même le HADOOP_CLIENT_OPTS de hadoop-env.sh a suffisamment de mémoire s'il est configuré.

0
S.K. Venkat

Je me suis retrouvé avec un problème très similaire la semaine dernière. Mon fichier d'entrée que j'utilisais comportait une grosse ligne de cul que je ne pouvais pas voir. Cette ligne représentait près de 95% de la taille de mon fichier (95% de 1 Go! Imaginez cela!). Je vous suggère de jeter un coup d’œil sur vos fichiers d’entrée. Vous souhaitez peut-être examiner un fichier d'entrée mal formé. Essayez d'augmenter l'espace de mémoire après avoir vérifié le fichier d'entrée.

0
Adi Kish