压缩/解压缩,什么使编解码器可拆分?

时间:2021-07-14 03:13:59

标签: hadoop compression gzip codec bzip2

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

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

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

>

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

非常感谢!

1 个答案:

答案 0 :(得分:3)

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

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

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

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