2013-01-01 74 views
0

我压缩Hadoop的MR作业的输出使用MultipleOutputs时:腐败的Hadoop

conf.setOutputFormat(TextOutputFormat.class); 
TextOutputFormat.setCompressOutput(conf, true); 
TextOutputFormat.setOutputCompressorClass(conf, GzipCodec.class); 

我使用MultipleOutputs,如:

MultipleOutputs.addMultiNamedOutput(conf, "a", TextOutputFormat.class, Text.class, Text.class); 
MultipleOutputs.addNamedOutput(conf, "b", TextOutputFormat.class, Text.class, Text.class); 
LazyOutputFormat.setOutputFormatClass(conf, TextOutputFormat.class); 

另外,各这些工作很好。我可以得到我想要的输出的划分,并且我可以输出gzip。但是,将这些文件一起使用时,gzip文件最终会损坏。每个输出文件大约有25000行。当我做类似

hadoop dfs -cat output/*.gz | less +24000 

一切看起来都很正常。但是,如果我做

hadoop dfs -cat output/*.gz | less +40000 

我得到的错误,如

zcat: stdin: invalid compressed data--crc error 
zcat: stdin: invalid compressed data--length error 
zcat: stdin: invalid compressed data--format violated 

如果我再重复第一个命令,并通过文件开始扫描,最终我遇到上述错误之一不完整的线路或几个后非常长,非常损坏的行(我认为它们很长,因为换行符也被破坏)并且less不能继续。

所以,我的问题是:有没有人看过这个之前,有没有办法解决它?

注意:我正在使用mapred API而不是mapreduce。我可以尝试翻译成新的API,但是如果我可以使用mapred找到解决方案,那将是更可取的。

回答

3

只是猜测(没有看到你的reducer代码),但是你在reducer的清理方法中调用MultipleOutputs.close()(在MultipleOutputs的实例上,而不是静态方法,它不存在)?

它看起来像没有被写入gzip格式的最终​​块 - 与不调用上述方法

+0

谢谢谢谢谢谢一致!我完全忽略了MultipleOutputs文档中的部分使用模式。它现在很好用。 –