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)
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.
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 "
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).
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.
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
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.
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 = (
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.
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.
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é.
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>
Exporter les variables en exécutant la commande suivante a fonctionné pour moi:
. conf/hadoop-env.sh
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).
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é.
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.