当Flume写入文件

时间:2016-02-25 01:28:06

标签: azure hadoop hdfs hdinsight

我们目前正在设置Apache Flume系统,该系统收集事件数据并将其写入HDInsight HDFS集群中的文件。在Flume写入文件时验证初始设置hdfs ls显示文件大小为0,但当文件滚动(并且.tmp文件扩展名被删除)时,文件大小突然跳起来。

使用HDFS或HDInsight(或WASB)是否有某些原因,当Flume写入文件时,文件的文件大小为0。

3 个答案:

答案 0 :(得分:4)

这可能是由于HDFS Coherency模型。

在执行写入HDFS时,一旦写入了一个块的数据,第一个块将可见 新读者。 对于后续块也是如此:它始终是当前块 写的,其他读者看不到。

HDFS提供了一种强制所有缓冲区通过FSDataOutputStream上的hflush()方法刷新到datanode的方法。从hflush()成功返回后,HDFS保证写入文件中该点的数据已到达写入管道中的所有数据节点,并且对所有新读取器可见。 在成功完成上述过程后,将会提供有关文件大小等的统计信息。

答案 1 :(得分:2)

使用Azure blob存储时,如果需要hflush()保证,请使用页面Blob而不是Block Blobs

CodeReaper的答案是正确的。为了详细说明Azure中的上下文,阻止blob不会(可预测地)实现hflush():对hflush()的调用实际上将SDK客户端缓冲区刷新到Azure内存存储中。数据存储在此临时缓存中默认为7天,但在调用sync()close()之前无法作为块blob访问。 Page Blobs显然确保在每次hflush()调用时将数据推送到HDFS磁盘。

答案 2 :(得分:0)

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