我们目前正在设置Apache Flume系统,该系统收集事件数据并将其写入HDInsight HDFS集群中的文件。在Flume写入文件时验证初始设置hdfs ls
显示文件大小为0,但当文件滚动(并且.tmp文件扩展名被删除)时,文件大小突然跳起来。
使用HDFS或HDInsight(或WASB)是否有某些原因,当Flume写入文件时,文件的文件大小为0。
答案 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可以解决此问题