我已经在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日志只是给出了相同的错误。其他人似乎没有什么有趣的东西
有什么想法吗?
干杯
发布于 2014-02-18 00:47:18
这是您的问题-客户端无法与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仅提供用于存储块的数据节点列表。Namenode不会将数据写入数据节点。客户端的工作是使用DFSOutputStream将数据写入数据节点。在开始编写上述代码之前,请确保客户端可以与数据节点通信,如果与数据节点的通信失败,则将数据节点添加到excludedNodes中。
发布于 2011-10-08 18:23:18
我在设置单节点集群时遇到了类似的问题。我意识到我没有配置任何datanode。我将我的主机名添加到conf/slaves,然后它就成功了。希望能有所帮助。
发布于 2016-09-02 18:12:14
我将尝试描述我的设置和解决方案:我的设置: 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
...
https://stackoverflow.com/questions/5293446
复制相似问题