2012-02-06 49 views
7

我们假设一个使用默认块大小(128 MB),并且有一个文件使用130 MB;所以使用一个全尺寸的块和一个2 MB的块。然后需要将20 MB添加到文件中(总计现在应为150 MB)。怎么了?带附加的HDFS如何工作

HDFS实际上是否将最后一个块的大小从2MB调整为22MB?或者创建一个新块?

追加到HDFS中的文件如何处理协调? dataloss有风险吗?

HDFS是否创建了一个放置20 + 2 MB的第三个块,并删除了具有2MB的块。如果是的话,这是如何同时工作的?

回答

3

根据在Jira issuementioned beforelatest design document,我们发现如下回答你的问题:

  1. HDFS将追加到末块,创建新的块和复制数据旧的最后一块。这并不难,因为HDFS只是使用正常的文件系统将这些块文件写入普通文件。普通文件系统具有附加新数据的机制。当然,如果你填满了最后一个块,你将创建一个新的块。
  2. 在HDFS中同时只允许一个单独写入或附加到任何文件,因此没有并发处理。这由namenode管理。如果您希望其他人开始写入文件,则需要关闭文件。
  3. 如果文件中的最后一个块没有被复制,则追加将失败。追加被写入单个副本,将其复制到副本,与正常写入类似。在我看来,与正常写入相比,dataloss没有额外的风险。
+0

你可以附加到一个封闭的文件吗? – David 2016-02-17 14:20:41

+0

如果您打电话追加打开它的文件。你不能在打开的文件上调用append。那么一旦你调用append并获得一个输出流,你就可以开始将你的字节转储到文件的末尾。 – EthanP 2016-02-17 18:48:28

+0

如果我没记错,当这个功能被引入时,你需要保留一个新创建的文件,以便能够“追加”到它(又名不是真正的追加)。你是说现在HDFS允许1)创建一个文件2)关闭它3)重新打开它4)添加数据到它? – David 2016-02-17 22:30:51

1

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

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

+4

我知道路径保持不变。但是因为块是一次写入的,所以我想HDFS会创建一个放入20 + 2 MB的第三块,并删除2MB的块。但这是如何同时工作的? – David 2012-02-10 22:45:20

3

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

当前HDFS docs给出了该文件的链接,因此我们可以假定它是最近的一个。 (文件日期为2009年)

和相关的issue