2013-05-21 2 views
9

Я храню файлы на HDFS в формате сжатия Snappy. Я бы хотел изучить эти файлы в локальной файловой системе Linux, чтобы убедиться, что процесс Hadoop, который их создал, выполнил правильно.Как читать сжатые файлы Snappy на HDFS без использования Hadoop?

Когда я копирую их локально и пытаюсь сжать их с помощью стандартного libarary Google, он сообщает мне, что в файле отсутствует идентификатор Snappy. Когда я пытаюсь обойти это, вставив идентификатор Snappy, он испортил контрольную сумму.

Что я могу сделать, чтобы прочитать эти файлы без необходимости писать отдельную программу Hadoop или передать ее через что-то вроде Hive?

ответ

20

я, наконец, узнал, что я могу использовать следующую команду, чтобы прочитать содержимое сжатого файла Snappy на HDFS:

hadoop fs -text filename 

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

+0

Как это сделать программно в scala или java? – Bunder

+0

Чтобы программно записать в файл Snappy, вам необходимо импортировать класс Snappy codec и получить экземпляр этого класса в качестве части настройки транслятора или редуктора. Вы должны передать свой выходной поток через функцию «createOutputStream» кодека, чтобы получить закодированный выходной поток. Вот фрагмент. Чтение одинаково в обратном порядке codec = (CompressionCodec) ReflectionUtils.newInstance (codecClass, conf); fileOut = fs.create (targetPath, false); thiswriter = new LineRecordWriter (новый DataOutputStream (codec.createOutputStream (fileOut))); –

2

Пожалуйста, взгляните на this post on Cloudera blog. В нем объясняется, как использовать Snappy с Hadoop. По сути, файлы Snappy на необработанном тексте не разделяются, поэтому вы не можете прочитать один файл на нескольких хостах.

Решение заключается в использовании Snappy в формате контейнера, поэтому по существу вы используете Hadoop SequenceFile с компрессией, установленной как Snappy. Как описано in this answer, вы можете установить свойство mapred.output.compression.codec на org.apache.hadoop.io.compress.SnappyCodec и настроить формат вывода задания как SequenceFileOutputFormat.

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

+1

Спасибо, Чарльз, но я не думаю, что это касается моего вопроса. Позвольте мне упростить его. Я использую hasoop fs -get filename для перемещения файла из HDFS в локальный каталог Linux. Теперь, когда у меня есть это, почему я не могу использовать быстрые java-библиотеки для его распаковки? –

0

Thats, потому что snappy, используемый hadoop, содержит еще несколько метаданных, которые не являются непригодными для библиотек, таких как https://code.google.com/p/snappy/. Вам необходимо использовать hasoop native snappy, чтобы разблокировать загруженный файл данных.

+0

Не могли бы вы быть более конкретными? Я хочу сделать это, используя интерфейс hadoop fs, если это возможно. –