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

时间:2011-03-14 00:11:34

标签: amazon-ec2 hadoop

我在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)

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

有什么想法吗?

干杯

16 个答案:

答案 0 :(得分:74)

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

你应该这样做:

  1. 停止所有hadoop服务
  2. 删除dfs / name和dfs / data目录
  3. hdfs namenode -format以大写字母Y回答
  4. 启动hadoop服务
  5. 此外,请检查系统中的磁盘空间,并确保日志不会向您发出警告。

答案 1 :(得分:11)

这是您的问题 - 客户端无法与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;
}

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

答案 2 :(得分:9)

请看以下内容:

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

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

  1. 数据节点磁盘已满

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

  3. 如果Block Size为负值(hdfs-site.xml中为dfs.block.size)

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

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

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

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

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

答案 3 :(得分:8)

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

答案 4 :(得分:4)

我会尝试描述我的设置&amp;解: 我的设置:RHEL 7,hadoop-2.7.3

我首先尝试设置standalone Operation,然后设置Pseudo-Distributed Operation,后者因同一问题而失败。

虽然,当我开始使用hadoop:

sbin/start-dfs.sh

我得到了以下内容:

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(下面的快照显示固定的工作状态):

enter image description here

我通过以下方式解决了这个问题:

rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data

然后重新开始:

sbin/start-dfs.sh
...

答案 5 :(得分:3)

由于数据节点无法启动,我在MacOS X 10.7(hadoop-0.20.2-cdh3u0)上遇到了同样的错误。
start-all.sh产生了以下输出:

starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to host localhost port 22: Connection refused
localhost: ssh: connect to host localhost port 22: Connection refused
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to host localhost port 22: Connection refused

通过System Preferences -> Sharing -> Remote Login启用ssh登录后 它开始起作用了 start-all.sh输出更改为以下(注意datanode的开始):

starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting datanode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting secondarynamenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting tasktracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...

答案 6 :(得分:2)

我认为你应该确保在复制到dfs时所有数据节点都已启动。在某些情况下,需要一段时间。我认为这就是为什么“检查健康状况”的解决方案有效,因为你进入健康状态网页并等待一切,我的五美分。

答案 7 :(得分:2)

我需要一周的时间来解决我的情况。

当客户端(您的程序)要求nameNode进行数据操作时,nameNode会通过将dataNode的ip提供给客户端来获取dataNode并导航客户端。

但是,当dataNode主机配置为具有多个ip,并且nameNode为您提供客户端CAN访问权限时,客户端会将dataNode添加到排除列表并向nameNode请求新的,最后排除所有dataNode,你得到这个错误。

请在尝试所有操作之前检查节点的ip设置!!!

答案 8 :(得分:1)

如果所有数据节点都在运行,还有一件事要检查HDFS是否有足够的空间容纳您的数据。我可以上传一个小文件,但无法将大文件(30GB)上传到HDFS。 &#39; bin / hdfs dfsadmin -report&#39;表明每个数据节点只有几GB可用。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

重新格式化节点不是解决方案。您必须编辑start-all.sh。启动dfs,等待它完全启动然后启动mapred。你可以睡一觉。等待1秒钟为我工作。请在此处查看完整的解决方案http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html

答案 11 :(得分:0)

我意识到我有点迟到了,但我想发布这个 对于此页面的未来访客。我遇到了一个非常类似的问题 当我从本地复制文件到hdfs并重新格式化 namenode没有为我解决问题。原来,我的名字节点 日志有以下错误消息:

2012-07-11 03:55:43,479 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver java.io.IOException: Too many open files
        at java.io.UnixFileSystem.createFileExclusively(Native Method)
        at java.io.File.createNewFile(File.java:883)
        at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:491)
        at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:462)
        at org.apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.java:1628)
        at org.apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.java:1514)
        at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:113)
        at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:381)
        at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:171)

显然,这是hadoop集群的一个相对常见的问题 Cloudera suggests增加nofile和epoll限制(如果开启 内核2.6.27)解决它。棘手的是设置 nofile和epoll限制高度依赖于系统。我的Ubuntu 10.04 server required a slightly different configuration可以使用它 正确的,所以你可能需要相应地改变你的方法。

答案 12 :(得分:0)

我也有同样的问题/错误。使用hadoop namenode -format

格式化时,首先出现问题

因此在重新启动hadoop后使用start-all.sh,数据节点没有启动或初始化。您可以使用jps进行检查,应该有五个条目。如果缺少datanode,那么你可以这样做:

Datanode process not running in Hadoop

希望这有帮助。

答案 13 :(得分:0)

请勿立即格式化名称节点。尝试stop-all.sh并使用start-all.sh启动它。如果问题仍然存在,请转到格式化名称节点。

答案 14 :(得分:0)

按照以下步骤操作:
1.停止dfsyarn 2.删除core-site.xml中指定的datanode和namenode目录 3.按如下方式启动dfsyarn

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

答案 15 :(得分:-1)

这是关于SELINUX的。在我的案例中,CentOS 6.5

所有节点(名称,第二,数据....)

  

service iptables stop