HDFS 错误:只能复制到 0 个节点,而不是 1 个
Posted
技术标签:
【中文标题】HDFS 错误:只能复制到 0 个节点,而不是 1 个【英文标题】:HDFS error: could only be replicated to 0 nodes, instead of 1 【发布时间】:2011-07-14 16:29:42 【问题描述】:我在 EC2 中创建了一个 ubuntu 单节点 hadoop 集群。
测试上传到 hdfs 的简单文件可以在 EC2 机器上工作,但不能在 EC2 以外的机器上工作。
我可以通过远程机器的 Web 界面浏览文件系统,它显示一个数据节点报告为服务中。已经在安全性中打开了从 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 日志只是给出了同样的错误。其他的好像没什么好玩的
有什么想法吗?
干杯
【问题讨论】:
我在设置单节点虚拟机时遇到问题。我从conf/core-site.xml
、conf/mapred-site.xml
和conf/hdfs-site.xml
中删除了配置属性。它在我的虚拟机上运行良好。免责声明:我是一个绝对的初学者。我认为这些更改会导致单个实例的默认值,并使其工作。 HTH。
我也遇到了同样的问题/错误。问题首先发生在我使用hadoop namenode -format格式化时所以在使用start-all.sh重新启动hadoop后,数据节点没有启动或初始化。您可以使用 jps 进行检查,应该有五个条目。如果 datanode 丢失,那么你可以这样做:***.com/questions/11889261/…
【参考方案1】:
请按照以下步骤操作:
1.停止dfs
和yarn
。
2.删除core-site.xml
中指定的datanode和namenode目录。
3、启动dfs
和yarn
如下:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
【讨论】:
【参考方案2】:警告:以下内容将破坏 HDFS 上的所有数据。除非您不关心破坏现有数据,否则请勿执行此答案中的步骤!
你应该这样做:
-
停止所有 hadoop 服务
删除 dfs/name 和 dfs/data 目录
hdfs namenode -format
以大写 Y 回答
启动 hadoop 服务
另外,请检查系统中的磁盘空间,并确保日志没有警告您。
【讨论】:
现在我看到了,我记得以前有类似的东西救了我。今天又救了我,谢谢。我一直假设“namenode -format”将所有内容都删除了,但是有一些混乱的状态仍然存在。 删除所有文件如何解决?多么奇怪! 有人可以评论这背后的问题吗?我只有临时数据存储在 HDFS 中,所以这行得通。我宁愿更改任何需要更改的配置,以防止这种情况再次发生。 @buzypi 在 hadoop-2.9.0 中哪里可以找到 dfs/name 和 dfs/data 目录?我试过 find 命令,但没有用。 @Ikthiander 是的,重新格式化永远不应该是答案。但从赞成票的数量来看,显然这个问题主要出现在设置测试集群的人身上,他们可能第一次没有正确格式化它..【参考方案3】:我花了一周的时间来找出我的问题所在。
当客户端(您的程序)向 nameNode 请求数据操作时,nameNode 会通过将 dataNode 的 ip 提供给客户端来选择一个 dataNode 并将客户端导航到它。
但是,当 dataNode 主机配置为具有多个 ip,并且 nameNode 为您提供客户端无法访问的 IP 时,客户端会将 dataNode 添加到排除列表并要求 nameNode 提供一个新的,并且最后所有的dataNode都被排除了,你会得到这个错误。
所以在尝试一切之前检查节点的 ip 设置!!!
【讨论】:
【参考方案4】:不要立即格式化名称节点。尝试 stop-all.sh 并使用 start-all.sh 启动它。如果问题仍然存在,请格式化名称节点。
【讨论】:
【参考方案5】:我将尝试描述我的设置和解决方案: 我的设置: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 确实不存在。
另一个迹象是看到没有数据节点在运行(下面的快照显示固定的工作状态):
我已经解决了这个问题:
rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data
然后重新开始:
sbin/start-dfs.sh
...
【讨论】:
我没有任何 /tmp/hadoop/* 文件,但你暴露的内容符合我的问题【参考方案6】:如果所有数据节点都在运行,还要检查 HDFS 是否有足够的空间存储您的数据。我可以上传一个小文件,但无法将一个大文件(30GB)上传到 HDFS。 “bin/hdfs dfsadmin -report”显示每个数据节点只有几 GB 可用。
【讨论】:
【参考方案7】:这是您的问题 - 客户端无法与 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 不会将数据写入 Datanodes。客户端的工作是使用 DFSOutputStream 将数据写入数据节点。在开始任何写入之前,请确保客户端可以与 Datanode(s) 通信,如果与 Datanode 的通信失败,则将 Datanode 添加到 excludeNodes 中。
【讨论】:
如果确实是问题所在,我该如何在连接到 AWS 集群时获得公共 IP 地址?谢谢 我在 Windows 机器上运行 Talend。我在 Windows 主机文件中创建了一个条目 - > >.【参考方案8】:看下面:
看到这个异常(只能复制到 0 个节点,而不是 1 个),datanode 对 Name Node 不可用..
在以下情况下,名称节点可能无法使用数据节点
数据节点磁盘已满
数据节点忙于块报告和块扫描
如果块大小为负值(hdfs-site.xml 中的 dfs.block.size)
在写入过程中,主数据节点出现故障(任何 n/w 波动 b/w 名称节点和数据节点机器)
当我们附加任何部分块并为后续部分块附加调用同步时,客户端应将先前的数据存储在缓冲区中。
例如,在附加“a”之后,我调用了同步,当我尝试附加缓冲区时应该有“ab”
当块不是512的倍数时,服务器端将尝试对块文件中存在的数据以及元文件中存在的crc进行crc比较。但是在为块中存在的数据构建 crc 时,它总是比较直到初始偏移量或更多分析请数据节点日志
参考:http://www.mail-archive.com/hdfs-user@hadoop.apache.org/msg01374.html
【讨论】:
如果datanode无法在其侦听端口(例如:9000)上到达namenode,也会发生。见***.com/a/19522882/1577626 端口问题是导致 OP 错误的原因。我没有打开dfs.datanode.address
端口地址(CDH 默认为50010
)。【参考方案9】:
由于数据节点未启动,我在 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
输出更改为以下(注意数据节点的开始):
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/...
【讨论】:
【参考方案10】:我意识到我参加聚会有点晚了,但我想发布这个 供此页面的未来访问者使用。我遇到了一个非常相似的问题 当我将文件从本地复制到 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 suggests 增加 nofile 和 epoll 限制(如果打开 内核 2.6.27) 来解决它。棘手的是设置 nofile 和 epoll 限制高度依赖于系统。我的Ubuntu 10.04 server required a slightly different configuration 让这个工作 正确,因此您可能需要相应地改变您的方法。
【讨论】:
【参考方案11】:而且我认为您应该确保在复制到 dfs 时所有数据节点都已启动。在某些情况下,这需要一段时间。我认为这就是“检查健康状况”解决方案有效的原因,因为您转到健康状况网页并等待一切正常,我的 5 美分。
【讨论】:
【参考方案12】:我在设置单节点集群时遇到了类似的问题。我意识到我没有配置任何数据节点。我将我的主机名添加到 conf/slaves,然后它成功了。希望对您有所帮助。
【讨论】:
最后我在 slaves/master 文件中有一个空行,因此失败了:/【参考方案13】:重新格式化节点不是解决方案。您必须编辑 start-all.sh。启动 dfs,等待它完全启动,然后启动 mapred。您可以使用睡眠来执行此操作。等待 1 秒对我有用。在这里查看完整的解决方案http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html。
【讨论】:
【参考方案14】:您是否尝试过来自 wiki http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment 的推荐?
将数据放入 dfs 时出现此错误。解决方案很奇怪并且可能不一致:我删除了所有临时数据以及名称节点,重新格式化了名称节点,启动了所有内容,并访问了我的“集群的”dfs 健康页面 (http://your_host:50070/dfshealth.jsp)。最后一步,访问健康页面,是我绕过错误的唯一方法。访问该页面后,将文件放入和取出 dfs 效果很好!
【讨论】:
我遇到了问题中描述的相同问题,找到并使用了这种方法,但没有成功。以上是关于HDFS 错误:只能复制到 0 个节点,而不是 1 个的主要内容,如果未能解决你的问题,请参考以下文章
文件 jobtracker.info 只能复制到 0 个节点,而不是 1 个
只能复制到 0 个节点而不是 minReplication (=1)。有 2 个数据节点正在运行,并且在此操作中不排除任何节点