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)
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.
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"
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).
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.
- même que Zach Gamer mentionné ci-dessus.
- 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.
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
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.
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.
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.
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 =(
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.
Exporter les variables en exécutant la commande suivante a fonctionné pour moi:
. conf/hadoop-env.sh
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)
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.
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é.