如何在 hadoop 中禁用本机 zlib 压缩库

How to disable native zlib compression library in hadoop

我有大量以 gz 格式存储的文件,并试图通过读取这些文件来 运行 map-reduce 程序(使用 PIG)。我 运行 遇到的问题是,由于数据检查,Hadoop 中的本机解压器 (ZlibDecompressor) 无法成功解压其中的一部分。但是我能够使用 java GZIPInputStream 成功读取这些文件。现在我的问题是——有没有办法禁用 Zlib?或者在 hadoop(2.7.2) 中是否有任何替代的 GZipCodec,我可以用它来解压缩 gzip 输入文件?

错误如下

org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1475882463863_0108_m_000022_0 - exited : java.io.IOException: incorrect data check
   at org.apache.hadoop.io.compress.zlib.ZlibDecompressor.inflateBytesDirect(Native Method)
   at org.apache.hadoop.io.compress.zlib.ZlibDecompressor.decompress(ZlibDecompressor.java:228)
   at org.apache.hadoop.io.compress.DecompressorStream.decompress(DecompressorStream.java:91)
   at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:85)
   at java.io.InputStream.read(InputStream.java:101)
   at org.apache.hadoop.util.LineReader.fillBuffer(LineReader.java:180)
   at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:216)
   at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)

非常感谢您的帮助。

我自己找到了答案。您可以设置以下 属性 以禁用所有本机库。

io.native.lib.available=false;

或者您可以扩展 org.apache.hadoop.io.compress.GzipCodec.java 以删除仅为 GzipCompressor 的本机实现。