为什么gzip不支持拆分

时间:2016-07-11 03:45:54

标签: hadoop compression

我从“Hadoop:The Definitive Guide”一书中得到了一个段落,它如下:

“DEFLATE 将数据存储为一系列压缩块。问题是每个块的开始 不能以任何方式区分允许读者定位在任意位置 在流中指向前进到下一个块的开头,从而进行同步 本身与流。出于这个原因,gzip不支持拆分。“

我的问题是我无法理解作者解释为什么gzip不支持拆分的原因。有人可以给我一个更详细的解释吗?

据我了解,如果将大文件拆分为16个块。当一个映射器开始读取一个块时,在这一点上,可能会发生两种情况:

  1. 映射器不能阻止
  2. 或者它可以读取它然后处理它但不知道将结果放在整个流中的位置
  3. 上述情况之一是否会发生或者没有发生,还有其他逻辑吗?

1 个答案:

答案 0 :(得分:1)

为了将文件拆分成多个部分进行处理,您需要做两件事:

  1. 这些作品需要能够独立处理。
  2. 你需要能够找到拆分的地方。
  3. 正常使用中的deflate格式都不支持。对于1:deflate格式本质上是串行的,每个匹配都指向先前未压缩的数据,本身可能来自类似的后向引用,可能一直到文件的开头。

    您引用的描述并未提及重要的一点。

    虽然这是一个没有实际意义的点,因为你没有1,因为2:deflate在流中没有明显的标记来识别块边界。要找到块边界,您必须将所有位解码到边界,这将破坏分割文件以进行独立处理的目的。

    这就是你引用的描述中提到的那一点。

    虽然对于正常的放气流来说都是如此,但是如果你喜欢准备这样的放气流,你可以准备分裂。可以使用Z_FULL_FLUSH在选定断点处擦除历史记录,从而允许从该点进行独立解压缩。它还会插入一个可见标记00 00 ff ff。这不是一个很长的标记,并且可能在压缩数据中偶然出现。之后可以进行第二次刷新以插入第二个标记,给出九个字节:00 00 ff ff 00 00 00 ff ff。这是Hadoop可以使用拆分通缩流的东西。