首页 > 解决方案 > 压缩/解压缩,是什么使编解码器可拆分?

问题描述

由于缺乏压缩知识,我无法清楚地了解所谓的“可拆分”编解码器。例如,gzip 与 bzip2,我确实看到,当针对约 400M gzip 文件运行 MapReduce 时,它​​只会启动一个映射器,而对于 bzip2,它会启动 4 个映射器。

使 gzip 不可拆分的根本问题是什么?我听说 gzip 不可拆分,因为它将其“元数据”存储在文件头中,而 bzip2 为每个块存储“元数据”。

如果这是阻止 gzip 可拆分的唯一问题,为什么不简单地让所有 gzip 解压缩器线程首先去文件头获取“元数据”,然后每个线程处理压缩文件的一部分?

另一个问题,对于 bzip2,它将文件分成多个块。是否有可能将一条记录(如果我们以文本文件为例,则为一行)分成两部分并放置在 2 个不同的块中?bzip2 在创建块时是否关心记录的完整性?

非常感谢!

标签: hadoopcompressiongzipcodecbzip2

解决方案


bzip2 流由一系列可独立解压缩的块组成,其中每个块以固定的 48 位序列开头:0x314159265359. (这个数字可能看起来很熟悉。)这允许简单地搜索该序列并在那里开始解压缩。

误报的可能性非常小,因为没有什么可以阻止该序列出现在块中的压缩数据中。

gzip 流通常没有可以开始解压缩的断点,也没有这些点的任何标记。它是一个长的、依赖的流。

但是,如果需要,可以使用断点和标记构建 gzip 流。pigz 有一个-ior--independent选项,它使块可以独立解压缩,压缩比的代价很小。使用-b或选择未压缩的块大小--blocksize,默认为 128K。每个块之间是字节00 00 ff ff 00 00 00 ff ff,可以搜索。由于它是 72 位,因此误报的概率比搜索 48 位标识符要低得多。


推荐阅读