数据存储与压缩问题
选择适合的底层数据存储格式,可以极大得提升性能。
MR中常见的数据压缩格式
Hive数据存储格式
- TextFile:默认使用;支持压缩,压缩后的TextFile(部分压缩格式)在Hive中无法切割。
- SequenceFile:二进制文件,内部数据是kv对形式,行存储;可切分、可压缩、支持NONE、Record、Block级别的压缩。注意:文件自身支持切分的话,压缩后就一定可以切分。
- RCFile:行列式存储;压缩快、可分割,支持快速列存取。
- Avro
- ORC
- Parquet
ORC
ORC存储的文件是一种带有模式描述的行列式存储文件,支持切分。它将数据先按行组进行切分,每个行组包含若干行,每一行组再按列进行存储。行列式存储结合了行式存储和列式存储的优点,在进行大数据量扫描读取的时候,可以按行组进行数据读取。要读取某个列的数据,可以在行组的基础上读取指定的列。
ORC文件由三部分组成:stripe,file footer,postscript。
file footer:包含了文件中stripe的列表、每个stripe的行数,以及每个列的数据类型。
stripe是ORC存储数据的地方,包含了三个部分index data、rows data、stripe footer。index data保存了所在条带的一些统计信息,还有数据在stripe中的位置索引信息。rows data是数据存储的地方,由多个行组组成,数据以流的形式进行存储,每个行组包含了metadata stream和data stream。stripe footer保存数据所在的文件目录。
postscript:含有压缩参数和压缩大小的信息。
所以我们可以在创建hive表的时候直接指定ORC的压缩类型,通过tblproperties配置orc.compress,目前支持三个参数:NONE、ZLIB、SNAPPY。默认是ZLIB,SNAPPY是用得比较多的。
Parquet
Parquet是一种新型的、与语言无关的,不与任何一种数据处理框架绑定的列式存储格式。Parquet支持Hive、Impala、Spark等框架。一个Parquet类型的Hive表文件中,数据被分成多个行组,每个行组包含多个列块,每个列块又被拆分成多个page,同时它支持切分。
Parquet和ORC类似,也记录元数据信息,压缩信息等。可以通过配置parquet.compression配置压缩格式,支持的压缩格式有uncompressed、snappy、gzip、lzo。
优化思路
- 在数据存储层面,ORC的数据存储量是最优的。由于ORC的存储性能已经很好,并且也支持切分,所以压缩格式就选择压缩、解压缩速率快的,可以选择snappy。
- 在多平台支持层面,Parquet相对于ORC的兼容性更好一点点。
- 在数仓中,ODS层由于数据进来的时候一般是textFile,所以ODS层可以用TextFile;DWD和DWS可以使用ORC+Snappy,这个性能好点。最后ADS层可以使用textFile,因为需要和外部系统交互。