[HADOOP] hsync ()가 hdfs 파일을 플러시하지 않는 이유는 무엇입니까?
HADOOPhsync ()가 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.실제로 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));
from https://stackoverflow.com/questions/32231105/why-is-hsync-not-flushing-my-hdfs-file by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하둡 멀티 노드 클러스터. 데이터 노드가 제대로 작동하지 않습니다 (0) | 2019.08.11 |
---|---|
[HADOOP] hadoop에서 mapreduce 거리 계산 (0) | 2019.08.11 |
[HADOOP] hadoop 작업을 원격으로 실행하는 중 예외 (0) | 2019.08.10 |
[HADOOP] --jars를 사용하여 spark-submit yarn-cluster가 작동하지 않습니까? (0) | 2019.08.10 |
[HADOOP] HADOOP_HOME을 기반으로 HDFS 구성을 자동으로로드 하시겠습니까? (0) | 2019.08.10 |