这是我参与「第四届青训营 」笔记创作活动的第11天
本次学习主要是针对高性能列式存储中Parquet和ORC的了解和学习,收获颇丰!
一、什么是列式存储
由于OLAP查询的特点,列式存储可以提升祺查询性能,相对于关系数据库中通常使用的行式存储,在使用列式存储时每一列的所有元素都是顺序存储的。由此可以给查询带来许多优化:
- 查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将I/O消耗降低N倍,另外可以保存每一列的统计信息(min、max、sum等),实现部分的谓词下推。
- 由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算法,进一步压缩I/O。
- 由于每一列的成员的同构性,可以使用更加适合CPU pipeline的编码方式,减小CPU的缓存失效。
二、嵌套数据格式
通常使用关系数据库存储结构化数据,而关系数据库支持的数据模型都是扁平式的,而遇到诸如List、Map和自定义的Struct的时候就需要自己解析,但是在大数据环境下,数据的来源多种多样,例如埋点数据,很可能需要把程序中的某些对象内容作为输出的一部分,而每一个对象都可能的嵌套的,所以如果能够原生得支持这种数据,查询的时候就不需要额外的解析便能获得较好的结果。
随着嵌套格式的数据的需求日益增加,目前Hadoop生态圈中主流的查询引擎都支持更丰富的数据类型,例如Hive。SparkSQL.Impala等都原生得支持诸如struct、map、array这样的复杂数据类型,这样促使各种存储格式都需要支持嵌套数据格式。
三、Parquet存储格式
Apache Parquet的Hadoop生态圈中的一种新型列式存储格式,他可以兼容Hadoop生态圈中大多数计算框架,被多种查询引擎支持(Hive、Impala、Drill等),并且它是语言和平台无关的。Parquet最初是由Twitter和Cloudera合作开发完成并开源。
Parquet最初的来自Google在2010年发表的Dremel论文,在该文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的。
四、数据模型
Parquet支持嵌套的数据模型,每一个数据模型的schema包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名,重复次数可以是以下三种:required(只出现1次)、repeated(出现0次或多次)、optional(出现0次或1次)。可以吧schema转换成树结构,根节点可以理解为repeated模型。
五、ORC文件格式
ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。ORC文件是自描述的,它的元数据使用Protocol Buffers序列化,并且文件中的数据尽可能的压缩以降低存储空间的消耗,目前也被Spark SQL、Presto等查询引擎支持,但是Impala对于ORC目前没有支持,仍然使用Parquet作为主要的列式存储格式。
六、总结
本次学习主要对Parquet和ORC两种高性能列式存储方式进行了了解,从数据模型、文件格式和数据访问流程德国几个方面学习了Hadoop生态圈中的两种列式存储格式。对于大数据场景下的数据分析需求,使用这两种存储格式总会带来存储和性能上的提升,但是在实际使用的时候还需要针对实际的数据进行选择。
七、参考资料