4

我正在尝试使用 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 上运行。

4

1 回答 1

2

看起来应该归咎于 Hadoop PipeMapper.java(至少在 0.20.2 中):

在第 106 行左右,来自 TextInputFormat 的输入被传递到此映射器(在该阶段 \r\n 已被剥离),并且 PipeMapper 将其写入标准输出,仅带有一个 \n。

建议修改 PipeMapper.java 的源代码,检查此“功能”是否仍然存在,并根据需要进行修改(可能允许通过配置属性进行设置)。

于 2012-03-28T02:19:31.090 回答