Используйте входной кодек gzip для файлов без расширения .gz в Hadoop

Я запускаю задание Hadoop для набора входных файлов, сжатых с помощью gzip. Hadoop должен легко справиться с этим... mapreduce в java - входные файлы gzip

К сожалению, в моем случае входные файлы не имеют расширения .gz. Я использую CombineTextInputFormatClass, который отлично выполняет мою работу, если я указываю на файлы, не сжатые gzip, но в основном я просто получаю кучу мусора, если я указываю на файлы, сжатые gzip.

Я пытался искать в течение довольно долгого времени, но единственное, что я обнаружил, это кто-то другой, задающий тот же вопрос, что и я, без ответа... Как заставить Hadoop разархивировать входные данные независимо от их расширения?

У кого-нибудь есть что-нибудь?


person John Chrysostom    schedule 27.10.2015    source источник
comment
Взгляните на: stackoverflow.com/questions/33331366/   -  person Ravindra babu    schedule 28.10.2015


Ответы (2)


Пошел копаться в источнике и построил решение для этого...

Вам нужно изменить исходный код класса LineRecordReader, чтобы изменить способ выбора кодека сжатия. Версия по умолчанию создает Hadoop CompressionCodecFactory и вызывает getCodec, который анализирует путь к файлу для его расширения. Вместо этого вы можете использовать getCodecByClassName для получения любого желаемого кодека.

Затем вам нужно будет переопределить класс формата ввода, чтобы он использовал новую программу чтения записей. Подробности здесь: http://daynebatten.com/2015/11/override-hadoop-compression-codec-file-extension/

person John Chrysostom    schedule 01.11.2015

Первые файлы gzip нельзя разделить. Таким образом, в результате уменьшение вашей карты не будет использовать размер блока при разделении.

Сокращение карты не выполняет разбиение, когда видит расширение файла. К сожалению, в вашем случае вы говорите, что расширение не .gz. Поэтому я боюсь, что Map Reduce не может понять, как разделить данные.

Таким образом, даже если есть возможность узнать расширение, вы не получите хорошей производительности. Поэтому, возможно, почему бы не распаковать, а затем предоставить данные для уменьшения карты, а не заставлять карту использовать сжатый формат с пониженной производительностью.

person Ramzy    schedule 28.10.2015
comment
Да, я знаю об этом. Файлы небольшие, поэтому мой формат ввода фактически объединяет их, а не разделяет. Так что это не будет проблемой. - person John Chrysostom; 28.10.2015
comment
Итак, вы объединяете файлы, у которых нет расширения. Это кажется другой концепцией, так как нам нужно подтвердить, как CombineTextInputFormatClass обрабатывает файл без расширения. Можете попробовать без него и использовать обычный TextInputFormat и проверить. Это повлияет на производительность. Но в любом случае, даже с .gz мы не получаем никакого прироста производительности, так как он не разделяемый. Можете ли вы попробовать с обычным форматом ввода текста. Даже я просматриваю, как уменьшить карту, знает, какие методы использовать, когда мы не даем расширение - person Ramzy; 28.10.2015
comment
Да, пробовал со стандартным TextInputFormat и без кубиков. После тонны копаний похоже, что LineRecordReader использует CodecFactory для назначения кодеков на основе расширений имен файлов. Похоже, мне придется расширить класс LineRecordReader, переопределить метод initialize, а затем также расширить все классы формата ввода, чтобы использовать мой собственный LineRecordReader. Я бы хотел, чтобы был лучший способ, но, похоже, его нет. Я опубликую код, когда закончу, в назидание другим. - person John Chrysostom; 28.10.2015
comment
Спасибо за информацию. Я бы даже ждал твоего поста. - person Ramzy; 28.10.2015