写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

大数据领域常见的压缩格式有 gzip,snappy,lzo,lz4,bzip2,zstd。

补充

为什么要进行数据压缩?

为了优化存储(减少存储空间)和充分利用网络带宽,通常采用压缩方法。大数据需要处理海量数据,此时数据压缩非常重要。

在企业中存在的许多场景中,通常,数据源来自多种文本格式(CSV、TSV、XML、JSON等)数据。这些文件是人类可读的,但占用了大量的存储空间。

然而在大数据处理中数据应尽可能为机器可读。使用序列化的压缩技术将这些人类可读的数据压缩成机器可读的, 可确保存储所需的空间大大减少。

以下是一些众所周知的常用压缩格式(称为编解码器,允许数据压缩/序列化和解压缩/反序列化)

Gzip(扩展名为.gz)

即 GNU Zip(GZip),一种众所周知的压缩格式,并且在互联网世界中被广泛使用。可以使用此格式压缩请求和响应,以有效利用网站/Web应用程序的带宽。

优点

压缩比较高,hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样,有hadoop native库,大部分linux系统都自带gzip命令,使用方便。

缺点

不支持split

hadoop native 是什么?
鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现。 这些组件保存在Hadoop的一个独立的动态链接的库里。这个库在Unix平台上叫libhadoop.so.

Snappy(扩展名为.snappy)

由 Google开发的编解码器(以前称作Zippy),被认为是中等压缩比中性能最好的。对于该格式而言,性能比压缩比更为重要。Snappy属于最为广泛使用的格式之一,显然是由于其出色的性能。

优点

压缩速度快;支持hadoop native库

缺点

不支持split;压缩比低;hadoop本身不支持,需要安装;linux系统下没有对应的命令

LZO(扩展名为.lzo)

由GNU公共许可证(GPL)授权,与 Snappy非常类似,它具有中等压缩比,而压缩与解压缩性能很高。LZO是一种专注于解压缩速度的无损数据压缩算法。

优点

压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;需要在linux系统下自行安装lzop命令,使用方便

缺点

hadoop本身不支持,需要安装;lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定InputFormat为lzo格式)。

LZ4(扩展名.lz4)

优点

性能好压缩比高,首次初始化速度较好,压缩速度和稳定性也都不错

缺点

  1. lz4的解压比较麻烦,需要指定原byte数组大小,所以开发起来工作量要大些
  2. 不支持split

Bzip2(扩展名.bz2)

或多或少与GZip类似,压缩比高于GZip。但如预期一样, Bzip2的数据解压缩速度比GZip慢。其中一个重要的方面是,它支持数据分割,这在使用HDFS作为存储时非常重要。如果数据只是被存储而无须查询,那么这种压缩将是一个不错的选择。

优点:

支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便

缺点:

压缩/解压速度慢;不支持native

zstd(扩展名.zstd)

zstd是Facebook在2016年开源的新无损压缩算法,优点是压缩率和压缩/解压缩性能都很突出。zstd还有一个特别的功能,支持以训练方式生成字典文件,相比传统压缩方式能大大的提高小数据包的压缩率。

  1. 对大数据量的文本压缩场景,zstd是综合考虑压缩率和压缩性能最优的选择,其次是lz4。
  2. 对小数据量的压缩场景,如果能使用zstd的字典方式,压缩效果更为突出。
  3. 支持split, 但是还不完善,详情可见——Is zstd splitabble in hadoop/spark/etc?

选择

前面的每种压缩算法都有其优点和缺点。如果压缩比比较高(压缩后节约较大空间)则解压缩速度通常很慢,反之,则解压缩速度快。

没有两全其美的办法,只能选择一种方法来使用。这取决于进入系统的数据,必须根据具体情况来选择。

当需要选择压缩算法时,以下选项可供参考

  1. 将文件分成若干块,然后使用适合的算法进行压缩。由于选择了 Hadoop(HDFS)作为数据持久化机制,因此需要确保这些数据块在压缩后能与预期的memory slot适配(在HDFS中配置)。
  2. 选择允许先分割、再压缩的压缩格式。
  3. 选择允许分割和压缩的容器文件格式,如Avro和Parquet。这些格式可以与其他压缩格式混合使用,以达到用户用例所要求的速度和压缩比。

Avro 和 Parquet

详情请见我的这两篇博客——

  1. Apache Avro是什么?
  2. Parquet是什么

