Назад | Перейти на главную страницу

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

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