我正在执行以下操作来压缩来自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。
你能建议我是否做错了什么吗?
如果要在标准 OutputFormat 处理之外使用压缩,则应使用 CompressionCodecFactory(详见@linker答案):
CompressionCodecFactory ccf = new CompressionCodecFactory(conf)
CompressionCodec codec = ccf.getCodecByClassName(GzipCodec.class.getName());
OutputStream compressedOutputSream = codec.createOutputStream(outputStream)
你做错了。执行此操作的标准方法是:
TextOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
GzipCodec是一个可配置的,如果你直接实例化它,你必须正确初始化它(setConf,...)
试试这个,让我知道这是否有效。