Erreur de réplication des données dans Hadoop
j'implémente le Cluster à noeud unique Hadoop sur ma machine en suivant le tutoriel de Michael Noll et en sont venus à travers la réplication de données d'erreur:
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.run(Server.java:959) at > org.apache.hadoop.ipc.Server$Handler.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.access00(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.run(Server.java:959) at > org.apache.hadoop.ipc.Server$Handler.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.run(Server.java:959) at > org.apache.hadoop.ipc.Server$Handler.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.access00(DFSClient.java:2102) > at > org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)
quand j'execute:
bin/stop-all.sh
il est dit que datanode n'a pas été démarré et ne peut donc pas être arrêté. Cependant, la sortie de jps dit le datanode.
j'ai essayé mise en forme du namenode,modifier les permissions du propriétaire, mais il ne semble pas fonctionner. J'espère ne pas avoir raté d'autres informations importantes.
Merci à l'avance.
8 réponses
LA solution qui a fonctionné pour moi était d'exécuter namenode et datanode un par un et pas ensemble en utilisant bin/start-all.sh
. Ce qui se passe en utilisant cette approche est que l'erreur est clairement visible si vous avez un certain problème de réglage des datanodes sur le réseau et aussi de nombreux messages sur stackoverflow suggèrent que namenode nécessite un certain temps pour démarrer-off, par conséquent, il devrait être donné un certain temps pour démarrer avant le démarrage des datanodes. En outre, dans ce cas, j'avais des problèmes avec différents ids de namenode et datanodes pour lesquels j'ai dû changer les ID du datanode avec le même id que le namenode.
étape par étape La procédure à suivre sera:
- Démarrer le namenode
bin/hadoop namenode
. Vérifier les erreurs, le cas échéant. - Démarrer les datanodes
bin/hadoop datanode
. Vérifier les erreurs, le cas échéant. - maintenant, démarrez le traqueur de tâches, le traqueur de tâches en utilisant 'bin/start-mapred.sh'
Regardez votre namenode (probablement http://localhost:50070) et voir combien de datanodes il dit que vous avez.
si elle est 0, alors soit votre datanode ne fonctionne pas, soit il n'est pas configuré pour se connecter au namenode.
si c'est 1, vérifiez combien d'espace libre il y a dans la DFS. Il se peut que le noeud de données n'ait aucun endroit où il peut écrire des données (data dir n'existe pas, ou n'a pas de permissions d'écriture).
bien que résolu, j'ajoute ceci pour les futurs lecteurs. Les conseils de Cody d'inspecter le début de namenode et datanode était utile, et une enquête plus poussée m'a conduit à supprimer le répertoire hadoop-store/dfs. Faire cela a résolu cette erreur pour moi.
j'ai eu le même problème, j'ai regardé les logs de datanode et il y avait un avertissement disant que la dfs.données.dir avait des permissions incorrectes... donc je les ai juste changés et tout a marché, ce qui est un peu bizarre.
spécifiquement, mes " dfs.données.dir" est réglé sur "/home/hadoop/hd_tmp", et l'erreur que j'ai eu é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.
...
...
Donc j'ai simplement exécuté ces commandes:
- j'ai arrêté tous les démons "bin/stop-all.sh"
- Modifier la les autorisations du répertoire avec la commande "chmod -R 755 /home/hadoop/hd_tmp"
- j'ai redonné le format au namenode avec "bin/hadoop namenode-format".
- j'ai relancé les démons "bin/start-all.sh"
- et voilà, le datanode était opérationnel! (J'ai vérifié avec la commande "jsp", où un processus nommé DataNode était affiché).
Et puis tout a bien fonctionné.
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>
j'ai supprimé les propriétés supplémentaires dans le site hdfs.xml et 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é.
j'ai rencontré le même problème. Quand j'ai regardé localhost: 50070, sous le sommaire de regroupement, toutes les propriétés ont été indiquées comme 0 sauf "DFS Used% 100". Généralement, cette situation se produit parce qu'il ya des erreurs dans les trois *-site.xml fichiers sous HADOOP_INSTALL / conf et fichier hosts.
Dans mon cas, la cause est impossible de résoudre le nom d'hôte. J'ai résolu le problème simplement en ajoutant "IP_Address hostname" à / etc / hosts.
Dans mon cas, j'ai dû supprimer:
/tmp/hadoop-<user-name>
le dossier et le format et commencer en utilisant sbin/start-dfs.sh
sbin/start-yarn.sh