【问题标题】:Writing to HDFS could only be replicated to 0 nodes instead of minReplication (=1)写入 HDFS 只能复制到 0 个节点而不是 minReplication (=1)
【发布时间】:2013-03-22 13:29:19
【问题描述】:

我有 3 个数据节点正在运行,在运行作业时出现以下错误,

java.io.IOException: 文件 /user/ashsshar/olhcache/loaderMap9b663bd9 只能复制到 0 个节点而不是 minReplication (=1)。有 3 个数据节点正在运行,并且在此操作中排除了 3 个节点。 在 org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1325)

此错误主要出现在我们的 DataNode 实例空间不足或 DataNode 未运行时。 我尝试重新启动 DataNode,但仍然出现相同的错误。

我的集群节点上的 dfsadmin -reports 清楚地显示有大量可用空间。

我不知道为什么会这样。

【问题讨论】:

  • 您对这个文件有正确的文件权限吗?
  • 确保dfs.datanode.address 端口地址已打开。我遇到了类似的错误,结果在我需要打开的几个端口中,我忽略了50010
  • 谢谢@MarkW,这也是我的错误。愿意将此添加为答案吗?

标签: java hadoop mapreduce hive hdfs


【解决方案1】:

1.停止所有Hadoop守护进程

for x in `cd /etc/init.d ; ls hadoop*` ; do sudo service $x stop ; done

2.删除/var/lib/hadoop-hdfs/cache/hdfs/dfs/name中的所有文件

Eg: devan@Devan-PC:~$ sudo rm -r /var/lib/hadoop-hdfs/cache/

3.格式化Namenode

sudo -u hdfs hdfs namenode -format

4.启动所有Hadoop守护进程

for x in `cd /etc/init.d ; ls hadoop*` ; do sudo service $x start ; done

Stop All Hadoop Service

【讨论】:

  • 我遇到了同样的问题,请您解释一下为什么我要这样做来解决问题以及是否会丢失数据?
  • 这不是没有解决办法。 -1
【解决方案2】:

我遇到了同样的问题,我的磁盘空间非常低。释放磁盘解决了它。

【讨论】:

  • 谢谢!我的单节点系统被错误配置为从不正确的分区运行,它根本没有容量来保存另一个文件。
【解决方案3】:
  1. 检查你的DataNode是否正在运行,使用命令:jps
  2. 如果它未运行请稍候并重试。
  3. 如果它运行,我认为你必须重新格式化你的DataNode。

【讨论】:

    【解决方案4】:

    遇到这种情况我通常会去tmp/hadoop-username/dfs/目录手动删除dataname em> 个文件夹(假设您在 Linux 环境中运行)。

    然后通过调用 bin/hadoop namenode -format 格式化 dfs(确保在询问是否要格式化时以大写 Y 回答;如果系统不会询问您,然后再次重新运行该命令)。

    然后您可以通过调用 bin/start-all.sh

    再次启动 hadoop

    【讨论】:

    • 这是对我有用的 OP 问题的唯一解决方案。我试图在我的 Macbook osx 山狮 10.8.5 上遵循 link 中的示例,但在 start-all.sh 之后看不到正在生成的数据节点,直到我删除了上面提到的 data 和 name 和 namesecondary 文件夹。谢谢!
    【解决方案5】:

    我遇到了这个问题,我解决了如下:

    1. 查找您的数据节点和名称节点元数据/数据保存在哪里;如果找不到,只需在 mac 上执行此命令即可找到它(位于名为“tmp”的文件夹中)

      找到 /usr/local/Cellar/ -name "tmp";

      find 命令是这样的:find -name

    2. 找到该文件后, cd 进入它。 /usr/local/Cellar//hadoop/hdfs/tmp

      然后 cd 到 dfs

      然后使用 -ls 命令查看数据和名称目录位于那里。

    3. 使用 remove 命令,将它们都删除:

      rm -R 数据。和 rm -R 名称

    4. 如果您还没有完成,请转到 bin 文件夹并结束所有操作:

      sbin/end-dfs.sh

    5. 从服务器或本地主机退出。

    6. 再次登录服务器:ssh

    7. 启动 dfs:

      sbin/start-dfs.sh

    8. 格式化namenode以确保:

      bin/hdfs 名称节点格式

    9. 您现在可以使用 hdfs 命令将数据上传到 dfs 并运行 MapReduce 作业。

    【讨论】:

      【解决方案6】:

      在我的情况下,通过在数据节点上打开 50010 上的防火墙端口解决了这个问题。

      【讨论】:

      • 你能说得更具体些吗,我应该使用哪个协议,以及程序的名称......
      • 谢谢。我收到了与 OP 相同的错误消息,而我所有的数据节点都是健康的。事实证明,master 无法连接到端口 50010 上的那些数据节点。
      【解决方案7】:

      非常简单地解决了 Windows 8.1 上的相同问题
      我使用 Windows 8.1 操作系统和 Hadoop 2.7.2,做了以下事情来解决这个问题。

      1. 当我启动 hdfs namenode -format 时,我注意到我的目录中有一个锁。请参考下图。
      2. 如下所示删除完整文件夹后,我再次执行 hdfs namenode -format。
      3. 执行以上两个步骤后,我可以成功地将所需文件放入 HDFS 系统中。我使用 start-all.cmd 命令来启动 yarn 和 namenode。

      【讨论】:

      • 能否详细说明您的步骤
      【解决方案8】:

      在我的情况下,hdfs-site.xml 中的 dfs.datanode.du.reserved 太大,并且名称节点给出了数据节点的私有 IP 地址,因此无法正确路由。私有 ip 的解决方案是将 docker 容器切换到主机网络,并将主机名放在配置文件的主机属性中。

      这超越了其他可能性 Stack Question on replication issue

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多