Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 访问正在写入的文件_Hadoop_Hdfs - Fatal编程技术网

Hadoop 访问正在写入的文件

Hadoop 访问正在写入的文件,hadoop,hdfs,Hadoop,Hdfs,从我对hadoop fs-put命令的理解来看,答案是D,不过有人说它是C 有人能对这两种选择中的任何一种提供建设性的解释吗 感谢xx在写入并关闭整个文件(选项D)之前无法访问文件的原因是,为了访问文件,请求首先发送到NameNode,以获取与组成文件的不同块相关的元数据。只有在收到文件的所有块都已成功写入的确认后,NameNode才会写入此元数据 因此,即使块可用,用户也无法看到文件,直到元数据更新,这是在写入所有块之后完成的 文件一创建,它就在文件系统名称空间中可见。写入文件的任何内容都不保

从我对hadoop fs-put命令的理解来看,答案是D,不过有人说它是C

有人能对这两种选择中的任何一种提供建设性的解释吗


感谢xx

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


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

文件一创建,它就在文件系统名称空间中可见。写入文件的任何内容都不保证可见,但是:

一旦写入了超过一个块的数据量,新的读卡器就会看到第一个块。后续块也是如此:其他读卡器始终看不到正在写入的当前块。(摘自Hadoop权威指南,一致性模型)

所以,我会选择C选项


另外,请看一下这一关系。

似乎D和C都是正确的,分别由和详细说明。我在玩7.5 GB文件时记录了他们的结果


简而言之,是的,在完成之前不存在确切的文件名。。。而且。。。是的,如果您意识到文件名临时后缀为
\u COPYING\u

,那么您实际上可以读取文件直到写入的最后一个块。确实,块在块级别可用,即如果您知道要查找哪个块,您可以访问单个块。但是,如果包含文件名->块之间映射的元数据在写入所有块之前不可用,则用户将看不到文件本身,因为所有文件系统请求都通过名称节点路由。我观察到,在将大文件复制到HDFS时,文件名被创建为
[FILENAME]_复制
并且在写入过程中,如果您试图对文件执行读取操作(
[FILENAME]\u复制
),您仍然可以读取文件,直到写入最后一个块。我已经在Hadoop2.4集群中测试了这种行为。因此,从这个行为中,我猜NameNode会在刷新块(
hflush()
)并返回ACK后立即更新块映射。一旦文件写入完成,HDFS中的文件将重命名为
[FILENAME]
@AshrithM。我尝试使用-PUT命令写入300MB文件,并在另一个用户下使用-CAT命令读取该文件,并收到“文件不存在”消息。您使用了什么命令(方法)读取正在编写的文件?@Dennis Ok,以下是我所做的:首先,启动一个根用户身份的
put
(文件名为
test.bat
),而
put
正在进行中,文件名类似于HDFS中的
test.bat.\u复制
。然后,作为cloudera用户,我使用hadoop fs-cat test.bat.124; COPYING_124;head读回了该文件,它显示了该文件的内容。最后,一旦
put
完成,文件将在HDFS中重命名为
test.bat
。附件是一个供参考的屏幕截图:@AshrithM也这么做了,但是运行了“hadoop fs-cat test.bat”-没有._copying_uu后缀:)这是非常令人困惑的:)因为基本上如果我告诉你读一个名为“TestFile”的文件,你就不会找一个叫做“TestFile”的东西了。copying_u,对吗?:)除此之外,非常感谢您的解释和时间!我相信现在只有做测试的人才能知道答案是什么:)如果我得了100%,我会告诉你的:)
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.