hadoop - 压缩/解压缩,是什么使编解码器可拆分?
问题描述
由于缺乏压缩知识,我无法清楚地了解所谓的“可拆分”编解码器。例如,gzip 与 bzip2,我确实看到,当针对约 400M gzip 文件运行 MapReduce 时,它只会启动一个映射器,而对于 bzip2,它会启动 4 个映射器。
使 gzip 不可拆分的根本问题是什么?我听说 gzip 不可拆分,因为它将其“元数据”存储在文件头中,而 bzip2 为每个块存储“元数据”。
如果这是阻止 gzip 可拆分的唯一问题,为什么不简单地让所有 gzip 解压缩器线程首先去文件头获取“元数据”,然后每个线程处理压缩文件的一部分?
另一个问题,对于 bzip2,它将文件分成多个块。是否有可能将一条记录(如果我们以文本文件为例,则为一行)分成两部分并放置在 2 个不同的块中?bzip2 在创建块时是否关心记录的完整性?
非常感谢!
解决方案
bzip2 流由一系列可独立解压缩的块组成,其中每个块以固定的 48 位序列开头:0x314159265359
. (这个数字可能看起来很熟悉。)这允许简单地搜索该序列并在那里开始解压缩。
误报的可能性非常小,因为没有什么可以阻止该序列出现在块中的压缩数据中。
gzip 流通常没有可以开始解压缩的断点,也没有这些点的任何标记。它是一个长的、依赖的流。
但是,如果需要,可以使用断点和标记构建 gzip 流。pigz 有一个-i
or--independent
选项,它使块可以独立解压缩,压缩比的代价很小。使用-b
或选择未压缩的块大小--blocksize
,默认为 128K。每个块之间是字节00 00 ff ff 00 00 00 ff ff
,可以搜索。由于它是 72 位,因此误报的概率比搜索 48 位标识符要低得多。
推荐阅读
- datatables - column().data() 与正交数据而不是显示?
- c# - 当所有文本框在UWP C#中都有值时需要启用按钮
- python - 如何使用 CatBoostClassifier 为不同的输入定义不同的文本处理逻辑
- python - 跨平台 Python 以识别应用程序/进程为重点
- javascript - RxJS Observable - 在使用下一个发射值之前等待异步方法完成
- javascript - Flatpickr range插件问题
- mapstruct - MapStruct 发出映射对象到列表
- keras - 如何计算作为神经网络输入的图像序列的 MSE?
- java - PropertyPlaceHolderConfigurer 替代方案
- quarkus - Quarkus - 如何在客户端使用密钥库与 TLS 建立 GRPC 会话?