访问正在写入的文件

ecr0jaav  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(300)
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

oewdyzsn

oewdyzsn1#

似乎d和c都是真的,分别由chaos和ashrith详述。我把他们的结果记录在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 播放7.5 gb文件时。
简言之,是的,确切的文件名是不存在,直到完成。。。还有。。。是的,如果您意识到文件名的后缀是 ._COPYING_ .

pw136qt2

pw136qt22#

文件一经创建,就在文件系统名称空间中可见。写入文件的任何内容都不能保证可见,但是:
一旦写入的数据超过一个块的值,新的读卡器就会看到第一个块。后续的块也是如此:总是当前正在写入的块对其他读卡器不可见(来自hadoop权威指南,一致性模型)。
所以,我会选择c选项。
另外,看看这个相关的问题。

8yoxcaq7

8yoxcaq73#

在写入并关闭整个文件之前(选项d)无法访问文件的原因是,为了访问文件,请求首先被发送到namenode,以获取与组成文件的不同块相关的元数据。只有在namenode收到文件的所有块都已成功写入的确认之后,才会写入此元数据。
因此,即使块是可用的,用户也不能看到文件,直到元数据被更新,这是在写入所有块之后完成的。

相关问题