为什么gzip不支持拆分

vq8itlhq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(617)

我从《hadoop:权威指南》一书中得到一段话,内容如下:
deflate将数据存储为一系列压缩块。问题是,没有以任何方式区分每个块的开头,这将允许位于流中任意点的读取器前进到下一个块的开头,从而使其自身与流同步。因此,gzip不支持拆分。”
我的问题是我无法理解作者解释gzip为什么不支持拆分的原因。有人能给我一个更详细的解释吗?
据我所知,如果大文件被分成16个块。当一个Map器开始读取一个块时,此时可能会发生两种情况:
Map程序无法创建块
或者它可以读取并处理它,但不知道将结果放入整个流的何处
上述情况会发生还是不会发生,还有其他逻辑?

fquxozlt

fquxozlt1#

要将文件拆分为多个部分进行处理,需要两件事:
这些零件需要能够独立加工。
你需要找到分割碎片的地方。
正常用法中的deflate格式都不支持这两种格式。对于1:deflate格式本质上是串行的,每个匹配都引用以前未压缩的数据,其本身可能来自类似的反向引用,可能一直到文件的开头。
你引用的描述没有提到那一点。
虽然这是一个没有意义的点,因为您没有1,对于2:deflate在流中没有明显的标记来标识块边界。要找到块边界,您必须对边界上的所有位进行解码,这将破坏拆分文件以进行独立处理的目的。
这就是你引用的描述中提到的要点。
虽然这对于正常的deflate流来说都是正确的,但是没有准备好分割,如果您愿意,您可以准备这样的deflate流。可以使用在选定断点处擦除历史记录 Z_FULL_FLUSH ,允许从该点独立解压缩。它还插入一个可见标记 00 00 ff ff . 这不是一个很长的标记,可能会意外地出现在压缩数据中。它可以在第二次刷新之后插入第二个标记,给出九个字节: 00 00 ff ff 00 00 00 ff ff . 这是hadoop可以使用分割deflate流的方法。

相关问题