Flume 正在写入文件时,HDFS ls 显示文件大小为 0

HDFS ls shows file size 0 while Flume is writing the file

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

在 Flume 写入文件时,HDFS 或 HDInsight(或 WASB)是否有某种原因导致文件的文件大小为 0。

这可能是由于 HDFS 一致性模型。

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

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

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

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

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