【问题标题】:How does HDFS with append works带有附加功能的 HDFS 如何工作
【发布时间】:2016-02-17 11:06:37
【问题描述】:

假设一个使用默认块大小(128 MB),并且有一个文件使用 130 MB;所以使用一个完整大小的块和一个 2 MB 的块。然后需要将 20 MB 附加到文件中(现在总共应该是 150 MB)。会发生什么?

HDFS 是否真的将最后一个块的大小从 2MB 调整为 22MB?还是新建一个区块?

附加到 HDFS 中的文件如何处理并发性? 有数据丢失的风险吗?

HDFS 是否创建第三个块,将 20+2 MB 放入其中,并删除 2MB 的块。如果是,这如何同时工作?

【问题讨论】:

    标签: hadoop size append block hdfs


    【解决方案1】:

    根据Jira issuementioned before中的latest design document,我们为您的问题找到以下答案:

    1. HDFS 将追加最后一个块,创建一个新块并从旧的最后一个块复制数据。这并不难,因为 HDFS 只是使用普通文件系统将这些块文件写入普通文件。普通文件系统具有附加新数据的机制。当然,如果你填满了最后一个区块,你就会创建一个新区块。
    2. HDFS 中同时只允许对任何文件进行一次写入或追加,因此无需处理并发。这是由名称节点管理的。如果您希望其他人开始写入文件,则需要关闭文件。
    3. 如果文件中的最后一个块没有被复制,追加将失败。追加写入单个副本,后者将其通过管道传输到副本,类似于正常写入。在我看来,与正常写入相比,没有额外的数据丢失风险。

    【讨论】:

    • 你能追加到一个关闭的文件吗?
    • 如果您对正在打开的文件调用 append。您不能在打开的文件上调用 append 。然后,一旦您调用 append 并获得输出流,您就可以开始将字节转储到文件的末尾。
    • 如果我没记错的话是什么时候引入这个特性的,你需要打开一个新创建的文件才能“追加”到它(也不是真正的追加)。你是说现在 HDFS 允许 1) 创建文件 2) 关闭它 3) 重新打开它 4) 将数据附加到它?
    • 是的。因为当你重新打开它时,你会询问名称节点最后一个块是什么,然后你就可以开始写入它了。
    【解决方案2】:

    这是一个非常全面的design document 关于追加,它包含并发问题。

    当前HDFS docs 提供了指向该文档的链接,因此我们可以假设它是最近的。 (文档日期为 2009 年)

    以及相关的issue

    【讨论】:

      【解决方案3】:

      Hadoop 分布式文件系统支持附加到文件,在这种情况下,它应该将 20 MB 添加到示例中的第二个块(最初包含 2 MB 的块)。这样一来,您将得到两个块,一个 128 MB,一个 22 MB。

      This 是对 HDFS 附加 Java 文档的引用。

      【讨论】:

      • 我知道路径保持不变。但由于块是一次性写入的,我想 HDFS 会创建第三个块,将 20+2 MB 放入其中,然后删除 2MB 的块。但这是如何同时工作的呢?
      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多