hadoop-1.0.4 소스 코드에서 SequenceFile.java를 읽었습니다. 그리고 sync(long)
메소드 은 SequenceFile을 MapReduce에서 파일 분할로 나눌 때 SequenceFile에서 "동기화 마커"(파일 생성시 생성 될 때 16 바이트 MD5)를 찾는 데 사용됩니다.Hadoop SequenceFile 바이너리가 안전합니까?
/** Seek to the next sync mark past a given position.*/
public synchronized void sync(long position) throws IOException {
if (position+SYNC_SIZE >= end) {
seek(end);
return;
}
try {
seek(position+4); // skip escape
in.readFully(syncCheck);
int syncLen = sync.length;
for (int i = 0; in.getPos() < end; i++) {
int j = 0;
for (; j < syncLen; j++) {
if (sync[j] != syncCheck[(i+j)%syncLen])
break;
}
if (j == syncLen) {
in.seek(in.getPos() - SYNC_SIZE); // position before sync
return;
}
syncCheck[i%syncLen] = in.readByte();
}
} catch (ChecksumException e) { // checksum failure
handleChecksumException(e);
}
}
이 코드는 단순히 "동기화 마커"와 동일한 데이터를 포함하는 데이터 시퀀스를 찾습니다.
내 의심하십시오 SequenceFile의 데이터가 16 바이트의 데이터 시퀀스를 "동기 마커"와 같은를 포함하는 일이 어디
이 코드는 위의 실수 "동기 마커로 그 16 바이트의 데이터를 취급하는 상황을 고려 "그리고 SequenceFile은 정확하게 파싱되지 않을 것인가?
데이터 또는 동기화 마커에 대한 "이스케이프"작업을 찾을 수 없습니다. SequenceFile은 어떻게 바이너리 안전 할 수 있습니까? 내가 놓친 게 있니?