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


68

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

在EC2机器上测试将简单文件上传到hdfs的方法有效,但在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日志仅给出相同的错误。其他人似乎没有任何有趣的东西

有任何想法吗?

干杯


2
我在设置单节点VM时遇到问题。我删除从配置属性conf/core-site.xmlconf/mapred-site.xmlconf/hdfs-site.xml。在我的VM上工作正常。免责声明:我是一个绝对的初学者。我认为这些更改会导致单个实例的默认值,从而使其正常工作。HTH。
vrrathod

我也有同样的问题/错误。当我使用hadoop namenode -format进行格式化时,该问题首先发生。因此,在使用start-all.sh重新启动hadoop之后,数据节点未启动或初始化。您可以使用jps进行检查,应该有五个条目。如果数据节点丢失,那么你就可以做到这一点stackoverflow.com/questions/11889261/...
Swaroop Pydisetty

Answers:


74

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

你应该做这个:

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

另外,请检查系统中的磁盘空间,并确保日志没有警告您有关此内容。


1
现在我看到了,我记得以前有类似的事情救了我。今天再次救了我,谢谢。我一直以为'namenode -format'使一切空白,但是状态仍然有些混乱。
丹·布里克利

7
如何删除所有文件是解决方案?多么奇怪!!
Ikthiander

有人可以对此发表评论吗?我只有短暂的数据存储在HDFS中,因此可以正常工作。我希望更改需要更改的任何配置,以防止再次发生这种情况。
nojo

@buzypi在hadoop-2.9.0中的哪里找到dfs / name和dfs / data目录?我尝试了find命令,但是没有用。
PHcoDer

@Ikthiander是的,重新格式化绝对不是答案。但是从投票的数量来看,显然这个问题主要是由于设置测试集群的人而引起的,他们可能第一次没有正确格式化它
。.– Nutle

13

这是您的问题-客户端无法与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仅提供Datanodes的列表来存储块。Namenode不会将数据写入Datanodes。客户端的工作是使用DFSOutputStream将数据写入Datanode。在开始任何写操作之前,上述代码请确保客户端可以与Datanode通信,并且如果无法与Datanode通信,则将Datanode添加到excludeNodes。


如果确实是问题所在,那么在连接到AWS集群时如何获得公共IP地址?谢谢
cyberjoac '16

我从Windows计算机运行Talend。我在Windows主机文件中输入了一个条目-<< EC2的公共IP地址>> <<内部或专用主机名>>。
user24981 '18

9

看下面:

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

在以下情况下,数据节点可能不适用于名称节点

  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


如果datanode无法在其侦听端口上到达namenode(例如9000),也会发生这种情况。参见stackoverflow.com/a/19522882/1577626
vpathak 2013年

端口问题是导致OP对我造成错误的原因。我没有dfs.datanode.address打开端口地址(50010CDH默认情况下)。
杰克Z

8

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


我在slaves / master文件中最后有一个空行,并且由于这个原因而失败了:/
blackuprise

4

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

我尝试先设置独立操作,然后再设置伪分布式操作,其中后者由于相同的问题而失败。

虽然,当我开始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确实不存在。

另一个指示是看到没有数据节点在运行(以下快照显示了固定的工作状态):

在此处输入图片说明

我已通过以下方法解决了该问题:

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

然后重新开始:

sbin/start-dfs.sh
...

我没有任何/ tmp / hadoop / *文件,但是yu暴露的内容与我的问题匹配
Kailegh

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/...

2

而且我认为,当您复制到dfs时,应确保所有的datanodes都已启动。在某些情况下,需要一些时间。我认为这就是为什么“检查健康状况”解决方案起作用的原因,因为您转到健康状况网页并等待所有费用增加,五分钱。


2

我花了一周的时间来弄清我所处的问题。

当客户端(您的程序)要求nameNode进行数据操作时,nameNode通过将dataNode的ip提供给客户端,来选择一个dataNode并将其导航到客户端。

但是,如果将dataNode主机配置为具有多个ip,并且nameNode为您提供了一个您的客户端无法访问的IP,则客户端将添加dataNode以排除列表,并向nameNode请求一个新的,最后是所有dataNode被排除,您将收到此错误。

因此,在尝试一切之前,请检查节点的ip设置!!!


1

如果所有数据节点都在运行,则还要检查HDFS是否有足够的空间来存储数据。我可以上传一个小文件,但是无法上传一个大文件(30GB)到HDFS。“ bin / hdfs dfsadmin -report”显示每个数据节点只有几个GB可用。


0

您是否尝试过来自Wiki http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment的建议?

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


我在问题中描述了相同的问题,找到并使用了这种方法,但没有成功。
Nigini 2012年


0

我知道我参加聚会有点晚了,但是我想把这个发布给这个页面的未来访客。当我将文件从本地复制到hdfs并重新格式化namenode时,我遇到了一个非常相似的问题,但对我来说却无法解决问题。原来,我的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建议增加nofile和epoll限制(如果在内核2.6.27上)以解决该问题。棘手的是,设置nofile和epoll限制与系统高度相关。我的Ubuntu 10.04服务器需要稍有不同的配置才能正常工作,因此您可能需要相应地更改方法。



0

请执行以下步骤:
1.停止dfsyarn
2.按照中指定删除datanode和namenode目录core-site.xml
3.开始dfsyarn如下所示:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.