踩坑实录:把hive表的数据导入redis时,没有正确认识hive是压缩存储的,导致73G的hive文件导入redis后,redis的存储涨了900G,超过了redis的警戒线。后续评估redis的存储空间到底涨多少,还是应该先导入小量数据,查看存储涨幅,再线性预估全量涨幅。
本文梳理一下hive表的存储与压缩方式。
参考文章一文彻底搞懂Hive的数据存储与压缩-阿里云开发者社区
目录
4)ORC Files(Optimized Row Columnar)
一、hive的压缩格式
DEFAULT、Gzip、Bzip、Snappy、Lzo
二、hive的存储方式
1)行式存储
- 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在;
- 优点:这种存储格式比较方便进行INSERT/UPDATE操作;
- 不足之处就是如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取。同时空间利用率不高。
2)列式存储
- 每一列的数据都是存储在一起的,每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法,高效的压缩率,不仅节省储存空间也节省计算内存和CPU;
- 优点:查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询,在查询只需要少数几个字段的时候,能大大减少读取的数据量;
- 缺点:INSERT/UPDATE很麻烦或者不方便,不适合扫描小量的数据
三、常见的数据格式
常见的数据格式如下,我简单记录下标红的部分
1.Text File、2.SequenceFile、3.RCFile、4.Avro Files、 5.ORC Files、6.Parquet、7.Custom INPUTFORMAT and OUTPUTFORMAT(用户自定义格式)
1)Text File
存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。这种格式用了压缩以后不支持split。
2)SequenceFile
SequenceFile是Hadoop API提供的一种二进制文件支持,存储方式为行存储,其具有使用方便、可分割、可压缩的特点。
3)RCfile
存储方式:数据按行分块,每块按列存储
Record Columnar的缩写,是Hadoop中第一个列式存储格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。是一种行列存储相结合的存储方式。
首先,其将数据按行分块,保同一行的数据位于同一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取,并且能跳过不必要的列读取
4)ORC Files(Optimized Row Columnar)
存储方式:数据按行分块 每块按照列存储(不是真正意义上的列存储,可以理解为分段列存储,你可以对照我们讲的那个例子来理解)
ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。
ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Spark SQL、Presto等查询引擎支持,但是Impala对于ORC目前没有支持,仍然使用Parquet作为主要的列式存储格式。
ORC文件特点是压缩快 快速列存取,是rcfile的改良版本,相比RC能够更好的压缩,能够更快的查询,支持各种复杂的数据类型,比如datetime,decimal,以及复杂的struct是以二进制方式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。
需要注意的是 ORC在读写时候需要消耗额外的CPU资源来压缩和解压缩,当然这部分的CPU消耗是非常少的。