这是我参与「第四届青训营 」笔记创作活动的第13天
总览
- 列式存储和行式存储的区别
- Parquet 列存格式的原理详解
- ORC 列存格式的原理详解,以及和Parquet 的对比
- 列存格式的演进
计算引擎解决不同场景
- Spark 主要适用于批式查询场景
- Flink 主要适用于流式处理场景
- Presto 主要适用于交互式查询场景
- Hive 作为 Hadoop 框架上最早的SQL数仓产品,内置了 Hive Metastore (HMS) 组件,计算引擎上支持 Map-Reduce、Tez以及 Spark。目前 HMS 依然作为大数据场景下使用最为广泛的元数据服务。
Parquet 详解
Parquet 数据文件布局
- RowGroup: 每一个行组包含一定数量或者固定大小的行的集合,在 HDFS 上,RowGroup 大小建议配置成 HDFS Block 大小
- ColumnChunk: RowGroup 中按照列切分成多个 ColumnChunk
- Page:ColumnChunk内部继续切分成 Page,一般建议 8KB 大小。Page 是压缩和编码的基本单元
索引和排序 Index and Ordering
- 和传统的数据库相比,索引支持非常简陋
- 主要依赖 Min-Max Index 和 排序 来加速查找
- Page:记录 Column 的 min_value 和 max_value
- Footer 里的 Column Metadata 包含 ColumnChunk 的全部 Page 的 Min-Max Value
- 一般建议和排序配合使用效果最佳
- 一个 Parquet 文件只能定义一组 Sort Column,类似聚集索引概念
典型的查找过程:
- 读取 Footer
- 根据 Column 过滤条件,查找 Min-Max Index 定位到 Page
- 根据 Page 的 Offset Index 定位具体的位置
- 读取 Page,获取行号
- 从其他 Column 读取剩下的数据
Parquet 中的压缩方式
- Page 完成 Encoding 以后,进行压缩
- 支持多种压缩算法
- snappy: 压缩速度快,压缩比不高,适用于热数据
- gzip:压缩速度慢,压缩比高,适用于冷数据
- zstd:新引入的压缩算法,压缩比和 gzip 差不多,而且压缩速度略低于 Snappy
ORC 详解
\
参考链接:juejin.cn/post/712795…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。