Данные, потерянные после того, как клиент Hdfs был убит
Я написал простой инструмент для загрузки журналов в HDFS. И я обнаружил какое-то любопытное явление.
Если я запусту инструмент на переднем плане и закрою его с помощью "Ctrl - C", в HDFS появятся некоторые данные.
Если я запускаю инструмент в фоновом режиме и убиваю процесс с помощью "kill -KILL pid
msgstr "данные были обработаны, теряются и оставляют пустой файл в 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()
, так далее? Также рассмотрим различные реализации: можете ли вы закрыть файл во время бездействия / простоя?