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的输出表明存在数据节点。

我尝试格式化 namenode更改所有者权限,但它似乎不起作用。希望我没有错过任何其他相关信息。

提前致谢。

4

8 回答 8

26

对我有用的解决方案是一个一个地运行 namenode 和 datanode,而不是一起使用bin/start-all.sh. 使用这种方法会发生什么情况是,如果您在网络上设置数据节点时遇到一些问题,并且stackoverflow 上的许多帖子表明namenode 需要一些时间来启动,则错误是清晰可见的,因此,应该给它一些时间在启动数据节点之前启动。此外,在这种情况下,我遇到了名称节点和数据节点的不同 ID 的问题,我必须更改与名称节点相同 ID 的数据节点的 ID。

逐步的过程将是:

  1. 启动名称节点bin/hadoop namenode。检查错误(如果有)。
  2. 启动数据节点bin/hadoop datanode。检查错误(如果有)。
  3. 现在使用“bin/start-mapred.sh”启动任务跟踪器、作业跟踪器
于 2012-05-11T18:35:34.573 回答
8

查看您的名称节点(可能是http://localhost:50070),看看它说您有多少个数据节点。

如果它是 0,那么要么你的 datanode 没有运行,要么它没有配置为连接到 namenode。

如果为 1,请检查 DFS 中有多少可用空间。可能是数据节点没有可以写入数据的任何地方(数据目录不存在,或者没有写入权限)。

于 2012-05-04T11:33:13.390 回答
4

虽然解决了,但我正在为未来的读者添加这个。Cody 关于检查 namenode 和 datanode 开始的建议很有用,进一步调查导致我删除了 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格式。
  • 我重新启动了恶魔“bin/start-all.sh”
  • 瞧,datanode 已启动并运行!(我用命令“jsp”检查了它,其中显示了一个名为 DataNode 的进程)。

然后一切正常。

于 2013-04-06T18:26:27.057 回答
1

dfs.name.dir就我而言,我错误地为and设置了一个目的地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>
于 2014-03-24T11:40:28.403 回答
1

我删除了 hdfs-site.xml 中的额外属性,然后这个问题就消失了。Hadoop 需要改进其错误消息。我尝试了上述每种解决方案,但都没有奏效。

于 2015-03-17T19:33:39.390 回答
0

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

就我而言,原因是无法解析主机名。我只需将“IP_Address 主机名”添加到/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 回答