복붙노트

[HADOOP] hsync ()가 hdfs 파일을 플러시하지 않는 이유는 무엇입니까?

HADOOP

hsync ()가 hdfs 파일을 플러시하지 않는 이유는 무엇입니까?

이 주제에 대한 모든 리소스에도 불구하고 디스크에서 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();
}

왜 그런지 알아?

해결법

  1. ==============================

    1.실제로 hsync ()는 내부적으로 플래그없이 개인 flushOrSync (boolean isSync, EnumSet syncFlags)를 호출하며, SyncFlag.UPDATE_LENGTH가 제공되는 경우 길이는 네임 노드에서만 업데이트됩니다.

    실제로 hsync ()는 내부적으로 플래그없이 개인 flushOrSync (boolean isSync, EnumSet syncFlags)를 호출하며, SyncFlag.UPDATE_LENGTH가 제공되는 경우 길이는 네임 노드에서만 업데이트됩니다.

    위의 테스트에서 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));
    
  2. from https://stackoverflow.com/questions/32231105/why-is-hsync-not-flushing-my-hdfs-file by cc-by-sa and MIT license