这是我参与「第四届青训营 」笔记创作活动的第14天。
Parquet 和 ORC:高性能列式存储
-
列式存储和行式存储的区别 ① 行式存储倾向于结构固定,即不论别人怎么变,行式存储始终是那些固定的结构进行存储。而列式存储倾向于结构弱化,按需自取,根据需要来进行存储,不会浪费存储空间。
② 行式存储一行数据只需一份主键,列式存储一行数据需要多份主键。
③ 行式存储存的都是业务数据,列式存储除了业务数据外,还要存储列名。
④ 行式存储更类似于一个Java Bean,所有字段都提前定义好,并且不能改变;而列式存储更像一个Map,不提前定义,但可以随意往里添加key/value。
Parquet 详解
数据模型
- Protocol Buffer 定义
- 支持可选和重复字段
- 支持嵌套类型
Parquet 中的压缩方式
-
Page 完成 Encoding 以后,进行压缩
-
Parquet支持的多种压缩算法:
① snappy: 压缩速度快,压缩比不高,适用于热数据
② gzip:压缩速度慢,压缩比高,适用于冷数据
③ zstd:新引入的压缩算法,压缩比和 gzip 差不多,但压缩速度略低于 Snappy。
Parquet的优劣对比:
- 支持嵌套结构,这点对比同样是列式存储的OCR具备一定优势;
- 适用于OLAP场景,对比CSV等行式存储结构,列示存储支持映射下推和谓词下推,减少了磁盘IO;
- 同样的压缩方式下,列式存储因为每一列都是同构的,因此可以使用更高效的压缩方法;
Parquet & Spark
Parquet作为最通用的 Spark 数据格式,主要实现在:ParquetFileFormat。 害支持向量化读;向量化读是主流大数据分析引擎的标准实践,可以极大的提升查询性能。
Spark 以 Batch 的方式从 Parquet 读取数据,下推的逻辑也会适配 Batch 的方式。
ORC 详解
ORC产生于 Hive 项目。
ORC是大数据分析领域使用最广的列存格式之一。
数据模型
- ORC 会给包括根节点在内的中间节点都创建一个 Column
- 嵌套类型或者集合类型支持和 Parquet 差别较大
- optional 和 repeated 字段依赖父节点记录额外信息来重新 Assembly 数据。
数据布局
ORC的数据布局类似于Parquet:
- Rooter + Stripe + Column + Page 结构
- Encoding / Compression / Index 支持上和 Parquet 几乎一致。
Parquet vs ORC 对比
- 从原理层面来讲,最大的差别就是他们对于 NestedType 和复杂类型处理上。
- Parquet 的算法上要复杂很多,带来的 CPU 的开销比 ORC 要大。
- ORC 的算法上相对简单,但是要读取更多的数据。