erreur de mémoire insuffisante dans Hadoop

J'ai essayé d'installer Hadoop en suivant ceci http://hadoop.apache.org/common/docs/stable/single_node_setup.html document. Quand j'ai essayé d'exécuter ceci

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
demandé sur Anuj 2011-12-11 16:42:21

14 réponses

Vous pouvez attribuer plus de mémoire en éditant le conf / mapred-site.fichier xml et ajout de la propriété:

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

Cela va démarrer les JVM hadoop avec plus d'espace de tas.

38
répondu Tudor 2014-04-01 15:27:04

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

Le / etc/hadoop/hadoop-env.sh définit la mémoire de tas java maximale pour Hadoop, par défaut:

   export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"

Ce paramètre Xmx est trop bas, il suffit de le changer pour cela et de réexécuter

   export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"
75
répondu Zach Garner 2012-06-20 23:41:06

Une autre possibilité est d'éditer hadoop-env.sh, qui contient export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS". Changer 128m en 1024m a aidé dans mon cas (Hadoop 1.0.0.1 sur Debian).

12
répondu Andris Birkmanis 2012-01-30 11:29:31

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

  1. même que Zach Gamer mentionné ci-dessus.
  2. n'oubliez pas d'exécuter "SSH localhost" en premier. Croyez-le ou pas! Aucun ssh ne lancerait un message d'erreur sur L'espace de tas Java.
6
répondu etlolap 2012-11-16 16:02:34

Vous besoin de faire des ajustements à mapreduce.{map|reduce}.java.opts et aussi à 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 à la réponse à cette question

5
répondu tworec 2017-10-23 11:50:59

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

Hadoop donnait la priorité au répertoire de configuration /etc/hadoop sur le répertoire config.

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

4
répondu wufawei 2012-02-18 09:14:42

Exécuter 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 Mo ou 64 Mo. Vous pouvez augmenter l'espace de tas dans le fichier de propriétés comme, Tudor a souligné, ou vous pouvez le modifier pour ce travail particulier en définissant cette propriété pour ce travail particulier.

2
répondu Nishant Nagwani 2011-12-12 08:27:33

J'ai installé hadoop 1.0.4 à partir du tar binaire et j'ai eu le problème 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.

Modifier 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 y a une meilleure façon de le faire mais je ne pouvais pas le trouver.

2
répondu Brian C. 2012-11-06 17:18:20

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

2
répondu Odysseus 2013-01-10 20:26:58

Nous avons fait face à la même situation.

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

EXPORT HADOOP_HEAPSIZE serait commenté, décommenter & donner la taille de votre choix.

Par défaut HEAPSIZE assigné est 1000MB.

2
répondu Mitra Bhanu 2013-05-28 11:06:25

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

. conf/hadoop-env.sh
0
répondu Satyajit Rai 2013-07-01 04:02:57

Sur Ubuntu en utilisant DEB install (au moins pour Hadoop 1.2.1), il y a un lien symbolique /etc/profile.d/hadoop-env.sh Créé vers /etc/hadoop/hadoop-env.sh qui le charge chaque fois que vous vous connectez. Dans mon expérience, ce n'est pas nécessaire car le wrapper /usr/bin/hadoop lui-même finira par l'appeler (via /usr/libexec/hadoop-config.sh). Sur mon système, j'ai supprimé le lien symbolique et je n'ai plus de problèmes étranges lors de la modification de la valeur de -Xmx dans HADOOP_CLIENT_OPTIONS (car chaque fois que hadoop-env.sh script est exécuté, la variable d'environnement client options est mise à jour, tout en conservant l'ancienne valeur)

0
répondu borice 2013-08-11 05:25:45

Je me suis retrouvé avec un problème très similaire la semaine dernière. Mon fichier d'entrée que j'utilisais avait une grosse ligne de cul que je ne pouvais pas voir. Cette ligne représentait presque 95% de la taille de mon fichier (95% de 1 Go! imaginez que!). Je vous suggère de jeter un oeil à vos fichiers d'entrée en premier. Vous pourriez avoir un fichier d'entrée mal formé que vous souhaitez examiner. Essayez d'augmenter l'espace de tas après avoir vérifié le fichier d'entrée.

0
répondu Adi Kish 2015-07-20 14:19:39

Assurez - vous que les mapreduce.child.java.opts disposent d'une mémoire suffisante 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 allez frapper le problème OOM même les HADOOP_CLIENT_OPTS dans hadoop-env.sh avoir assez de mémoire si configuré.

0
répondu S.K. Venkat 2017-09-21 06:33:27