我写了一个简单的工具上传日志到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文件吗?