【问题标题】:Why is hsync() not flushing my hdfs file?为什么 hsync() 没有刷新我的 hdfs 文件?
【发布时间】:2015-08-27 00:14:16
【问题描述】:

尽管有关于这个主题的所有资源,但我在刷新磁盘上的 hdfs 文件时遇到了问题 (hadoop 2.6) 调用FSDataOutputStream.hsync() 应该可以解决问题,但它实际上只工作一次,原因不明...

这是一个失败的简单单元测试:

@Test
public void test() throws InterruptedException, IOException {
    final FileSystem filesys = HdfsTools.getFileSystem();
    final Path file = new Path("myHdfsFile"); 
    try (final FSDataOutputStream stream = filesys.create(file)) {
        Assert.assertEquals(0, getSize(filesys, file));  
        stream.writeBytes("0123456789");
        stream.hsync();
        stream.hflush();
        stream.flush();
        Thread.sleep(100);
        Assert.assertEquals(10, getSize(filesys, file)); // Works
        stream.writeBytes("0123456789");
        stream.hsync();
        stream.hflush();
        stream.flush();
        Thread.sleep(100);
        Assert.assertEquals(20, getSize(filesys, file)); // Fails, still 10           
    }
    Assert.assertEquals(20, getSize(filesys, file)); // works
}


private long getSize(FileSystem filesys, Path file) throws IOException {
    return filesys.getFileStatus(file).getLen();
}

知道为什么吗?

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

    实际上,hsync() 内部调用了不带标志的私有flushOrSync(boolean isSync, EnumSet<SyncFlag> syncFlags),并且只有在提供了SyncFlag.UPDATE_LENGTH 时才会在namenode 上更新长度。

    在上述测试中,将getSize() 替换为实际读取文件的代码有效。

    private long getSize(FileSystem filesys, Path file) throws IOException {        
        long length = 0;
        try (final  FSDataInputStream input = filesys.open(file)) {
            while (input.read() >= 0) {
                length++;
            }
        }
        return length;
    }
    

    要更新大小,您也可以调用(没有正确的类类型检查):

    ((DFSOutputStream) stream.getWrappedStream())).hsync(EnumSet.of(SyncFlag.UPDATE_LENGTH));
    

    【讨论】:

    • 谢谢!是否可以使用该标志创建流或设置一次而不是在每次写入和刷新后调用它?
    • 我不这么认为。另请注意,每次写入更新文件大小都会消耗从数据节点到名称节点的 I/O,对于太多文件,不要经常这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2011-08-11
    相关资源
    最近更新 更多