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

我已经在EC2中创build了一个Ubuntu的单节点hadoop集群。

testing一个简单的file upload到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日志只是给出了相同的错误。 其他人似乎没有什么有趣的

有任何想法吗?

干杯

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

你应该做这个:

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

另外,请检查系统中的磁盘空间,并确保日志不会警告您。

这是你的问题 – 客户端不能与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将数据写入Datanodes是客户的工作。 在任何写入操作开始之前,请确保客户端可以与Datanode进行通信,并且如果与Datanode通信失败,则将Datanode添加到excludedNodes中。

我有一个类似的问题,build立一个单一的节点群集。 我意识到我没有configuration任何datanode。 我把我的主机名添加到conf / slaves,然后解决了。 希望能帮助到你。

看下面的内容:

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

这是以下情况数据节点可能不可用于名称节点

  1. 数据节点磁盘已满

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

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

  4. 而正在写入的主数据节点出现故障(名称节点和数据节点机器出现任何波动)

  5. 当我们追加任何部分块和调用同步为后续的部分块附加客户端应该存储在缓冲区中的以前的数据。

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

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

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

由于数据节点未启动,我在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启用sshlogin后,它开始工作。
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/... 

我将尝试描述我的设置和解决scheme:我的设置: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确实不存在。

另一个迹象是看到没有datanode正在运行(下面的快照显示固定的工作状态):

在这里输入图像说明

我已经通过这样做解决了这个问题:

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

然后重新开始:

 sbin/start-dfs.sh ... 

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

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

你有没有尝试从维基http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment推荐?;

将数据放入dfs时,出现这个错误。 解决scheme很奇怪,可能是不一致的:我删除了所有临时数据以及namenode,重新设置了namenode的格式,启动了一切,并访问了我的“集群”dfs健康页面(http:// your_host:50070 / dfshealth.jsp)。 最后一步,访问健康页面,是我能解决这个错误的唯一方法。 一旦我访问了该页面,将文件放入和退出dfs工作得非常好!

重新格式化节点不是解决scheme。 你将不得不编辑start-all.sh。 启动dfs,等待它完全启动,然后开始映射。 你可以用睡觉做这个。 等待1秒钟为我工作。 请参阅http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html上的完整解决scheme。;

我意识到我对晚会有点迟,但是我想把这个发布给这个页面的未来访问者。 当我将文件从本地复制到hdfs时,我遇到了一个非常类似的问题,重新设置namenode并不能解决问题。 事实certificate,我的名字节点日志有以下错误信息:

 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集群上比较常见的问题, Clouderabuild议增加nofile和epoll的限制(如果在内核2.6.27上)来解决这个问题。 棘手的是,设置nofile和epoll限制是高度依赖于系统的。 我的Ubuntu 10.04服务器需要稍微不同的configuration才能正常工作,因此您可能需要相应地改变您的方法。

我也有同样的问题/错误。 当我使用hadoop namenode -format格式化时,问题首先发生

所以重新启动hadoop使用start-all.sh后,数据节点没有启动或初始化。 你可以用jps来检查这个,应该有五个条目。 如果datanode丢失,那么你可以这样做:

Datanode进程不在Hadoop中运行

希望这可以帮助。

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

遵循以下步骤:1.停止dfs和纱线。 2.删除core-site.xml中指定的datanode和namenode目录。 3.启动dfs和纱线如下:

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

我花了一个星期的时间来弄清楚我的情况。

当客户端(你的程序)要求nameNode进行数据操作时,nameNodeselect一个dataNode并通过给客户端发送dataNode的ip来导航客户端。

但是,当dataNode主机被configuration为具有多个IP,并且nameNode为您提供了一个您的客户端无法访问的客户端时,客户端将添加dataNode以排除列表,并请求nameNode为一个新的,最后所有dataNode被排除,你会得到这个错误。

所以在你尝试一切之前检查节点的ip设置!

这是关于SELINUX。 在我的情况下,CentOS 6.5

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

服务iptables停止