环境:Hadoop 0.20.2-cdh3u5
我正在尝试使用SequenceFile.Writer的自定义工具将日志数据(10G)上传到HDFS。
SequenceFile.Writer w = SequenceFile.createWriter(
hdfs,
conf,
p,
LongWritable.class,
Text.class,
4096,
hdfs.getDefaultReplication(),
hdfs.getDefaultBlockSize(),
compressionType,
codec,
null,
new Metadata());
在上传过程中,如果工具崩溃(没有明确调用close()方法),上传的日志会丢失吗?
我应该及时调用sync()或syncFs(),这两种方法意味着什么?
答案 0 :(得分:3)
是的,可能。
sync()
创建一个同步点。如Tom White(Cloudera)的“Hadoop- The Definitive Guide”一书所述
同步点是流可以使用的点 如果读者“丢失”,则与记录边界重新同步 - for 在寻找流上的任意位置之后的例子。
现在syncFS()
的实施非常简单:
public void syncFs() throws IOException {
if (out != null) {
out.sync(); // flush contents to file system
}
}
其中out
是FSDataOutputStream
。同样,在同一本书中说明:
HDFS提供了一种强制所有缓冲区同步的方法 通过
sync()
上的FSDataOutputStream
方法获取数据节点。后 来自sync()
HDFS的成功呼叫返回保证数据 写到文件中的那一点是持久的并且对所有人都可见 读者。在(客户端或HDFS)崩溃的情况下,数据 不会丢失。
但是脚注警告要查看bug HDFS-200,因为上面提到的可见性并不总是得到尊重。