如何解压缩lzo_deflate文件?

7
我使用LZO压缩reduce输出。我尝试了这个:Kevin Weil的Hadoop-LZO项目,然后在我的作业中使用了LzoCodec类。
TextOutputFormat.setOutputCompressorClass(job, LzoCodec.class);

现在压缩已经正常工作。
我的问题是,压缩结果是一个无法解压缩的.lzo_deflate文件。
Lzop实用程序似乎不支持这种类型的文件。
LzopCodec应该生成一个.lzo文件,但它没有起作用,然而它与LzoCodecorg.apache.hadoop.io.compress)在同一个包中,这可能涉及到兼容性问题,因为我使用旧的API(0.19)使压缩工作。
对这个问题的答案提出了Python解决方案,但我需要Java。
我正在使用Hadoop 1.1.2和Java 6。

“it did not work” 是什么意思,针对 LzopCodec?相比 LzoCodec,LzopCodec 更推荐使用,应该是有效的。您能否提供使用时出现的错误信息? - Charles Menguy
是的。Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/io/compress/LzopCodec。我试图解决这个问题,直到我在某个地方读到LzoCodec更推荐使用。因此,在此之前应该明确这一点。 - Nadjib Mami
最大的区别在于Lzop添加了头文件,而Lzo没有。你是否更新了hadoop-env.sh并正确设置了HADOOP_CLASSPATH和JAVA_LIBRARY_PATH? - Charles Menguy
是的,我有。我还在/path/to/hadoop/bin/hadoop文件中注释掉了JAVA_LIBRARY_PATH = ''。我使用/path/to/hadoop/bin/hadoop classpath命令检查了lzop库,lzop库是最后一个。它应该像LzoCodec一样工作。你有任何想法吗,@CharlesMenguy? - Nadjib Mami
我也尝试通过命令行执行两个导出命令(export HADOOP_CLASSPATH=export JAVA_LIBRARY_PATH=),但结果相同。 - Nadjib Mami
3个回答

7
.lzo_deflate 意味着一个没有通常头部和尾部的 LZO 流。 因此,您需要在原始.lzo_deflate流中包装 lzop 期望的头部和尾部。或者至少是头部,然后忽略缺失尾部的错误。您需要查看头部和尾部文档。名称中的“deflate”是个奇怪的选择,但它指的是 gzip 类比,其中不带有 gzip 头部和尾部的原始压缩数据格式被称为 deflate。

感谢@Mark Adler的回答。我现在更理解了。 - Nadjib Mami
1
我们不能使用“lzop”工具通过命令行解压缩它吗?我收到了一个错误,类似于“不是lzop文件”。 - Sujai Sivasamy

4
我遇到了相同的问题。它发生的原因是我没有使用正确的编解码器。请检查你的作业配置中的编解码器。
job.getConfiguration().set("mapred.output.compression.codec","com.hadoop.compression.lzo.LzopCodec");

0

这个答案帮助我将.lzo_deflate转换为所需的输出格式:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
  -Dmapred.output.compress=true \
  -Dmapred.compress.map.output=true \
  -Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
  -input <input-path> \
  -output $OUTPUT \
  -mapper "/bin/cat"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接