web-dev-qa-db-ja.com

Hadoopのデータ複製エラー

Michael Nollのチュートリアル に従って、マシン上にHadoop Single Node Clusterを実装しています。データ複製エラーに遭遇しました:

完全なエラーメッセージを次に示します。

> 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の出力は、データノードが存在することを示しています。

私はnamenodeのフォーマット所有者権限の変更を試みましたが、そうではありません動作するようです。他の関連情報を見逃していないことを願っています。

前もって感謝します。

22
Apoorv Saxena

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

段階的な手順は次のとおりです。

  1. Namenodeを開始しますbin/hadoop namenode。エラーがある場合は確認します。
  2. データノードを開始しますbin/hadoop datanode。エラーがある場合は確認します。
  3. 「bin/start-mapred.sh」を使用して、タスクトラッカー、ジョブトラッカーを起動します
26
Apoorv Saxena

ネームノード(おそらく http:// localhost:5007 )を見て、所有しているデータノードの数を確認してください。

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

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

7
E Smith

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

4
Mike

私は同じ問題を抱えていたので、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にフォーマットを再度指定しました。
  • デーモン「bin/start-all.sh」を再起動しました
  • ほら、データノードが稼働していました! (コマンド「jsp」で確認しました。DataNodeという名前のプロセスが表示されていました)。

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

2
cacol89

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

1
killjoy

私の場合、dfs.name.dirおよびdfs.data.dir。正しい形式は

 <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

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

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

0
leodream

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

/tmp/hadoop-<user-name>フォルダーとフォーマットを設定し、sbin/start-dfs.sh

sbin/start-yarn.sh

0
swapna