23

Michael Noll のチュートリアルに従って、自分のマシンに Hadoop シングル ノード クラスタを実装していますが、データ レプリケーション エラーが発生しました。

完全なエラー メッセージは次のとおりです。

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

また、実行すると:

bin/stop-all.sh

データノードが開始されていないため、停止できないと表示されます。ただし、 jpsの出力には、datanode が存在することが示されています。

namenodeをフォーマットして、 owner permissions を変更しようとしましたが、うまくいかないようです。他の関連情報を見逃さなかったことを願っています。

前もって感謝します。

4

8 に答える 8

26

私にとってうまくいった解決策は、namenode と datanode を 1 つずつ実行することでしたbin/start-all.sh。このアプローチを使用すると、ネットワーク上のデータノードの設定に問題がある場合にエラーが明確に表示され、また、stackoverflow に関する多くの投稿で、namenode の開始に時間がかかることが示唆されているため、しばらく時間を与える必要があります。データノードを開始する前に開始します。また、この場合、namenode と datanodes の異なる ID に問題があり、namenode と同じ ID を持つ datanode の ID を変更する必要がありました。

ステップバイステップの手順は次のとおりです。

  1. namenode を開始しますbin/hadoop namenode。エラーがある場合は、チェックします。
  2. データノードを開始しますbin/hadoop datanode。エラーがある場合は、チェックします。
  3. 「bin/start-mapred.sh」を使用して、タスクトラッカー、ジョブトラッカーを開始します
于 2012-05-11T18:35:34.573 に答える
8

namenode (おそらくhttp://localhost:50070 ) を見て、いくつのデータノードがあるかを確認してください。

0 の場合、データノードが実行されていないか、namenode に接続するように構成されていません。

1 の場合は、DFS にどれだけの空き容量があるかを確認してください。データ ノードにデータを書き込むことができる場所がない可能性があります (データ ディレクトリが存在しないか、書き込み権限がありません)。

于 2012-05-04T11:33:13.390 に答える
4

解決済みですが、将来の読者のためにこれを追加しています。namenode と datanode の開始点を調べるという Cody のアドバイスは役に立ちました。さらに調査を進めると、hadoop-store/dfs ディレクトリを削除することになりました。これを行うと、このエラーが解決しました。

于 2013-03-13T01:23:40.863 に答える
3

私は同じ問題を抱えていました.datanodeログを見て、dfs.data.dirに間違った権限があるという警告がありました.

具体的には、「dfs.data.dir」が「/home/hadoop/hd_tmp」に設定されていて、次のエラーが発生しました。

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

だから私は単にこれらのコマンドを実行しました:

  • 「bin/stop-all.sh」ですべてのデーモンを停止しました
  • 「chmod -R 755 /home/hadoop/hd_tmp」でディレクトリのパーミッションを変更
  • 「bin/hadoop namenode -format」でnamenodeに再度formatをつけました。
  • デーモン「bin/start-all.sh」を再起動しました
  • そしてほら、データノードが稼働していました!(DataNodeという名前のプロセスが表示されたコマンド「jsp」で確認しました)。

そして、すべてがうまくいきました。

于 2013-04-06T18:26:27.057 に答える
1

hdfs-site.xml の余分なプロパティを削除したところ、この問題はなくなりました。Hadoop はエラー メッセージを改善する必要があります。上記の各ソリューションを試しましたが、どれも機能しませんでした。

于 2015-03-17T19:33:39.390 に答える
0

同じ問題が発生しました。localhost:50070を見ると、クラスターの概要の下に、「DFS Used% 100」以外のすべてのプロパティが 0 と表示されていました。通常、この状況は、HADOOP_INSTALL/conf および hosts ファイルの下にある 3 つの*-site.xmlファイルにいくつかの誤りがあるために発生します。

私の場合、原因はホスト名を解決できないことです。「IP_Address hostname」を/etc/hostsに追加するだけで問題を解決しました。

于 2013-04-09T15:04:18.533 に答える
0

私の場合、削除する必要がありました:

/tmp/hadoop-<user-name>フォルダとフォーマットして使い始めるsbin/start-dfs.sh

sbin/start-yarn.sh

于 2015-07-29T21:43:00.493 に答える