hadoop-1.0.4 ソース コードの SequenceFile.java を読みました。そしてsync(long)
、MapReduce で SequenceFile をファイル分割に分割するときに、SequenceFile で「同期マーカー」(ファイル作成時に生成された場合は 16 バイトの MD5) を見つけるために使用されるメソッドを見つけます。
/** 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 をバイナリセーフにするにはどうすればよいですか? 何か不足していますか?