2013-02-21 2 views
1

Я использую следующий простой код для загрузки файлов в hdfs.Как предотвратить поврежденный файл hadoop .gz

FileSystem hdfs = FileSystem.get(config); 
hdfs.copyFromLocalFile(src, dst); 

Файлы генерируются веб-сервер Java компонента и вращали и закрывается Logback в формате .gz. Я заметил, что иногда файл .gz поврежден.

> gunzip logfile.log_2013_02_20_07.close.gz 
gzip: logfile.log_2013_02_20_07.close.gz: unexpected end of file 

Но следующая команда не показать мне содержимое файла

> hadoop fs -text /input/2013/02/20/logfile.log_2013_02_20_07.close.gz 

Влияние наличия таких файлов является довольно катастрофой - так как агрегация в течение всего дня не удается, а также несколько подчиненных узлов помечен как черный список в таком случае.

Что я могу сделать в таком случае? Может ли утилита hasoop copyFromLocalFile() испортить файл? Кто-нибудь сталкивался с подобной проблемой?

+0

Спасибо, у меня была та же проблема на Amazon EMR и я подумал, что это проблема EMR. – Suman

ответ

1

Этого не следует делать - эта ошибка обычно связана с файлами GZip, которые не были закрыты, когда они были первоначально записаны на локальный диск или копируются в HDFS, прежде чем они будут записаны.

Вы должны быть в состоянии проверить, запустив md5sum на исходный файл и что в HDFS - если они совпадают, то исходный файл поврежден:

hadoop fs -cat /input/2013/02/20/logfile.log_2013_02_20_07.close.gz | md5sum 
md5sum /path/to/local/logfile.log_2013_02_20_07.close.gz 

Если они не совпадают, они проверяют временные метки на двух файлах - тот, который в HDFS должен быть изменен после локальной файловой системы.

+0

Большое спасибо, и как я могу проверить правильность самого файла .gz (без открытия всего файла)? С API-интерфейсом java? – Julias

+0

К сожалению, вы действительно не можете - GZip не является разделяемым форматом, а это значит, что вы не можете просто искать случайную позицию в файле и восстанавливать поток. По этой причине вам нужно начинать с начала файла при проверке действительности –

+0

Еще раз спасибо. Прежде всего, я нашел основную причину проблемы - у меня было две машины, которые одновременно выполняли ту же загрузку из одной и той же общей папки хранения (некоторые проблемы с vip). Я добавляю код, чтобы предотвратить такую ​​вещь (с блокировкой файлов). Кроме того, я обнаружил, что gunzip -t может протестировать файл gzip. Вы rihgt gz defenetelly не хорошо (althouhg У меня есть небольшие файлы - меньше, чем 64M-блок). Я хочу изменить все .gz на мгновенное сжатие и объединить небольшие файлы в большие, но мне нужно проверить и оценить, возможно, искать некоторые уже существуют утилиты – Julias

Смежные вопросы