访问正在写入的文件

时间:2014-10-29 15:14:59

标签: hadoop hdfs

You use the hadoop fs –put command to write a 300 MB file using and HDFS block size of 64 MB. Just after this command has finished writing 200 MB of this file, what would another user see when trying to access this file?

a.) They would see Hadoop throw an ConcurrentFileAccessException when they try to access this file.
b.) They would see the current state of the file, up to the last bit written by the command.
c.) They would see the current of the file through the last completed block.
d.) They would see no content until the whole file written and closed.

根据我对hadoop fs -put命令的理解,答案是D,但是有人说它是C。

任何人都可以为其中任何一个选项提供建设性的解释吗?

谢谢xx

3 个答案:

答案 0 :(得分:7)

创建文件后,文件系统名称空间中就会显示该文件。但是,不保证写入文件的任何内容都是可见的:

  

一旦编写了一个块的数据,第一个块将对新读者可见。对于后续块也是如此:它始终是正在写入的当前块,其他读取器不可见。 (来自Hadoop权威指南,Coherency模型)。

所以,我会选择选项C.

另外,请查看相关的question

答案 1 :(得分:5)

在写入和关闭整个文件之前无法访问该文件的原因(选项D)是因为,为了访问文件,请求首先被发送到NameNode,以获取与该文件相关的元数据。组成文件的不同块。只有在收到确认文件的所有块都已成功写入的确认后,才会由NameNode写入此元数据。

因此,即使块可用,用户也无法在更新元数据之前查看文件,这是在写入所有块之后完成的。

答案 2 :(得分:0)

分别由ChaosAshrith详细说明,D和C似乎都是正确的。在播放7.5 GB的文件时,我在https://martin.atlassian.net/wiki/spaces/lestermartin/blog/2019/03/21/1172373509/are+partially-written+hdfs+files+accessible+not+exactly+but+much+more+yes+than+I+previously+thought上记录了他们的结果。

简而言之,是的,确切的文件名要等到完成后才能显示...并且...是的,您实际上可以读取文件,直到您意识到文件名临时以{{ 1}}。