Я написал простой инструмент для загрузки логов в HDFS. И я обнаружил любопытное явление.
Если я запустил инструмент на переднем плане и закрою его с помощью «Ctrl - C», некоторые данные будут в HDFS.
Если я запустил инструмент в фоновом режиме и убью процесс с помощью "kill -KILL pid
"обработанные данные теряются и остаются пустым файлом в HDFS.
Мой инструмент попытался выполнить синхронизацию (вызвав SequenceFile.Writer.syncFs()
) часто (каждые 1000 строк).
И я просто не мог понять, почему данные были потеряны. Если мой инструмент проработал весь день, но машина внезапно сломалась, все данные будут потеряны?
Мой инструмент используется для сбора журналов с разных серверов, а затем их загрузки в HDFS (объединение всех журналов в один файл каждый день).
Вы действительно делаете два совершенно разных теста. Ctrl-C доставляет SIGINT
в вашу программу, но вы отправляете SIGKILL
. Я бы ожидал разных результатов между ними - например, POSIX состояния:
The signals SIGKILL and SIGSTOP cannot be caught or ignored.
Вы могли бы сделать strace
чтобы увидеть эффект вашего syncFs()
вызов. Действительно ли он вызывает один из sync()
, msync()
, fsync()
, fdatasync()
, и т.д? Также рассмотрите различные реализации: можно ли закрыть файл во время бездействия / простоя?