为什么 FSDataOutputStream 的 hsync 和 getPos 函数不同步?
Why are FSDataOutputStream's hsync and getPos functions out of sync?
我有一个使用 FSDataOutputStream
将数据写入 HDFS 的应用程序。
为了写入数据,我使用了 FSDataOutputStream
的 hflush
函数。为了获得已写入的字节数,我使用 FSDataOutputStream
的 getPos
函数。
由于某些原因,在 hflush
被调用后,getPos
returns 大多数时候文件大小错误(有时是正确的)。
我的理解是,当我调用 hflush
以及之后调用 getPos
时,HDFS 中的文件大小必须等于(以字节为单位)getPos
returns,但 getPos
总是 returns 更伟大!好像一半的文件仍然停留在某个缓冲区中并且没有到达物理磁盘...
我读到了 FSDataOutputStream
的 hsync
函数。我开始使用hsync
而不是hflush
,因为它保证数据不会被缓冲并写入磁盘。
但是问题依然存在,现在已经很少见了,但我还是遇到了同样的问题。 10% 的时间,当我调用 hsync
,然后调用 getPos
时,HDFS 中的文件大小小于 getPos
returns.
为什么会发生这种情况以及如何将 getPos
与 hsync
同步?
您必须使用 SyncFlag.UPDATE_LENGTH
参数调用 hsync
。
我有一个使用 FSDataOutputStream
将数据写入 HDFS 的应用程序。
为了写入数据,我使用了 FSDataOutputStream
的 hflush
函数。为了获得已写入的字节数,我使用 FSDataOutputStream
的 getPos
函数。
由于某些原因,在 hflush
被调用后,getPos
returns 大多数时候文件大小错误(有时是正确的)。
我的理解是,当我调用 hflush
以及之后调用 getPos
时,HDFS 中的文件大小必须等于(以字节为单位)getPos
returns,但 getPos
总是 returns 更伟大!好像一半的文件仍然停留在某个缓冲区中并且没有到达物理磁盘...
我读到了 FSDataOutputStream
的 hsync
函数。我开始使用hsync
而不是hflush
,因为它保证数据不会被缓冲并写入磁盘。
但是问题依然存在,现在已经很少见了,但我还是遇到了同样的问题。 10% 的时间,当我调用 hsync
,然后调用 getPos
时,HDFS 中的文件大小小于 getPos
returns.
为什么会发生这种情况以及如何将 getPos
与 hsync
同步?
您必须使用 SyncFlag.UPDATE_LENGTH
参数调用 hsync
。