首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HDFS错误:只能复制到0个节点,而不是1个节点

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

Stack Overflow用户
提问于 2011-03-14 08:11:34
回答 12查看 90.3K关注 0票数 70

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

在EC2机器上测试一个简单的文件上传到hdfs是可行的,但是在EC2之外的机器上是行不通的。

我可以从远程计算机通过web界面浏览文件系统,它显示了一个报告为服务中的datanode。已打开安全级别从0到60000的所有tcp端口(!)所以我不认为是那样的。

我得到了错误

代码语言:javascript
复制
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)

namenode日志只是给出了相同的错误。其他人似乎没有什么有趣的东西

有什么想法吗?

干杯

EN

回答 12

Stack Overflow用户

发布于 2014-02-18 00:47:18

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

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

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

代码语言:javascript
复制
//
// 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;
}

这里要理解的关键是,Namenode仅提供用于存储块的数据节点列表。Namenode不会将数据写入数据节点。客户端的工作是使用DFSOutputStream将数据写入数据节点。在开始编写上述代码之前,请确保客户端可以与数据节点通信,如果与数据节点的通信失败,则将数据节点添加到excludedNodes中。

票数 13
EN

Stack Overflow用户

发布于 2011-10-08 18:23:18

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

票数 8
EN

Stack Overflow用户

发布于 2016-09-02 18:12:14

我将尝试描述我的设置和解决方案:我的设置: RHEL 7,hadoop-2.7.3

我尝试先设置standalone Operation,然后再设置Pseudo-Distributed Operation,后者由于同样的问题而失败。

不过,当我启动hadoop时:

代码语言:javascript
复制
sbin/start-dfs.sh

我得到了以下信息:

代码语言:javascript
复制
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out

这看起来很有希望(启动datanode..没有失败)-但是datanode实际上并不存在。

另一个指示是看到没有运行中的datanode (下面的快照显示了固定的工作状态):

我已经通过执行以下操作修复了这个问题:

代码语言:javascript
复制
rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data

然后重新开始:

代码语言:javascript
复制
sbin/start-dfs.sh
...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5293446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档