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

Amazon ec2 HDFS错误:只能复制到0个节点,而不是1个节点,amazon-ec2,hadoop,Amazon Ec2,Hadoop,我已经在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, inst

我已经在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日志只给出了相同的错误。其他人似乎没有什么有趣的东西

有什么想法吗


干杯

你试过维基上的推荐吗


我在将数据放入dfs时遇到此错误。解决方案很奇怪,而且可能不一致:我删除了所有临时数据以及namenode,重新格式化了namenode,启动了所有程序,并访问了我的“集群”dfs健康页面(http://your_host:50070/dfshealth.jsp). 最后一步,访问健康页面,是我绕过错误的唯一方法。一旦我访问了该页面,将文件放入和取出dfs就非常有效

重新格式化节点不是解决方案。您必须编辑start-all.sh。启动dfs,等待它完全启动,然后启动mapred。你可以用睡眠来做这件事。等一秒钟对我来说很有效。请参阅此处的完整解决方案。

我在设置单节点群集时遇到了类似的问题。我意识到我没有配置任何datanode。我将我的主机名添加到conf/slaves中,然后就成功了。希望有帮助。

而且我认为在复制到dfs时,您应该确保所有数据节点都已启动。在某些情况下,这需要一段时间。我想这就是为什么“检查健康状况”的解决方案起作用的原因,因为你进入健康状况网页,等待一切恢复,我的五美分。

请看以下内容:

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
通过看到此异常(只能复制到0个节点,而不是1个节点),datanode对Name Node不可用

以下是数据节点可能无法用于命名节点的情况

  • 数据节点磁盘已满

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

  • 如果块大小为负值(hdfs site.xml中的dfs.Block.Size)

  • 写入过程中主数据节点关闭时(任何n/w FluctActions b/w Name Node和数据节点计算机)

  • 当我们附加任何部分块并为后续的部分块附加调用sync时,客户端应该将以前的数据存储在缓冲区中

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

    服务器端,当区块不是512的倍数时,它将尝试对块文件中的数据以及元文件中的Crc进行Crc比较。但是,在为块中存在的数据构造crc时,它总是比较到初始数据集,或者为了进行更多分析,请查看数据节点日志


    参考资料:

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

    您应该这样做:

  • 停止所有hadoop服务
  • 删除dfs/名称和dfs/数据目录
  • hdfs namenode-格式
    用大写字母Y回答
  • 启动hadoop服务

  • 另外,请检查系统中的磁盘空间,确保日志没有警告您。

    我意识到我参加聚会有点晚,但我想发布此消息 供本页的未来访问者使用。我也有类似的问题 当我将文件从本地复制到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)
    
    2012-07-11 03:55:43479 ERROR org.apache.hadoop.hdfs.server.datanode.datanode:datanoderRegistration(127.0.0.1:50010,storageID=DS-9201118459-192.168.3.229-50010-1341506209533,infoPort=50075,ipcPort=50020):DataXceiver java.io.IOException:打开的文件太多
    位于java.io.UnixFileSystem.createFileExclusive(本机方法)
    位于java.io.File.createNewFile(File.java:883)
    位于org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:491)
    位于org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:462)
    位于org.apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.java:1628)
    位于org.apache.hadoop.hdfs.server.datanode.FSDataset.WriteBlock(FSDataset.java:1514)
    位于org.apache.hadoop.hdfs.server.datanode.BlockReceiver(BlockReceiver.java:113)
    位于org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:381)
    位于org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:171)
    
    显然,这是hadoop集群和 增加nofile和epoll限制(如果启用 内核2.6.27)来解决它。棘手的是设置 nofile和epoll限制高度依赖于系统。我的朋友希望这能起作用
    因此,您可能需要相应地更改方法。

    由于数据节点未启动,我在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
    
    通过
    系统首选项->共享->远程登录启用ssh登录后
    它开始工作了。
    start all.sh
    输出更改为以下内容(注意数据节点的开始):


    这是您的问题-客户端无法与Datanode通信。因为客户端为Datanode接收的IP是内部IP而不是公共IP。看看这个

    查看来自DFSClient$DFSOutputStrem(Hadoop 1.2.1)的源代码

    //
    //连接到列表中的第一个数据节点。
    //
    success=createBlockOutputStream(节点,clientName,false);
    如果(!成功){
    L
    
    //
    // 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;
    }
    
    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
    
    rm -rf /tmp/hadoop-<user>/dfs/name
    rm -rf /tmp/hadoop-<user>/dfs/data
    
    sbin/start-dfs.sh
    ...