为什么 FSDataOutputStream 的 hsync 和 getPos 函数不同步?

Why are FSDataOutputStream's hsync and getPos functions out of sync?

我有一个使用 FSDataOutputStream 将数据写入 HDFS 的应用程序。

为了写入数据,我使用了 FSDataOutputStreamhflush 函数。为了获得已写入的字节数,我使用 FSDataOutputStreamgetPos 函数。

由于某些原因,在 hflush 被调用后,getPos returns 大多数时候文件大小错误(有时是正确的)。

我的理解是,当我调用 hflush 以及之后调用 getPos 时,HDFS 中的文件大小必须等于(以字节为单位)getPos returns,但 getPos 总是 returns 更伟大!好像一半的文件仍然停留在某个缓冲区中并且没有到达物理磁盘...

我读到了 FSDataOutputStreamhsync 函数。我开始使用hsync而不是hflush,因为它保证数据不会被缓冲并写入磁盘。

但是问题依然存在,现在已经很少见了,但我还是遇到了同样的问题。 10% 的时间,当我调用 hsync,然后调用 getPos 时,HDFS 中的文件大小小于 getPos returns.

为什么会发生这种情况以及如何将 getPoshsync 同步?

您必须使用 SyncFlag.UPDATE_LENGTH 参数调用 hsync