Ste*_*eve 67 hadoop amazon-ec2
我在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)
Run Code Online (Sandbox Code Playgroud)
namenode log只会给出相同的错误.其他人似乎没有任何有趣的东西
有任何想法吗?
干杯
buz*_*ypi 74
警告:以下内容将破坏HDFS上的所有数据.除非您不关心破坏现有数据,否则不要执行此答案中的步骤!
你应该做这个:
hdfs namenode -format 用资本Y回答此外,请检查系统中的磁盘空间,并确保日志不会向您发出警告.
小智 12
这是您的问题 - 客户端无法与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;
}
Run Code Online (Sandbox Code Playgroud)
这里要理解的关键是Namenode只提供Datanode列表来存储块.Namenode不会将数据写入Datanode.客户端的工作是使用DFSOutputStream将数据写入Datanode.在任何写入开始之前,上述代码确保客户端可以与Datanode通信,如果通信失败到Datanode,则Datanode被添加到excludedNodes.
小智 9
请看以下内容:
通过查看此异常(只能复制到0个节点,而不是1),datanode不可用于Name Node.
以下情况数据节点可能无法用于名称节点
数据节点磁盘已满
数据节点忙,具有块报告和块扫描
如果块大小为负值(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
您是否尝试过 wiki http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment的推荐?
我在将数据放入 dfs 时遇到此错误。解决方案很奇怪并且可能不一致:我删除了所有临时数据以及名称节点,重新格式化名称节点,启动所有内容,并访问我的“集群”dfs 运行状况页面(http://your_host:50070/dfshealth.jsp)。最后一步,访问健康页面,是我解决该错误的唯一方法。一旦我访问了该页面,将文件放入和取出 dfs 的效果就非常好!
| 归档时间: |
|
| 查看次数: |
85650 次 |
| 最近记录: |