对海量数据的处理,数据的存储方式至关重要,从平台运营角度,集群管理者需要结合集群的硬件资源选择合适的数据压缩格式;对于具体的业务来说,数据开发人员还要选择合适的存储格式,这对提升数据处理效率既简单又高效。本文将重点给大家介绍目前主流的数据存储及文件压缩格式的实现原理及优劣势。
数据存储格式
数据开发人员根据具体业务需求选择不同数据存储格式,还有考虑选择行式还是列式存储。查询速度和资源节省优先级不同,需要选择不同存储格式。目前主流数据的存储格式为TextFile,SequenceFile,RcFile,OrcFile和Parquet。详见下面5种存储格式的对比。
存储格式 | 介绍 | 优势 | 不足 |
TextFile | 文件存储就是正常的文本格式,将表中的数据在hdfs上以文本的格式存储,下载后可以直接查看,也可以使用cat命令查看,按行存储、不压缩。 | (1)便于和其他工具(Pig, grep, sed, awk)共享数据。(2)便于查看和编辑。(3)加载速度快。 | (1)耗费存储空间,I/O性能较低。(2)Hive不进行数据切分合并,不能进行并行操作,查询效率低。 |
SequenceFile | SequenceFile是Hadoop API 提供的一种二进制文件,将数据以的形式序列化到文件,按行存储,支持压缩。 | (1)支持基于记录(Record)或块(Block)的数据压缩。(2)支持切片。 | 需要一个合并文件的过程,且合并后的文件不方便查看。 |
RcFile | 数据以二进制格式编码。下载后的数据不可以直接可视化。行列混合存储格式,支持压缩。 | (1)因为基于列存储,列值重复多,所以压缩效率高。(2)磁盘存储空间小,io小。 | 支持列数据类型单一,只支持Blob数据。 |
OrcFile | ORC是列式存储,有多种文件压缩方式,并且有着很高的压缩比,可以感知列数据类型,支持压缩。 | (1)选择数据压缩合理。(2)OrcFile可以在列数据之中插入Struct,Union,List,Map等数据,让数据的操作更加灵活,也更加适合非结构化数据的存储与处理。 | |
Parquet | 是一种存储格式,与语言、平台无关,并且不需要和任何一种数据处理框架绑定,基本上通常使用的查询引擎和计算框架都已适配。基于列式存储,支持压缩。 | (1)可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。(2)压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码通过RLE进一步节约存储空间。(3)只读取需要的列,支持向量运算,能够获取更好的扫描性能。 | Parquet中没有Map、Array这样的复杂数据结构,只能通过repeated和group组合来实现。 |
文件压缩格式
平台运营人员选择不同压缩格式,直接关系到平台资源利用率和开发人员业务查询效率。不同类型的数据选择不同文件压缩,对于平台还是业务至关重要。目前主流数据的压缩格式为Gzip、Bzip2、Lzo和Snappy。详见下面4种压缩格式的对比。
压缩格式 | 介绍 | 优势 | 不足 |
Gzip | 是一个GNU自由软件的文件压缩程序。文件后缀为.gz。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,压缩比为13.4%。 | (1)压缩解压速度快,压缩率高,hadoop本身支持。 (2)处理压缩文件时方便,和处理文本一样。 (3)大部分linux 系统自带Gzip命令,使用方便。 | 不支持切片。 |
Bzip2 | 是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩比为13.2%。 | (1)压缩率高(高于Gzip)。 (2)支持切片。 (3)hadoop自带,使用方便。 | 压缩解压速度特别慢。 |
Lzo | LZO 是致力于解压速度的一种数据压缩算法,这个算法是无损算法,程序是线程安全的。实现它的一个自由软件工具是lzop,压缩比为20.5%。 | (1)压缩解压速度比较快,压缩率也可以。 (2)支持切片,hadoop比较流行的压缩格式。 (3)可以在linux下安装lzo命令使用方便。 | (1)hadoop本身不支持,需要自己安装。 (2)使用Lzo格式的文件时需要做一些特殊处理(为了支持切片需要建立索引, 还需要将InputFormat指定为Lzo格式。) |
Snappy | Snappy 是一个 C++ 的用来压缩和解压缩的开发包。其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率,压缩比为22.2%。 | 高压缩解压速度,压缩率还可以。 | (1)不支持切片。 (2)压缩率比Gzip小。 (3)hadoop本身不支持需要安装。 |
整体总结:
大数据处理提升效率核心在于扫描更少数据量,通过存储格式只读取必要的数据字段,通过压缩减少网络传输量。
国美虎鲸平台数据压缩格式使用Bzip2、Snappy,OrcFile和Lzo,数据存储格式使用TextFile和Parquet。
大数据ods:作为原始数据,为让所有中心都能方便使用,存储格式使用TextFile,ods数据使用频率低且数据量大,所以压缩使用Bzip2,Bzip2格式hadoop自带,使用方便能切片且压缩比最高。
大数据mds和ads:作为应用层报表数据即热数据,考虑到这俩层数据需要查询速度快,而且mds作为大宽表,压缩格式采用压缩和解压速度比较快而且压缩率不错的Lzo,存储格式采用基于列式存储加上很多OLAP引擎默认支持的Parquet。
冷数据:nginx日志,系统日志等考虑到使用频率低,所以冷数据存储目的就是要节省空间。采用压缩率最高的Bzip2和OrcFile为压缩和存储格式。
其它:因为压缩解压速度快,采用Snappy为Map跟Reduce中间数据的压缩格式。
虎鲸平台采用以上方式进行治理平台后存储空间大大节省,核心关键报表查询速率提高35%,报表作业执行时间从治理前6小时缩短至3.5小时。
以下是Tip:
如何正确判断hdfs上文件的存储压缩格式
下面看一下不同case。讲具体case之前我们先来了解一下几个命令。
-cat命令:查看文件内容
-text命令:解压后查看文件内容,比-cat多解压过程(例如:若对应hive表hdfs路径文件是.snappy后缀,则用snappy解压后查看文件内容,以此类推)
1、无设置压缩配置
以上图是执行spark.read.textFile("hdfs://grampus/team/supply/hive_db/t_thea_busines_buyorg").show时报出的错误,即不支持Snappy压缩格式。
解决方法:spark配置文件中指定snappy本地包路径,如下所示
spark-defaults.conf文件中增加配置即可。
注:spark版本:当前版本是2.4.0一定要在spark-defaults.xml中写,spark-env.sh文件中加上以下配置不好使。
2、不带压缩
(1)hive> desc formatted "表名"来查看表信息中显示无压缩,写入数据也无压缩格式。
(2) hive> desc formatted"表名"来查看表信息中显示有压缩,写入数据时没有指定压缩格式。
以下图显示-cat时显示乱码是由于数据格式为Parquet而引起。若Text文件-cat时正常显示。
3、带压缩
(1)表元数据信息和写入数据都指定压缩格式。
-cat查询时,出现乱码。
-text查询时,
若文件是Text格式,则正常信息内容,则压缩格式就是文件block的后缀。
(2)表元数据信息无指定压缩,写入数据指定压缩格式。
-cat查询时,出现乱码。
-text查询时,
若文件是Text格式,则正常信息内容,则压缩格式就是文件block的后缀。
(3)文件格式和实际文件内容不符(假如本地文件123.log上传到hdfs上后,将文件的后缀修改为.snappy)如下所示: