【问题标题】:When I store files in HDFS, will they be replicated?当我将文件存储在 HDFS 中时,它们会被复制吗?
【发布时间】:2013-11-21 11:10:47
【问题描述】:

我是 Hadoop 新手。

当我使用hadoop -fs put commoad 存储 Excel 文件时,它存储在 HDFS 中。

复制因子为 3。

我的问题是:是否需要 3 个副本并将它们分别存储到 3 个节点中?

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

    【讨论】:

    • 问题:如果发生以下情况(想象一个繁忙的网络和 i/o),是否存在数据丢失的风险:datanode1 成功写入块并向客户端发送回 ack。 datanode1 在能够完全完成复制到另一个数据节点之前就死了。 datanode1 永远不会回来。 ?
    • @Gevorg 我相信在这种情况下,必须重新运行计算,因为数据将不存在,因为它从未达到所需的复制因子。
    【解决方案2】:

    是否需要 3 个副本并将它们分别存储到 3 个节点中

    答案是:

    复制是在流水线中完成的 也就是说,它将文件的某些部分复制到datanode1,然后从datanode1复制到datanode2,从datanode1复制到datanode3

    http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html#Replication+Pipelining

    请参阅此处了解复制流水线

    【讨论】:

    • 问题:如果发生以下情况(想象一个繁忙的网络和 i/o),是否存在数据丢失的风险:datanode1 成功写入块并将 ack 发送回客户端。 datanode1 在能够完全完成复制到另一个数据节点之前就死了。 datanode1 永远不会回来。 ?
    【解决方案3】:

    您的 HDFS 客户端(在本例中为 hadoop fs)将被提供块名称和数据节点位置(如果 NameNode 可以从机架感知脚本中确定,则第一个是最近的位置)NameNode 将这些文件存储在何处.

    然后客户端将块复制到最近的数据节点。然后数据节点负责将块复制到第二个数据节点(最好在另一个机架上),最后第二个将复制到第三个(与第三个在同一机架上)。

    因此您的客户端只会将数据复制到其中一个数据节点,而框架将负责数据节点之间的复制。

    【讨论】:

      【解决方案4】:

      它将原始文件存储到一个(或多个,如果是大文件)块。这些块将被复制到另外两个节点。

      编辑:我的回答适用于 Hadoop 2.2.0。我对以前的版本没有经验。

      【讨论】:

        【解决方案5】:

        是的,它将在 3 个节点中复制(最多 3 个节点)。

        Hadoop 客户端会将数据文件分解为更小的“块”,并将这些块放置在整个集群的不同机器上。您拥有的块越多,能够并行处理这些数据的机器就越多。同时,这些机器可能容易出现故障,因此确保每个数据块同时在多台机器上是安全的,以避免数据丢失。

        因此每个块将在加载时在集群中复制。 Hadoop 的标准设置是在集群中拥有 (3) 个每个块的副本。这可以通过文件 hdfs-site.xml 中的 dfs.replication 参数进行配置。

        复制数据根本不是 Hadoop 的缺点,事实上它是 Hadoop 有效的一个组成部分。它不仅为您提供了良好的容错能力,而且还有助于在靠近数据的地方运行地图任务,以避免在网络上增加额外的负载(了解数据局部性)。

        【讨论】:

        • 澄清一下:默认块大小为 64MB,因此对于 OP 来说,每个文件一个块就足够了,因为他想存储 Excel 文件。
        【解决方案6】:

        是的,它会在 hdfs 中生成 n(复制因子) 个副本

        用这个命令找出文件的位置,找到#rack它存放的位置,所有racks上的block名称是什么

        hadoop fsck /path/to/your/directory -files -blocks -locations -racks

        【讨论】:

          【解决方案7】:

          使用此命令通过复制将数据加载到 hdfs

          hadoop fs -Ddfs.replication=1 -put big.file /tmp/test1.file-Ddfs.replication=1 您可以定义在将数据加载到 hdfs 时将创建的复制副本的数量

          【讨论】:

            猜你喜欢
            • 2019-12-26
            • 1970-01-01
            • 2016-01-05
            • 1970-01-01
            • 1970-01-01
            • 2011-11-14
            • 1970-01-01
            • 2016-01-15
            • 1970-01-01
            相关资源
            最近更新 更多