这是我参与「第四届青训营 」笔记创作活动的第6天
学习目标
- 理解列式存储的应用场景
- 理解Paequet与ORC的原理与区别
- 了解列式存储格式中常见的编码与压缩算法
- 学会在大数据分析中选择合适的列式格式,知道具体的调优方向
目录
- 列存VS行存
- Parquet原理详解
- ORC详解与对比
- 列存演进
列存VS行存
数据格式层概述
- 计算层:各种计算引擎
- 存储层:承载数据持久化存储
- 数据格式层:定义了存储层内部的组织格式
OLTP VS OLAP
OLTP(行存)
- 每行的数据在文件上是连续存储的
- 读取整行数据效率高,单次IO顺序读即可
- 典型系统
-
- 关系型数据库:MySQL 、Oracle
- key-Value 数据库
OLAP(列存)
- 每列数据在文件上是连续存储的
- 读取整列的效率较高
- 同列的数据类型一致,压缩编码效率高
- 典型系统
-
- 大数据分析系统:SQL-on-Hadoop、数据湖分析
- 数据仓库:ClickHouse、Greenplum、阿里云MaxCompute
总结
- 格式层定义了数据的布局,连接计算引擎和存储服务
- OLAP和OLTP场景差异明显
Parquet原理详解
地址:项目地址
- 大数据分析邻域使用最广的列式存储格式
- Spark推荐存储格式
数据布局
- RowGroup:每一个行组包含一定的数量或者固定大小的行集合
- ColumnChunk:RowGroup中按照列切分为多个ColumnChunk
- Page:ColumnChunk内部继续切分page,一般建议8KB大小,压缩和编码的基本单元
-
- 根据保存的数据类型分为:Data page、Dictionary page、Index Page
- Footer:保存文件的元信息
-
- Schema
- Config
- Metadata
-
-
- RowGroup Meta
-
-
-
-
- Column Meta
-
-
编码
- Plain 直接存储原始数据
- Run Length Encoding:适合列基数不大,重复值较多的场景
- 字典编码:适合列基数不大,构造字典,写到Dictionary Page;把数据用字典Index替换,然后RLE编码
压缩
- Page完成Encoding以后,进行压缩
- 支持多种压缩算法
- snappy:压缩速度快,压缩比不高,适合热数据
- gzip:压缩速度慢,压缩比高,适合冷数据
- zstd:新引入的压缩算法,压缩比跟gzip差不多,压缩速度比肩snappy
索引
- 与传统数据库相比,对索引支持非常简陋
- Min-Max Index:记录Page内部Column的min_value和max_value
- Column Index:
-
- Footer里面的Column Metadata包含ColoumnChunk的全部Page的Min-Max Value
- Offset Index:记录Page在文件中的Offset和Page的RowRange
索引 -布隆过滤器
- 对列基数比较大的场景,或者非排序的过滤,Min_Max Index很难发挥作用
- 引入布隆过滤器可以加速过滤判断
\