61 votes

Erreur de manque de mémoire dans Hadoop

J'ai essayé d'installer Hadoop en suivant cette procédure http://hadoop.apache.org/common/docs/stable/single_node_setup.html document. Lorsque j'ai essayé d'exécuter ce

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

J'obtiens l'exception suivante

java.lang.OutOfMemoryError: Java heap space

Veuillez me suggérer une solution pour que je puisse essayer l'exemple. L'exception entière est listée ci-dessous. Je suis nouveau dans Hadoop et j'ai 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)

0 votes

Que contient votre fichier d'entrée ?

0 votes

Je soupçonne aussi que le dossier a une énorme ligne

0 votes

J'ai le même problème avec Hadoop 1.0.0, l'entrée est conforme à la page wiki "Démarrage". wiki.apache.org/hadoop/GettingStartedWithHadoop (en anglais) . J'ai essayé les trois solutions proposées ici, mais aucune ne semble avoir d'impact.

80voto

Zach Garner Points 1050

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

Le fichier /etc/hadoop/hadoop-env.sh définit la mémoire maximale du tas de java pour Hadoop, par défaut c'est le cas :

   export HADOOP\_CLIENT\_OPTS="-Xmx128m $HADOOP\_CLIENT\_OPTS"

Ce paramètre Xmx est trop faible, il suffit de le changer en ceci et de relancer l'opération.

   export HADOOP\_CLIENT\_OPTS="-**Xmx2048m** $HADOOP\_CLIENT\_OPTS"

0 votes

Je viens d'avoir exactement le même problème que le PO, et j'utilisais le paquet RPM. Ceci a réglé le problème. Upvoted.

0 votes

On peut aussi définir la propriété comme finale dans mapred-site.xml et elle ne sera pas écrasée. <property> <name>mapred.child.java.opts</name> <value>-Xmx1024m</value> <final>true</final> </property>

1 votes

Dans Hadoop 2.x.x, hadoop-env.sh peut être trouvé à /etc/hadoop/conf/hadoop-env.sh

40voto

Tudor Points 39539

Vous pouvez attribuer 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 permettra de démarrer les JVM d'Hadoop avec plus d'espace de stockage.

0 votes

@Anuj, essayez de fixer le nombre encore plus haut. Si même 2048m n'est pas suffisant, il doit y avoir un problème avec l'implémentation.

0 votes

Je dois éditer mapred-site.xml et ré-exécuter la commande correctement mais cela n'a pas fonctionné :(

0 votes

@Anuj : oui, c'est ce que vous devez faire.

12voto

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

7voto

etlolap Points 143

Après avoir essayé de nombreuses 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 chose que Zach Gamer mentionné ci-dessus.
  2. n'oubliez pas d'exécuter d'abord "ssh localhost". Croyez-le ou non ! Aucun ssh n'enverrait un message d'erreur sur l'espace de tas de Java également.

0 votes

J'ai eu ce problème et "ssh localhost" a fonctionné pour moi ! Pourquoi hadoop doit-il fonctionner sous ssh pour un fonctionnement autonome ?

4voto

wufawei Points 51

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X