这是我参与「第四届青训营 」笔记创作活动的的第8天。本篇笔记对于8.6日郭俊老师讲授的《 Parquet 和 ORC:高性能列式存储》的内容做一个复习总结。
列存与行存
- 数据格式层:定义了存储层文件内部的组织格式,便于计算引擎读写文件
- 各层的数据形态:
- 存储层:inode + blocks
- 格式层:File 内部的数据布局( Data Region + Index Region + Schema)
- 计算引擎:rows + columns
- OLTP 和 OLAP :
- OLTP:行式存储格式
- 每行的数据在文件上连续存储
- 整行读取效率高,单次 IO 开销
- 典型应用与关系型数据库,Key - Value 数据库
- OLAP:列式存储格式
- 每列的数据在文件上连续存储
- 整列读取效率高
- 同列数据因为类型一致,压缩编码更高效
- 应用于分析系统或数仓( clickhouse )
- OLTP:行式存储格式
Parquet 原理详解(待补充)
- 简介:大数据分析领域最广的列存格式,Spark 推荐存储格式(相关 github 仓库:parquet-format:格式定义、parquet-mr:java 实现)
- 1
- Dremel 数据模型:
- 数据布局:图
- RowGroup:
- 2
- 3
- 4
- 编码:默认场景下 parquet-mr 会自动根据数据特征选择编码方式,也可以通过接口进行业务自定义
- 1
- Run Length Encoding(RLE):
- 3
- 压缩:
- snappy:
- gzip:
- zstd:
- 建议选择 snappy 或者 zstd,根据业务数据类型充分测试压缩效果,以及对查询性能的影响
- 索引:非常的简陋
- Min-max Index:
- Column Index:
- Offset Index:
- 对于列基数比较大的场景,或者非排序列的过滤,引入 Bloom Filter 加速过滤匹配判定,xxx
- 排序:(问题:列排序怎么保证对应顺序?冗余?)
- 过滤下推( Predicate PushDown ):
- Spark 集成-向量化读:
- 1
- 2
- 3
- 4 (版本最好选择:xx)
- Dremel 数据模型- Repetition Level
ORC 详解和对比
- 1
- 数据模型:
- 数据布局:类似 Parquet,xxx
- ACID 特性:支持 Hive Transactions 实现,目前只有 Hive 本身集成,基于xxx,类似xxx
- AliORC:
- 1
- 2
- 3
- Parquet 和 ORC 对比:
列存演进
- 数仓中的列存:
- Clickhouse 的 MergeTree 引擎也是基于列存构建的
- 默认情况按照 Column 拆分
- 支持更加丰富的索引
- 湖仓一体的趋势,列存趋同
- 存储侧下推:
- 更多的下推工作下沉到存储服务侧
- 越接近数据,下推过滤的效率越高
- 例如 AWS S3 Select 功能
- 挑战:存储侧需要感知 Schema、xxx
- Column Family 支持
- 背景:Hudi 数据湖场景下,支持 部分列 的快速更新
- 2
- 3