在Hdfs客户被杀后数据丢失

我写了一个简单的工具上传日志到HDFS。 我发现了一些奇怪的现象。

如果我在前台运行该工具,并用“Ctrl-C”closures它,HDFS中会有一些数据。

如果我在后台运行该工具并使用“ kill -KILL pid ”杀死进程,则数据已经被处理丢失,并在HDFS中留下一个空文件。


我的工具试图通过频繁(每1000行)调用SequenceFile.Writer.syncFs()来进行同步。

而我只是不知道为什么数据丢失。 如果我的工具整天运行,但是机器突然崩溃,所有的数据都会丢失吗?


我的工具用于收集来自不同服务器的日志,然后上传到HDFS(每天将所有日志聚合到单个文件)。

你真的在做两个完全不同的testing。 Ctrl-C将SIGINT传递给你的程序,但是你正在发送SIGKILL 。 我期望他们有不同的结果 – 例如, POSIX声明 :

  The signals SIGKILL and SIGSTOP cannot be caught or ignored. 

你可以做一个strace来查看你的syncFs()调用的效果。 它实际上是否调用sync()msync()fsync()fdatasync()等之一? 另外,考虑不同的实现:你可以在闲置/闲置期间closures文件吗?