我在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只会给出相同的错误。其他人似乎没有任何有趣的东西
有什么想法吗?
干杯
答案 0 :(得分:74)
警告:以下内容将破坏HDFS上的所有数据。除非您不关心破坏现有数据,否则请勿执行此答案中的步骤!!
你应该这样做:
hdfs namenode -format
以大写字母Y回答此外,请检查系统中的磁盘空间,并确保日志不会向您发出警告。
答案 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不可用于名称节点。
以下情况数据节点可能无法用于名称节点
数据节点磁盘已满
数据节点忙,有块报告和块扫描
如果Block Size为负值(hdfs-site.xml中为dfs.block.size)
正在写入时主数据节点发生故障(任何n / w波动b / w名称节点和数据节点机器)
当我们追加任何部分块并为后续部分块追加调用同步时,客户端应将先前数据存储在缓冲区中。
例如在追加“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(下面的快照显示固定的工作状态):
我通过以下方式解决了这个问题:
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.停止dfs
和yarn
2.删除core-site.xml
中指定的datanode和namenode目录
3.按如下方式启动dfs
和yarn
:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
答案 15 :(得分:-1)
这是关于SELINUX的。在我的案例中,CentOS 6.5
所有节点(名称,第二,数据....)
service iptables stop