it-swarm.com.de

Datenreplikationsfehler in Hadoop

Ich implementiere den Hadoop Single Node Cluster auf meinem Computer, indem ich das Tutorial von Michael Noll befolge und einen Datenreplikationsfehler habe:

Hier ist die vollständige Fehlermeldung:

> [email protected]:~/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)

Auch wenn ich ausführen:

bin/stop-all.sh

Der Datanode wurde nicht gestartet und kann daher nicht gestoppt werden. Die Ausgabe von jps sagt jedoch aus, dass der Datenanode vorhanden ist.

Ich habe versucht, die Namenskennung zu formatieren, die Besitzerberechtigungen zu ändern, aber es scheint nicht zu funktionieren. Hoffe, ich habe keine anderen relevanten Informationen vermisst.

Danke im Voraus.

21
Apoorv Saxena

Die Lösung, die für mich funktionierte, bestand darin, namenode und datanode nacheinander und nicht zusammen mit bin/start-all.sh auszuführen. Bei diesem Ansatz wird der Fehler deutlich sichtbar, wenn Sie Probleme mit der Einstellung der Datanoden im Netzwerk haben. Auch bei vielen Posts im stackoverflow ist zu vermuten, dass namenode einige Zeit zum Starten benötigt Starten Sie vor dem Start der Datanodes. In diesem Fall hatte ich auch Probleme mit verschiedenen IDs von Namenode und Datanodes, für die ich die IDs des Datanodes mit derselben ID wie der Namenode ändern musste.

Die schrittweise Vorgehensweise wird sein:

  1. Starten Sie den Namencode bin/hadoop namenode. Prüfen Sie, ob Fehler vorhanden sind.
  2. Starten Sie die Datencodes bin/hadoop datanode. Prüfen Sie, ob Fehler vorhanden sind.
  3. Starten Sie nun den Task-Tracker, Job-Tracker mit 'bin/start-mapred.sh'.
26
Apoorv Saxena

Schauen Sie sich Ihren Namen an (wahrscheinlich http: // localhost: 50070 ) und sehen Sie, wie viele Datenknoten Sie haben. 

Wenn es 0 ist, wird Ihr Datenknoten entweder nicht ausgeführt oder ist nicht für die Verbindung zum Namensknoten konfiguriert. 

Wenn es 1 ist, prüfen Sie, wie viel freier Speicherplatz in der DFS vorhanden ist. Möglicherweise verfügt der Datenknoten nicht über eine Stelle, an die er Daten schreiben kann (Datenverzeichnis ist nicht vorhanden oder verfügt nicht über Schreibberechtigungen).

7
E Smith

Obwohl gelöst, füge ich dies für zukünftige Leser hinzu. Codys Rat, den Start von Namenode und Datanode zu überprüfen, war hilfreich, und weitere Untersuchungen veranlassten mich, das Verzeichnis hadoop-store/dfs zu löschen. Dadurch wurde dieser Fehler für mich behoben.

4
Mike

Ich hatte das gleiche Problem, ich schaute mir die Datanode-Protokolle an und es gab eine Warnung, dass die dfs.data.dir falsche Berechtigungen hatte ... also habe ich sie einfach geändert und alles hat funktioniert, was irgendwie komisch ist.

Insbesondere wurde meine "dfs.data.dir" auf "/ home/hadoop/hd_tmp" gesetzt und der Fehler, den ich erhielt, war:

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

Also habe ich einfach diese Befehle ausgeführt:

  • Ich habe alle Dämonen mit "bin/stop-all.sh" gestoppt
  • Ändern Sie die Berechtigungen des Verzeichnisses mit "chmod -R 755/home/hadoop/hd_tmp"
  • Ich habe dem namenode mit "bin/hadoop namenode -format" erneut formatiert.
  • Ich habe die Dämonen "bin/start-all.sh" neu gestartet
  • Und voilà, der Datanode lief! (Ich habe es mit dem Befehl "jsp" überprüft, wo ein Prozess mit dem Namen DataNode angezeigt wurde).

Und dann hat alles gut funktioniert.

2
cacol89

Ich habe die zusätzlichen Eigenschaften in der Datei hdfs-site.xml entfernt und dann war dieses Problem behoben. Hadoop muss die Fehlermeldungen verbessern. Ich habe jede der oben genannten Lösungen ausprobiert und keine hat funktioniert.

1
killjoy

In meinem Fall habe ich fälschlicherweise ein Ziel für dfs.name.dir und dfs.data.dir festgelegt. Das richtige Format ist

 <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

Ich bin auf das gleiche Problem gestoßen. Als ich localhost: 50070 sah, wurden in der Clusterzusammenfassung alle Eigenschaften mit Ausnahme von "DFS Used% 100" als 0 angezeigt. In der Regel tritt diese Situation auf, weil in den drei * -site.xml -Dateien unter HADOOP_INSTALL/conf und hosts einige Fehler enthalten sind.

In meinem Fall kann die Ursache den Hostnamen nicht auflösen. Ich löste das Problem einfach durch Hinzufügen von "IP_Address hostname" zu/etc/hosts .

0
leodream

In meinem Fall musste ich löschen:

/tmp/hadoop-<user-name> Ordner und Format und beginnen mit sbin/start-dfs.sh

sbin/start-yarn.sh

0
swapna