Hadoop中的数据复制错误

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

它说datanode尚未启动,因此无法停止。但是,jps的输出显示datanode存在。
我尝试了格式化namenode和更改所有者权限,但似乎不起作用。希望我没有错过其他相关信息。
提前致谢。
8个回答

26
我成功解决的方法是单独启动namenode和datanode,而不是使用bin/start-all.sh同时启动。采用这种方法,如果您在设置datanodes网络时遇到问题,则错误很明显。此外,StackOverflow上的许多帖子建议给namenode一些时间来启动,因此在启动datanodes之前应该给它一些时间。此外,在这种情况下,我遇到了namenode和datanodes具有不同id的问题,因此我必须更改具有与namenode相同id的datanode的ids。
具体步骤如下:
1. 启动namenode:bin/hadoop namenode。检查是否有任何错误。 2. 启动datanodes:bin/hadoop datanode。检查是否有任何错误。 3. 现在使用'bin/start-mapred.sh'启动task-tracker、job tracker。

8
请查看您的namenode(可能是http://localhost:50070),并查看它显示了多少个数据节点。

如果为0,则可能您的数据节点未运行或未配置为连接到namenode。

如果为1,请检查DFS中显示的剩余可用空间大小。可能是数据节点没有可以写入数据的位置(数据目录不存在或没有写权限)。


谢谢,我实际上找到了解决方案。这是因为数据节点和名称节点需要时间启动,而不是执行 bin/start-all.sh,我执行了 bin/hadoop namenodebin/hadoop datanode 然后执行了 bin/start-mapred.sh - Apoorv Saxena

4

虽然问题已经解决,但我为了未来的读者添加这个答案。Cody建议检查namenode和datanode的启动情况是有用的,进一步调查发现我需要删除hadoop-store/dfs目录。这样做使我解决了这个错误。


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进行格式化
  • 重新启动恶魔 "bin/start-all.sh"
  • 然后,万事大吉,数据节点正常运行!(我使用命令 "jsp" 进行了检查,其中显示了名为DataNode的进程)。
然后一切都正常工作了。

1

我在hdfs-site.xml中删除了多余的属性,然后这个问题就解决了。Hadoop需要在错误信息方面有所改进。我尝试了上述每种解决方案,但都没有起作用。


1
在我的情况下,我错误地设置了一个目的地用于 dfs.name.dirdfs.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>

0
在我的情况下,我必须删除:

/tmp/hadoop-<user-name>文件夹并格式化,然后使用sbin/start-dfs.sh开始。

sbin/start-yarn.sh


0

我遇到了同样的问题。当我查看localhost:50070时,在集群摘要下,除了“DFS Used%100”之外,所有属性都显示为0。通常,这种情况发生是因为HADOOP_INSTALL / conf和hosts文件中的三个*-site.xml文件中存在一些错误。

在我的情况下,原因是无法解析主机名。我通过将“IP_Address hostname”添加到/etc/hosts中来简单地解决了这个问题。


你是认真的吗?将“127.0.0.1 hostname”添加到 /etc/hosts 可能会导致 连接被拒绝 错误。http://wiki.apache.org/hadoop/ConnectionRefused - zeekvfu
我不知道当时为什么写了127.0.0.1。现在我的/etc/hosts文件中没有这样的条目。我想我本来是要写"<IP地址>主机名",但犯了一个错误。对于那些被这个评论误导的人,我感到抱歉。 - leodream

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接