列存查询更快的原因有很多,本文主要介绍Apache Hadoop的列式存储格式:Parquet技术原理。
1.概念与定义
首先说明下Parquet技术原理的两种特性:映射下推与谓词下推。
映射下推,是指在获取数据时只需要扫描需要的列,不用全部扫描。【列式存储最突出优势】
谓词下推,是指通过将一些过滤条件尽可能的在最底层执行以减少结果集。谓词就是指这些过滤条件,即返回bool:true和false的表达式,比如SQL中的大于小于等于、Like、Is Null等。【列式存储Filter】
使用映射下推和谓词下推,只读取需要的列,跳过不满足条件的列,能够减少不必要的数据扫描,带来性能的提升并在表字段比较多的时候更加明显。进而带来更小的IO操作。
2.列存底层技术汇总
大数据业界流传着这样一句话:如果说 HDFS 是大数据时代文件系统的事实标准,Parquet 就是大数据时代存储格式的事实标准。
底层列式存储到磁盘,主要有以下几种格式:
CSV:最常用的数据格式
Pickle:用于序列化和反序列化Python对象结构
MessagePack:类似于json,但是更小更块
HDF5:一种常见的跨平台数据储存文件
Feather:一个快速、轻量级的存储框架
Parquet:Apache Hadoop的列式存储格式
3.Hadoop 生态圈中主流的列式存储格式——Parquet
Parquet 是 Hadoop 生态圈中主流的列式存储格式,最早是由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 孵化器里毕业成为 Apache 顶级项目。它与语言无关,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,能够与 Parquet 适配的查询引擎包括 Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL等,计算框架包括 MapReduce, Spark, Cascading, Crunch, Scalding, Kite 等,数据模型包括 Avro, Thrift, Protocol Buffer, POJOs 等。
这里可以将Parquet数据存储分为三层:数据存储层,对象转换层和对象模型层。
数据存储层:在这里,我们将定义 Parquet 文件格式,包括 Parquet 原始类型定义、Page类型、编码类型、压缩类型等等。
对象转换层:这一层在 parquet-mr 项目中完成其他对象模型与 Parquet 内部数据模型的映射和转换。
对象模型层:该层定义如何读取 Parquet 文件的内容,包括 Avro、Thrift、Protocal Buffer 等对象模型/序列化格式、Hive serde 等的适配。
Parquet 相对其他列存比如 ORC 的一大特点或优势就是:Parquet 支持嵌套结构的数据模型。支持嵌套结构的数据模型而非扁平式的数据模型,意味着 Parquet 能够很好的将诸如 Protobuf,thrift,json 等对象模型进行列式存储。
4.Parquet?存储模型
存储模型可以理解为文件存储格式,Parquet 的存储模型主要由行组(Row Group)、列块(Column Chuck)、页(Page)组成。
? ? ? ? 4.1? 行组,Row Group:Parquet 在水平方向上将数据划分为行组,默认行组大小与 HDFS Block 块大小对齐,Parquet 保证一个行组会被一个 Mapper 处理。
? ? ? ? 4.2? 列块,Column Chunk:行组中每一列保存在一个列块中,一个列块具有相同的数据类型,不同的列块可以使用不同的压缩。
? ? ? ? 4.3? 页,Page:Parquet 是页存储方式,每一个列块包含多个页,一个页是最小的编码的单位,同一列块的不同页可以使用不同的编码方式。
5.对比ORC?存储
除了 Parquet,另一个常见的列式存储格式是 ORC(OptimizedRC File)。在 ORC 之前,Apache Hive 中就有一种列式存储格式称为 RCFile(RecordColumnar File),ORC 是对 RCFile 格式的改进,主要在压缩编码、查询性能方面做了优化。因此 ORC/RC 都源于 Hive,主要用来提高 Hive 查询速度和降低 Hadoop 的数据存储空间。
Parquet 与 ORC 的不同点总结以下:
嵌套结构支持:Parquet 能够很完美的支持嵌套式结构,而在这一点上 ORC 支持的并不好,表达起来复杂且性能和空间都损耗较大。
更新与 ACID 支持:ORC 格式支持 update 操作与 ACID,而 Parquet 并不支持。
压缩与查询性能:在压缩空间与查询性能方面,Parquet 与 ORC 总体上相差不大。可能 ORC 要稍好于 Parquet。
查询引擎支持:这方面 Parquet 可能更有优势,支持 Hive、Impala、Presto 等各种查询引擎,而 ORC 与 Hive 接触的比较紧密,而与 Impala 适配的并不好。之前我们说 Impala 不支持 ORC,直到 CDH 6.1.x 版本也就是 Impala3.x 才开始以 experimental feature 支持 ORC 格式。
关于 Parquet 与 ORC,首先建议根据实际情况进行选择。另外,根据笔者的综合评估,如果不是一定要使用 ORC 的特性,还是建议选择 Parquet。
6.大数据的列存为什么普遍?
列存在大数据和数据湖中的其他优势也很明显,比如列存具有更高的压缩比。从而使得更容易对每个列使用高效的压缩和编码,降低磁盘空间。其中case是不压缩,而gzip能达到3到10倍的压缩比,snappy相比其他的压缩库,能够在特定的压缩率下拥有惊人的压缩速度,“压缩普通文本文件的速度是其他库的1.5-1.7倍。