这是我参与「第四届青训营 」笔记创作活动的第12天.
典型的大数据系统可以简单的概括为由业务层、计算层和存储层三层结构组成
-
在计算层,有各种计算引擎解决不同场景的问题,例如
- Spark 主要适用于批式查询场景
- Flink 主要适用于流式处理场景
- Presto 主要适用于交互式查询场景
- Hive 作为 Hadoop 框架上最早的SQL数仓产品,内置了 Hive Metastore (HMS) 组件,计算引擎上支持 Map-Reduce、Tez以及 Spark。目前 HMS 依然作为大数据场景下使用最为广泛的元数据服务。
- 在存储层,HDFS 是 Hadoop 生态里第一个分布式存储服务,大数据生态里几乎所有的计算引擎都是基于 HDFS 协议和 HDFS Client 构建的。目前距离 HDFS 的发布已经有十多年的历史了,但是 HDFS 依旧在大数据存储领域占据重要的地位。
-
近年来,随着公有云的大力发展,对象存储最为云上的存储底座,具有低成本、高可用、超大容量等优势,越来越多的云上大数据计算生态选择基于对象存储去构建。各个云产商的对象存储会提供各自的 HDFS Client 插件,支持以 HDFS Client 和协议访问对象存储。
-
典型的例如:
一、列存 VS行存
1、数据格式层概述
格式层定义了数据的布局,连接计算引擎和存储服务。- 严格意义上,并不是一个独立的层级,而是运行在计算层的一个Library。
2、分层视角下的数据形态
3、两种数据查询分析场景
(1)OLTP:行式存储格式
- 在典型的 OLTP 型的分析和存储系统中应用广泛,例如:MySQL、Oracle、RocksDB 等
(2)OLAP:列式存储格式
二、Parquet原理详解
1、简介
- Dremel 数据格式的社区实现
- 使用Parquet
# Spark
df.write.parquet("/path/to/file.parquet")
df.write
.partitionBy(”col1")
.format("parquet")
.saveAsTable(”sometable")
val df = spark.read.parquet(”/path/to/file.parquet")
# Hive DDL
CREATE TABLE table_name (x INT, y STRING) STORED AS PARQUET;
(1)Parquet in Action -DDL
- 在Hive中使用DDL创建TAble使用Parquet/ORC格式
(2)Parquet in Action -Spark
- 在 Spark 中使用 Parquet,参见 Parquet Files - Spark 3.3.0 Documentation
- 在 Spark 中使用 ORC,参见ORC Files - Spark 3.3.0 Documentation
(3)Parquet in Action -Parquet vs.Text Format
2、Dremel 数据模型
1、数据模型-Continued
3、数据分布
Parquet CLI 工具
-
parquet-mr 包含 CLI 工具: github.com/apache/parq…
- 早年的版本叫 parquet-tools github.com/apache/parq…
4、编码 Encoding
- 在 Parquet 的 ColumnChunk 里,同一个 ColumnChunk 内部的数据都是同一个类型的,可以通过编码的方式更高效的存储。 更详细的解释参见:parquet.apache.org/docs/file-f…
- 默认场景下Parquet-mr会自动根据数据特征选择
-
-
Bit-Pack Encoding: 对于 32位或者64位的整型数而言,并不需要完整的 4B 或者 8B 去存储,高位的零在存储时可以省略掉。适用于最大值非常明确的情况下。
-
一般配合 RLE 一起使用
-
-
Dictionary Encoding:适用于列基数 (Column Cardinality) 不大的字符串类型数据存储;
- 构造字典表,用字典中的 Index 替换真实数据
- 替换后的数据可以使用 RLE + Bit-Pack 编码存储
-
业务自定义:
org.apache.parquet.column.values.factory.ValuesWriterFactory
5、压缩 Compression
6、索引 Index
- 主要依赖 Min-Max Index 和 排序 来加速查找
- Page:记录 Column 的 min_value 和 max_value
- 一般建议和排序配合使用效果最佳
- 一个 Parquet 文件只能定义一组 Sort Column,类似聚集索引概念
典型的查找过程:
- 读取 Footer
- 根据 Column 过滤条件,查找 Min-Max Index 定位到 Page
- 根据 Page 的 Offset Index 定位具体的位置
- 读取 Page,获取行号
- 从其他 Column 读取剩下的数据
(1)Bloom Filter
parquet.bloom.filter.enabled- 更多参见:en.wikipedia.org/wiki/Bloom_…
(2)排序 Ordering
7、过滤下推 Predicate PushDown
-
优点:
- 在格式层过滤掉大多数不相关的数据
- 减少真实的读取数据量
8、Spark集成-向量化读
9、深入Dremel数据模型
(1)Repetition Level
(2)Definition Level
(3)Re-Assembly
三、ORC详解
1、数据模型
2、数据布局
3、ACID特性简介
4、AliORC
ORC在阿里云计算平台被广泛应用,主流产品MAXCompute+交互式分析Hologres的最先版本都支持ORC格式,AliORC是对ORC的深度定制版。
(1)索引增强 Roaring Bitmap
-
更高效的压缩保存 Bitmap Index
-
以 16 bit 的 bitmap 空间为一个保存单元,每个单元可以是以下三种形式之一:
- Array Container:只保存为 1 的 Index
- Run Container:类似 RLE 编码
- Bitset container:原始 bitmap 存储
(2)小列聚合
(3)异步预取
- 在计算引擎处理已经读到的数据的时候,异步去预取下一批次数据
5、Parquet VS ORC
(1)性能
- Hive上ORC更有优势
(2)选择
- 根据实际业务做细粒度的调优
四、列存演进
1、数仓中的列存
-
典型的数仓,例如 ClickHouse 的 MergeTree 引擎也是基于列存构建的
- 默认情况下列按照 Column 拆分成单独的文件,也支持单个文件形式
- 支持更加丰富的索引,例如 Bitmap Index、Reverted Index、Data Skipping Index、Secondary Index 等
- 湖仓一体的大趋势下,数仓和大数据数据湖技术和场景下趋于融合,大数据场景下的格式层会借鉴更多的数仓中的技术