Я пытаюсь проанализировать данные с commoncrawl.org с помощью потоковой передачи hadoop. Я настроил локальный hadoop для тестирования своего кода, и у меня есть простой Ruby Mapper, который использует потоковый читатель ARCfile. Когда я вызываю свой код сам как
cat 1262876244253_18.arc.gz | mapper.rb | reducer.rb
Работает как положено.
Кажется, что hadoop автоматически видит, что файл имеет расширение .gz, и распаковывает его перед передачей в маппер - однако при этом он преобразует \ r \ n переносы строк в потоке в \ n. Поскольку ARC полагается на длину записи в строке заголовка, изменение нарушает синтаксический анализатор (поскольку длина данных изменилась).
Чтобы перепроверить, я изменил свой маппер для ожидания несжатых данных и сделал:
cat 1262876244253_18.arc.gz | zcat | mapper.rb | reducer.rb
И это работает.
Я не возражаю против автоматического распаковывания hadoop (хотя я вполне могу иметь дело с потоковой передачей файлов .gz), но если это необходимо, мне нужно распаковать его в 'бинарный файл' без преобразования строки или чего-то подобного. Я считаю, что поведение по умолчанию заключается в подаче распакованных файлов по одному сопоставителю на файл, что идеально.
Как я могу попросить его не распаковывать .gz (переименование файлов не вариант) или заставить его распаковать правильно? Я бы предпочел не использовать специальный класс InputFormat, который я должен отправить в банке, если это вообще возможно.
Все это в конечном итоге будет работать на AWS ElasticMapReduce.