Hdfs 客户端终止后数据丢失

Hdfs 客户端终止后数据丢失

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

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

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


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

而且我也不知道数据为什么会丢失,如果我的工具运行了一整天,机器突然死机了,是不是所有数据都会丢失?


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

答案1

你实际上在做两个完全不同的测试。Ctrl-C 传递SIGINT给你的程序,但你发送的是SIGKILL我预计它们会有不同的结果——例如,POSIX 状态

   The signals SIGKILL and SIGSTOP cannot be caught or ignored.

您可以执行一个strace来查看调用的效果。它实际上是否调用了、、、等syncFs()之一?此外,考虑不同的实现:您可以在不活动/空闲期间关闭文件吗?sync()msync()fsync()fdatasync()

相关内容