2

我正在执行以下操作以从 reducer 压缩 o/p 文件:

OutputStream out = ipFs.create( new Path( opDir + "/" + fileName ) );
CompressionCodec codec = new GzipCodec(); 
OutputStream cs = codec.createOutputStream( out );
BufferedWriter cout = new BufferedWriter( new OutputStreamWriter( cs ) );
cout.write( ... )

但在第 3 行出现空指针异常:

java.lang.NullPointerException
    at org.apache.hadoop.io.compress.zlib.ZlibFactory.isNativeZlibLoaded(ZlibFactory.java:63)
    at org.apache.hadoop.io.compress.GzipCodec.createOutputStream(GzipCodec.java:92)
    at myFile$myReduce.reduce(myFile.java:354)

我也因此而关注JIRA

你能建议我做错什么吗?

4

2 回答 2

8

如果要在标准 OutputFormat 处理之外使用压缩,则应使用 CompressionCodecFactory(如@linker 答案中所述):

CompressionCodecFactory ccf = new CompressionCodecFactory(conf)
CompressionCodec codec = ccf.getCodecByClassName(GzipCodec.class.getName());
OutputStream compressedOutputSream = codec.createOutputStream(outputStream)
于 2012-04-14T22:39:32.740 回答
4

你这样做是错的。执行此操作的标准方法是:

TextOutputFormat.setOutputCompressorClass(job, GzipCodec.class);

GzipCodec 是可配置的,如果直接实例化它,则必须正确初始化它(setConf,...)

试试这个,让我知道它是否有效。

于 2012-04-14T18:17:16.883 回答