flume写入文件时,hdfs ls显示文件大小为0

daolsyd0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(637)

我们目前正在建立一个apacheflume系统,它收集事件数据并将其写入hdinsight hdfs集群中的文件。验证初始设置时 hdfs ls 当flume写入文件时,文件大小显示为0,但当文件滚动(并且.tmp文件扩展名被删除)时,文件大小突然增大。
对于hdfs或hdinsight(或wasb),当flume写入文件时,文件大小将为0是否有某种原因。

z9zf31ra

z9zf31ra1#

这可能是由于hdfs相干模型。
在执行对hdfs的写入时,一旦写入的数据超过一个块的值,新的读卡器就会看到第一个块。后续的块也是如此:总是当前正在写入的块对其他读卡器不可见。
hdfs提供了一种通过fsdataoutputstream上的hflush()方法强制将所有缓冲区刷新到datanodes的方法。在从hflush()成功返回之后,hdfs保证文件中写到该点的数据已经到达写入管道中的所有datanode,并且对所有新读卡器可见。有关文件大小等的统计信息将在成功完成上述过程后提供。

a64a0gku

a64a0gku2#

hdfs根据lastblocklength报告计算大小。在您的场景中,我认为您仍在向hdfs写入文件并尝试获取文件的大小,而hdfs不知道如何计算大小,因为它没有lastblocklength报告。请尝试在写入后使用hflush,这样可以解决此问题

mlmc2os5

mlmc2os53#

使用azure blob存储时,如果需要,请使用页blob而不是块blob hflush() 需要保证。
代码收割者的回答是正确的。要在azure中详细说明上下文,块blob不会(可预测地)实现 hflush() :呼叫 hflush() 实际将sdk客户端缓冲区刷新到azure内存存储区。默认情况下,数据将存储在此临时缓存中7天,但直到 sync() 或者 close() 被称为。 Page Blobs 请确保每次备份时都将数据推送到hdfs磁盘 hflush() 打电话。

相关问题