我们目前正在建立一个apacheflume系统,它收集事件数据并将其写入hdinsight hdfs集群中的文件。验证初始设置时 hdfs ls 当flume写入文件时,文件大小显示为0,但当文件滚动(并且.tmp文件扩展名被删除)时,文件大小突然增大。对于hdfs或hdinsight(或wasb),当flume写入文件时,文件大小将为0是否有某种原因。
hdfs ls
z9zf31ra1#
这可能是由于hdfs相干模型。在执行对hdfs的写入时,一旦写入的数据超过一个块的值,新的读卡器就会看到第一个块。后续的块也是如此:总是当前正在写入的块对其他读卡器不可见。hdfs提供了一种通过fsdataoutputstream上的hflush()方法强制将所有缓冲区刷新到datanodes的方法。在从hflush()成功返回之后,hdfs保证文件中写到该点的数据已经到达写入管道中的所有datanode,并且对所有新读卡器可见。有关文件大小等的统计信息将在成功完成上述过程后提供。
a64a0gku2#
hdfs根据lastblocklength报告计算大小。在您的场景中,我认为您仍在向hdfs写入文件并尝试获取文件的大小,而hdfs不知道如何计算大小,因为它没有lastblocklength报告。请尝试在写入后使用hflush,这样可以解决此问题
mlmc2os53#
使用azure blob存储时,如果需要,请使用页blob而不是块blob hflush() 需要保证。代码收割者的回答是正确的。要在azure中详细说明上下文,块blob不会(可预测地)实现 hflush() :呼叫 hflush() 实际将sdk客户端缓冲区刷新到azure内存存储区。默认情况下,数据将存储在此临时缓存中7天,但直到 sync() 或者 close() 被称为。 Page Blobs 请确保每次备份时都将数据推送到hdfs磁盘 hflush() 打电话。
hflush()
sync()
close()
Page Blobs
3条答案
按热度按时间z9zf31ra1#
这可能是由于hdfs相干模型。
在执行对hdfs的写入时,一旦写入的数据超过一个块的值,新的读卡器就会看到第一个块。后续的块也是如此:总是当前正在写入的块对其他读卡器不可见。
hdfs提供了一种通过fsdataoutputstream上的hflush()方法强制将所有缓冲区刷新到datanodes的方法。在从hflush()成功返回之后,hdfs保证文件中写到该点的数据已经到达写入管道中的所有datanode,并且对所有新读卡器可见。有关文件大小等的统计信息将在成功完成上述过程后提供。
a64a0gku2#
hdfs根据lastblocklength报告计算大小。在您的场景中,我认为您仍在向hdfs写入文件并尝试获取文件的大小,而hdfs不知道如何计算大小,因为它没有lastblocklength报告。请尝试在写入后使用hflush,这样可以解决此问题
mlmc2os53#
使用azure blob存储时,如果需要,请使用页blob而不是块blob
hflush()
需要保证。代码收割者的回答是正确的。要在azure中详细说明上下文,块blob不会(可预测地)实现
hflush()
:呼叫hflush()
实际将sdk客户端缓冲区刷新到azure内存存储区。默认情况下,数据将存储在此临时缓存中7天,但直到sync()
或者close()
被称为。Page Blobs
请确保每次备份时都将数据推送到hdfs磁盘hflush()
打电话。