web-dev-qa-db-fra.com

Erreur de réplication de données dans Hadoop

J'implémente le cluster à nœud unique Hadoop sur ma machine en suivant le tutoriel de Michael Noll } et j'ai rencontré une erreur de réplication de données:

Voici le message d'erreur complet:

> hadoop@laptop:~/hadoop$ bin/hadoop dfs -copyFromLocal
> tmp/testfiles testfiles
> 
> 12/05/04 16:18:41 WARN hdfs.DFSClient: DataStreamer Exception:
> org.Apache.hadoop.ipc.RemoteException: Java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1   at
> org.Apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.Java:1271)
>     at
> org.Apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.Java:422)
>     at Sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)  at
> Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
>     at Java.lang.reflect.Method.invoke(Method.Java:597)     at
> org.Apache.hadoop.ipc.RPC$Server.call(RPC.Java:508)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:959)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:955)     at
> Java.security.AccessController.doPrivileged(Native Method)  at
> javax.security.auth.Subject.doAs(Subject.Java:396)  at
> org.Apache.hadoop.ipc.Server$Handler.run(Server.Java:953)
> 
>     at org.Apache.hadoop.ipc.Client.call(Client.Java:740)   at
> org.Apache.hadoop.ipc.RPC$Invoker.invoke(RPC.Java:220)  at
> $Proxy0.addBlock(Unknown Source)    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.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.Java:82)
>     at
> org.Apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.Java:59)
>     at $Proxy0.addBlock(Unknown Source)     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.Java:2937)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.Java:2819)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.Java:2102)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.Java:2288)
> 
> 12/05/04 16:18:41 WARN hdfs.DFSClient: Error Recovery for block null
> bad datanode[0] nodes == null 12/05/04 16:18:41 WARN hdfs.DFSClient:
> Could not get block locations. Source file
> "/user/hadoop/testfiles/testfiles/file1.txt" - Aborting...
> copyFromLocal: Java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1 12/05/04 16:18:41 ERROR hdfs.DFSClient:
> Exception closing file /user/hadoop/testfiles/testfiles/file1.txt :
> org.Apache.hadoop.ipc.RemoteException: Java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1   at
> org.Apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.Java:1271)
>     at
> org.Apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.Java:422)
>     at Sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)  at
> Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
>     at Java.lang.reflect.Method.invoke(Method.Java:597)     at
> org.Apache.hadoop.ipc.RPC$Server.call(RPC.Java:508)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:959)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:955)     at
> Java.security.AccessController.doPrivileged(Native Method)  at
> javax.security.auth.Subject.doAs(Subject.Java:396)  at
> org.Apache.hadoop.ipc.Server$Handler.run(Server.Java:953)
> 
> org.Apache.hadoop.ipc.RemoteException: Java.io.IOException: File
> /user/hadoop/testfiles/testfiles/file1.txt could only be replicated to
> 0 nodes, instead of 1   at
> org.Apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.Java:1271)
>     at
> org.Apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.Java:422)
>     at Sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)  at
> Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
>     at Java.lang.reflect.Method.invoke(Method.Java:597)     at
> org.Apache.hadoop.ipc.RPC$Server.call(RPC.Java:508)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:959)     at
> org.Apache.hadoop.ipc.Server$Handler$1.run(Server.Java:955)     at
> Java.security.AccessController.doPrivileged(Native Method)  at
> javax.security.auth.Subject.doAs(Subject.Java:396)  at
> org.Apache.hadoop.ipc.Server$Handler.run(Server.Java:953)
> 
>     at org.Apache.hadoop.ipc.Client.call(Client.Java:740)   at
> org.Apache.hadoop.ipc.RPC$Invoker.invoke(RPC.Java:220)  at
> $Proxy0.addBlock(Unknown Source)    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.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.Java:82)
>     at
> org.Apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.Java:59)
>     at $Proxy0.addBlock(Unknown Source)     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.Java:2937)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.Java:2819)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.Java:2102)
>     at
> org.Apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.Java:2288)

Aussi quand j'exécute:

bin/stop-all.sh

Il indique que datanode n'a pas été démarré et ne peut donc pas être arrêté. Cependant, la sortie de jps indique que le code de données est présent.

J'ai essayé de formater le namenode, changer les permissions du propriétaire, mais cela ne semble pas fonctionner. J'espère que je n'ai manqué aucune autre information pertinente.

