这是我参与「第四届青训营 」笔记创作活动的的第13天。
写在前面
列式存储是高性能计算的秘密之一,理解列存储的场景、了解常见的编码和压缩算法以及学会在大数据分析中选择合适的列存储格式,能够帮助我们知道具体的调优方向。
笔记正文
1. 列存v.s.行存
1. 数据格式层概述
- 计算层
- 存储层
- 数据格式层
2. 分层视角下的数据形态
- 存储层
- 格式层
- 计算引擎
3. 两种数据查询分析场景
- OLTP
- 在线业务系统
- 事务、实时、高并发、高可用、低延时
- schema相对简单,维度不多,数据规模小
- 格式
- 每行数据在文件上连续存储
- 读取整行数据效率高,单词IO顺序读即可
- 典型系统:MySQL、Oracle、KV数据库
- OLAP
- 数据仓库或者大数据分析
- 弱事务性、近实时、离线
- Schema复杂、数据维度多
- 格式
- 每列数据在文件上连续存储
- 读取整列效率较高
- 同列数据类型一致,压缩编码效率好
- 大数据分析系统:SQL-on-Hadoop,数据仓库:ClickHouse, Greenplum, MaxCompute
- 总结
- 格式层定义数据布局,连接计算引擎和存储服务
- OLTP和OLAP场景化差异明显
- 业务场景决定了技术实现,行存适用于OLTP,列存适用于OLAP
2. Parquet原理详解
1. Parquet in Action
- DDL
- Spark
- SparkSQL
2. Dremel数据模型
-
特点
- Protocol Buffer定义
- 支持可选和重复字段
- 支持嵌套类型
-
数据布局
- RowGroup
- Column Chunk
- Page
- Footer
-
编码
- Plain
- RLE
- Dictionary Encoding
-
压缩
- snappy
- gzip
-
索引
- Bloom Filter
-
排序
-
过滤下推
-
向量化读
-
Repetition Level
-
Re Assembly
3. ORC详解和对比
- ACID特性
- AliORC
- 索引增强
- 小列聚合
- 异步预取
- Parquet v.s. ORC
- 原理上,最大区别为NestedType和复杂类型的处理上
- Parquet算法上复杂,CPU开销比ORC略大
- ORC算法简单但读取更多数据
- 取决于实际业务需求
4. 列存演进
- 数仓列存
- 存储测下推
- column family支持