数据压缩算法该如何选择?相关推荐

  1. 基于JPEG压缩编码的数据压缩算法的研究与实现(转)

    基于JPEG压缩编码的数据压缩算法的研究与实现(转) 编辑器加载中... JPEG压缩方法由于其较高的压缩比和理想的压缩效果,是目前应用最广泛的图像压缩方法.它采用一种特殊的有损压缩算法,将不易被人眼 ...

  2. python编写同步欧氏距离轨迹压缩_基于相对同步欧氏距离筛选的在线GPS轨迹数据压缩算法.PDF...

    基于相对同步欧氏距离筛选的在线GPS轨迹数据压缩算法 第35卷第3期 计算机应用与软件 Vol35No.3 2018年3月 ComputerApplicationsandSoftware Mar.2 ...

  3. 基于哈夫曼树的英文文本数据压缩算法

    基于哈夫曼树的英文文本数据压缩算法 (1)问题描述    输入一串字符串,根据给定的字符串中字符出现的频率建立相应的哈夫曼树,构造哈夫曼编码表,在此基础上可以对压缩文件进行压缩(即编码),同时可以对压 ...

  4. 5种数据压缩算法实现和性能测试

    目录 算法实现 Deflate GZIP LZO LZ4 Snappy 数据压缩算法性能测试 准备工作 测试 压缩算法原理可看我上一篇文章:数据压缩算法原理 算法实现 Deflate 一个基于LZ77 ...

  5. 基于哈夫曼树的数据压缩算法

    计算机科学与技术系 实 验 报 告 专业名称 计算机科学与技术 课程名称 数据结构与算法 班 级 17计科2班 综合实验2 基于哈夫曼树的数据压缩算法 实验日期 2019.04.29 综合实验二 基于 ...

  6. 数据结构 基于哈夫曼树的数据压缩算法

    数据结构 基于哈夫曼树的数据压缩算法 实验目的 实验内容 实验提示 实验代码 实验小结 实验目的 1.掌握哈夫曼树的构造算法. 2.掌握哈夫曼编码的构造算法. 实验内容 问题描述 输入一串字符串,根据 ...

  7. R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数、阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化、基于数据阳性样本比例选择合适的分类评估指标

    R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数.阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化.基于数据阳性样本比例选择合适的分类评估指标 目录

  8. 数据可视化——图表类型选择

    目录 图表类型选择的依据 图表的功能性总结 图表类型总结 比较类 柱状图​​​和柱状图变体 气泡图 色块图 雷达图 漏斗图 K线图 词云图 子弹图 分布类 箱形图(盒须图.盒式图.箱线图) 气泡图 色 ...

  9. lz78算法c语言,LZW数据压缩算法研究

    内容介绍 LZW数据压缩算法研究 46页 3.2万字 摘 要 随着信息化技术的蓬勃发展,日常需要处理或者传输的数据越来越多,数据的压缩也就变得越来越重要了.我们迫切的需要有好的压缩算法来支持我们的数据 ...

  10. bwt比对算法 C语言,BWT数据压缩算法

    urrower-Wheeler变换 1994年 Michael Burrows 和 David Wheeler在<A Block-sorting Lossless Data Compressio ...

最新文章

  1. activiti5/6 系列之--BpmnModel使用
  2. 敏捷(Agile)与精益(Lean)对比
  3. linux端口绑定moute,Linux下网卡驱动的安装(未完结)
  4. x299服务器芯片组,18核心炸裂!X299主板全集:为它真拼了
  5. python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)
  6. 培训机构还能不能信任?
  7. Linux内核驱动如何编写?我们先从字符驱动入门开始
  8. export_symbol能对变量使用吗_美缝剂能代替玻璃胶使用吗?
  9. 我一直以为做知识付费的老师是非常赚钱的
  10. 小网站服务器空间,小型网站空间服务器
  11. 大数据的特性优势有哪些
  12. 设置PDF文件默认缩放比例
  13. 智能指针shared_ptr, auto_ptr, scoped_ptr, weak_ptr总结
  14. OpenCV-图像处理(22、像素重映射(cv::remap))
  15. mysql中with...as用法
  16. 移动硬盘装Ubuntu系统小记
  17. ZigBee中的技术问题以及解决方案
  18. 信息发布类网站后台界面设计一点思考(整体布局)
  19. android usb 默认mtp,usb修改为默认MTP模式
  20. 乌江榨菜再涨价,“榨茅”是如何炼成的?

热门文章

  1. PICKIT3与ICD2比较。正在等待PICKIT3到货。
  2. 监理项目的服务器,idc服务器机房搬迁工程施工监理的重点
  3. 【电磁】Matlab模拟电机内电磁场的分布附GUI界面
  4. 【Typecho插件】SakuraLoad
  5. 官方免费数据下载全国行政区划具体到村
  6. css 单行文本溢出显示省略号 1
  7. 爬虫爬取文件(图片,视频)
  8. 阿里巴巴实习生电话面试
  9. PLSQL Developer 没有64位版本 + 找不到 msvcr71.dll
  10. Eclipse美化操作