我正在尝试使用 hadoop 流解析来自 commoncrawl.org 的数据。我设置了一个本地 hadoop 来测试我的代码,并有一个使用流式 ARCfile 阅读器的简单 Ruby 映射器。当我自己调用我的代码时
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 上运行。