Merci d'avance.

21
Apoorv Saxena

La solution qui a fonctionné pour moi a été d’exécuter namenode et datanode un par un et non pas ensemble en utilisant bin/start-all.sh. En utilisant cette approche, l’erreur est clairement visible si vous rencontrez des problèmes pour configurer les codes de données sur le réseau. De nombreuses publications sur stackoverflow suggèrent également que le nom de code nécessite un certain temps de démarrage. Par conséquent, vous devez lui laisser un délai de commencez avant de commencer les codes de données. De plus, dans ce cas, j'avais des problèmes avec différents identifiants de namenode et de datanodes pour lesquels je devais changer les identifiants du datanode avec le même identifiant que le namenode.

La procédure étape par étape sera la suivante:

  1. Démarrez le namenode bin/hadoop namenode. Vérifiez les erreurs, le cas échéant.
  2. Démarrez les codes de données bin/hadoop datanode. Vérifiez les erreurs, le cas échéant.
  3. Maintenant, démarrez le suivi des tâches, suivi des travaux, à l'aide de 'bin/start-mapred.sh'
26
Apoorv Saxena

Regardez votre namenode (probablement http: // localhost: 50070 ) et voyez combien de datanodes il est dit. 

Si la valeur est 0, votre code de données n'est pas en cours d'exécution ou il n'est pas configuré pour se connecter au nom de code. 

Si la valeur est 1, vérifiez combien d'espace libre il est indiqué dans le DFS. Il se peut que le nœud de données n’ait nulle part où il peut écrire des données (le répertoire de données n’existe pas ou n’est pas autorisé en écriture).

7
E Smith

Bien que résolu, j'ajoute ceci pour les futurs lecteurs. L'avis de Cody d'inspecter le début du namenode et du datanode était utile et une enquête plus approfondie m'a amené à supprimer le répertoire hadoop-store/dfs. Faire cela a résolu cette erreur pour moi.

4
Mike

J'ai eu le même problème, j'ai jeté un œil aux journaux de datanode et il y avait un avertissement disant que dfs.data.dir avait des permissions incorrectes ... alors je les ai simplement changées et tout a fonctionné, ce qui est un peu bizarre.

Plus précisément, mon "dfs.data.dir" a été défini sur "/ home/hadoop/hd_tmp" et l'erreur que j'ai provoquée était:

...
...
WARN org.Apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permission for /home/hadoop/hd_tmp/dfs/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
ERROR org.Apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid.
...
...

J'ai donc simplement exécuté ces commandes:

  • J'ai arrêté tous les démons avec "bin/stop-all.sh"
  • Changez les permissions du répertoire avec "chmod -R 755/home/hadoop/hd_tmp"
  • J'ai redonné le format au namenode avec "bin/hadoop namenode -format".
  • J'ai redémarré les démons "bin/start-all.sh"
  • Et voilà, le code de données était opérationnel! (Je l'ai vérifié avec la commande "jsp", où un processus nommé DataNode était affiché).

Et puis tout a bien fonctionné.

2
cacol89

J'ai supprimé les propriétés supplémentaires du fichier hdfs-site.xml, puis ce problème a disparu. Hadoop doit améliorer ses messages d'erreur. J'ai essayé chacune des solutions ci-dessus et aucune n'a fonctionné.

1
killjoy

Dans mon cas, j’ai mal défini une destination pour dfs.name.dir et dfs.data.dir. Le format correct est

 <property>
 <name>dfs.name.dir</name>
 <value>/path/to/name</value>
 </property>

 <property>
 <name>dfs.data.dir</name>
 <value>/path/to/data</value>
 </property>
1
mahmood

J'ai rencontré le même problème. Lorsque j'ai examiné localhost: 50070 , sous le récapitulatif du cluster, toutes les propriétés étaient indiquées par 0, à l'exception de "DFS utilisé% 100". Généralement, cette situation se produit car il existe des erreurs dans les trois fichiers * -site.xml sous HADOOP_INSTALL/conf et le fichier hosts.

Dans mon cas, la cause est incapable de résoudre le nom d'hôte. J'ai résolu le problème simplement en ajoutant "IP_Address hostname" à/etc/hosts .

0
leodream

Dans mon cas, j'ai dû supprimer:

/tmp/hadoop-<user-name> dossier et le format et commencer à utiliser sbin/start-dfs.sh

sbin/start-yarn.sh

0
swapna