HDFS错误:只能复制到0个节点,而不是1个

Ste*_*eve 67 hadoop amazon-ec2

我在EC2中创建了一个ubuntu单节点hadoop集群.

测试简单的文件上传到hdfs可以从EC2机器上运行,但不能在EC2之外的机器上运行.

我可以通过远程机器的Web界面浏览文件系统,它显示一个在服务中报告的datanode.已打开安全性中从0到60000(!)的所有tcp端口,所以我不认为是这样.

我收到了错误

java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1448)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:690)
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.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:342)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1350)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1346)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:742)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1344)

at org.apache.hadoop.ipc.Client.call(Client.java:905)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:198)
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.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:928)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:811)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:427)
Run Code Online (Sandbox Code Playgroud)

namenode log只会给出相同的错误.其他人似乎没有任何有趣的东西

有任何想法吗?

干杯

buz*_*ypi 74

警告:以下内容将破坏HDFS上的所有数据.除非您不关心破坏现有数据,否则不要执行此答案中的步骤!

你应该做这个:

  1. 停止所有hadoop服务
  2. 删除dfs/name和dfs/data目录
  3. hdfs namenode -format 用资本Y回答
  4. 启动hadoop服务

此外,请检查系统中的磁盘空间,并确保日志不会向您发出警告.

  • 如何删除所有文件的解决方案?多么奇怪!! (7认同)
  • 我想把这个答案作为我的主页. (6认同)

小智 12

这是您的问题 - 客户端无法与Datanode通信.因为客户端为Datanode接收的IP是内部IP而不是公共IP.看看这个

http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/

查看DFSClient $ DFSOutputStrem(Hadoop 1.2.1)中的源代码

//
// Connect to first DataNode in the list.
//
success = createBlockOutputStream(nodes, clientName, false);

if (!success) {
  LOG.info("Abandoning " + block);
  namenode.abandonBlock(block, src, clientName);

  if (errorIndex < nodes.length) {
    LOG.info("Excluding datanode " + nodes[errorIndex]);
    excludedNodes.add(nodes[errorIndex]);
  }

  // Connection failed. Let's wait a little bit and retry
  retry = true;
}
Run Code Online (Sandbox Code Playgroud)

这里要理解的关键是Namenode只提供Datanode列表来存储块.Namenode不会将数据写入Datanode.客户端的工作是使用DFSOutputStream将数据写入Datanode.在任何写入开始之前,上述代码确保客户端可以与Datanode通信,如果通信失败到Datanode,则Datanode被添加到excludedNodes.


小智 9

请看以下内容:

通过查看此异常(只能复制到0个节点,而不是1),datanode不可用于Name Node.

以下情况数据节点可能无法用于名称节点

  1. 数据节点磁盘已满

  2. 数据节点忙,具有块报告和块扫描

  3. 如果块大小为负值(hdfs-site.xml中为dfs.block.size)

  4. 正在写入时主数据节点发生故障(任何n/w波动b/w名称节点和数据节点机器)

  5. 当我们追加任何部分块并为后续部分块追加调用同步时,客户端应将先前数据存储在缓冲区中.

例如,在追加"a"后我调用了sync,当我尝试追加缓冲区时应该有"ab"

当服务器端的块不是512的倍数时,它会尝试对块文件中存在的数据以及元文件中存在的crc进行Crc比较.但是在为块中存在的数据构建crc时,它总是比较直到最初的Offeset或者更多分析请数据节点日志

参考:http://www.mail-archive.com/hdfs-user@hadoop.apache.org/msg01374.html


mic*_*liu 8

我在设置单节点集群时遇到了类似的问题.我意识到我没有配置任何datanode.我将我的主机名添加到conf/slaves,然后就解决了.希望能帮助到你.


Joe*_*ein 0

您是否尝试过 wiki http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment的推荐?

我在将数据放入 dfs 时遇到此错误。解决方案很奇怪并且可能不一致:我删除了所有临时数据以及名称节点,重新格式化名称节点,启动所有内容,并访问我的“集群”dfs 运行状况页面(http://your_host:50070/dfshealth.jsp)。最后一步,访问健康页面,是我解决该错误的唯一方法。一旦我访问了该页面,将文件放入和取出 dfs 的效果就非常好!