Данные, потерянные после того, как клиент Hdfs был убит

Я написал простой инструмент для загрузки журналов в HDFS. И я обнаружил какое-то любопытное явление.

Если я запусту инструмент на переднем плане и закрою его с помощью "Ctrl - C", в HDFS появятся некоторые данные.

Если я запускаю инструмент в фоновом режиме и убиваю процесс с помощью "kill -KILL pidmsgstr "данные были обработаны, теряются и оставляют пустой файл в 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(), так далее? Также рассмотрим различные реализации: можете ли вы закрыть файл во время бездействия / простоя?

Другие вопросы по тегам