2013-01-01 75 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文檔中的部分使用模式。它現在很好用。 –