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のフォーマット、所有者権限の変更を試みましたが、そうではありません動作するようです。他の関連情報を見逃していないことを願っています。
前もって感謝します。
私のために働いた解決策は、namenodeとdatanodeを1つずつ実行し、bin/start-all.sh
。このアプローチを使用すると、ネットワーク上のデータノードの設定に問題がある場合にエラーが明確に表示され、stackoverflowの多くの投稿で、namenodeの起動に時間がかかることが示唆されているため、データノードを開始する前に開始します。また、この場合、namenodeとdatanodeの異なるIDで問題が発生し、namenodeと同じidのdatanodeのidを変更する必要がありました。
段階的な手順は次のとおりです。
bin/hadoop namenode
。エラーがある場合は確認します。bin/hadoop datanode
。エラーがある場合は確認します。ネームノード(おそらく http:// localhost:5007 )を見て、所有しているデータノードの数を確認してください。
0の場合、データノードが実行されていないか、ネームノードに接続するように構成されていません。
1の場合、DFSにある空き容量を確認してください。データノードには、データを書き込むことができる場所がない(データディレクトリが存在しないか、書き込み権限がない)可能性があります。
解決しましたが、将来の読者のためにこれを追加しています。 namenodeとdatanodeの開始を調べるというCodyのアドバイスは役に立ちました。さらに調査して、hadoop-store/dfsディレクトリを削除しました。これを行うと、このエラーは解決しました。
私は同じ問題を抱えていたので、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.
...
...
だから私は単にこれらのコマンドを実行しました:
そして、すべてがうまくいきました。
Hdfs-site.xmlの余分なプロパティを削除すると、この問題はなくなりました。 Hadoopは、エラーメッセージを改善する必要があります。上記の各ソリューションを試しましたが、どれも機能しませんでした。
私の場合、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>
同じ問題が発生しました。 localhost:5007を見ると、クラスターの概要の下で、「DFS Used%100」を除くすべてのプロパティが0と表示されていました。通常、この状況は、HADOOP_INSTALL/confおよびhostsファイルの下の3つの*-site.xmlファイルにいくつかの間違いがあるために発生します。
私の場合、原因はホスト名を解決できません。 「IP_Address hostname」を/ etc/hostsに追加するだけで問題を解決しました。
私の場合、私は削除する必要がありました:
/tmp/hadoop-<user-name>
フォルダーとフォーマットを設定し、sbin/start-dfs.sh
sbin/start-yarn.sh