环境:hadoop 0.20.2-cdh3u5
我正在尝试上传日志数据(10g)到hdfs的自定义工具,使用sequencefile.writer。
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(),这两种方法意味着什么?
1条答案
按热度按时间wecizke31#
是的,可能。
sync()
创建同步点。正如tom white(cloudera)在《hadoop-权威指南》一书中所说同步点是流中的一个点,当读卡器“丢失”时(例如,在查找到流上的任意位置之后),它可以用来与记录边界重新同步。
现在实施
syncFS()
很简单:哪里
out
是一个FSDataOutputStream
. 同样地,在同一本书中也提到:hdfs提供了一种方法,通过
sync()
上的方法FSDataOutputStream
. 成功呼叫后,从sync()
hdfs保证文件中写到该点的数据是持久的,并且对所有读卡器可见。在(客户端或hdfs)崩溃的情况下,数据不会丢失。但是一个脚注警告我们要关注bug hdfs-200,因为上面提到的可见性并不总是被尊重的。