Parquet与ORC:高性能列式存储 |青训营笔记

232 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第12天.

典型的大数据系统可以简单的概括为由业务层、计算层和存储层三层结构组成 屏幕截图 2022-08-15 133358.jpg

  • 在计算层,有各种计算引擎解决不同场景的问题,例如

    • Spark 主要适用于批式查询场景
    • Flink 主要适用于流式处理场景
    • Presto 主要适用于交互式查询场景
    • Hive 作为 Hadoop 框架上最早的SQL数仓产品,内置了 Hive Metastore (HMS) 组件,计算引擎上支持 Map-Reduce、Tez以及 Spark。目前 HMS 依然作为大数据场景下使用最为广泛的元数据服务。

屏幕截图 2022-08-15 133410.jpg

屏幕截图 2022-08-15 133454.jpg

  • 在存储层,HDFS 是 Hadoop 生态里第一个分布式存储服务,大数据生态里几乎所有的计算引擎都是基于 HDFS 协议和 HDFS Client 构建的。目前距离 HDFS 的发布已经有十多年的历史了,但是 HDFS 依旧在大数据存储领域占据重要的地位。
  • 近年来,随着公有云的大力发展,对象存储最为云上的存储底座,具有低成本、高可用、超大容量等优势,越来越多的云上大数据计算生态选择基于对象存储去构建。各个云产商的对象存储会提供各自的 HDFS Client 插件,支持以 HDFS Client 和协议访问对象存储。

  • 典型的例如:

  • S3: hadoop.apache.org/docs/stable…

  • OSS: hadoop.apache.org/docs/stable…

屏幕截图 2022-08-15 133523.jpg

一、列存 VS行存

1、数据格式层概述

格式层定义了数据的布局,连接计算引擎和存储服务。- 严格意义上,并不是一个独立的层级,而是运行在计算层的一个Library。

屏幕截图 2022-08-15 133627.jpg

2、分层视角下的数据形态

屏幕截图 2022-08-15 133704.jpg

3、两种数据查询分析场景

屏幕截图 2022-08-15 133802.jpg (1)OLTP:行式存储格式

  • 在典型的 OLTP 型的分析和存储系统中应用广泛,例如:MySQL、Oracle、RocksDB 等

屏幕截图 2022-08-15 133929.jpg (2)OLAP:列式存储格式

屏幕截图 2022-08-15 134013.jpg

二、Parquet原理详解

1、简介

  • Dremel 数据格式的社区实现

屏幕截图 2022-08-15 134307.jpg

  • 使用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格式

屏幕截图 2022-08-15 134415.jpg (2)Parquet in Action -Spark

屏幕截图 2022-08-15 134459.jpg

屏幕截图 2022-08-15 134522.jpg

屏幕截图 2022-08-15 134716.jpg (3)Parquet in Action -Parquet vs.Text Format

屏幕截图 2022-08-15 134635.jpg

2、Dremel 数据模型

屏幕截图 2022-08-15 134807.jpg 1、数据模型-Continued

屏幕截图 2022-08-15 134904.jpg

3、数据分布

屏幕截图 2022-08-15 134945.jpg Parquet CLI 工具

4、编码 Encoding

  • 在 Parquet 的 ColumnChunk 里,同一个 ColumnChunk 内部的数据都是同一个类型的,可以通过编码的方式更高效的存储。 更详细的解释参见:parquet.apache.org/docs/file-f…

屏幕截图 2022-08-15 135043.jpg

  • 默认场景下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

屏幕截图 2022-08-15 135244.jpg

6、索引 Index

  • 主要依赖 Min-Max Index 和 排序 来加速查找
  • Page:记录 Column 的 min_value 和 max_value
  • 一般建议和排序配合使用效果最佳
  • 一个 Parquet 文件只能定义一组 Sort Column,类似聚集索引概念

屏幕截图 2022-08-15 135402.jpg 典型的查找过程:

  • 读取 Footer
  • 根据 Column 过滤条件,查找 Min-Max Index 定位到 Page
  • 根据 Page 的 Offset Index 定位具体的位置
  • 读取 Page,获取行号
  • 从其他 Column 读取剩下的数据

(1)Bloom Filter

屏幕截图 2022-08-15 135445.jpg (2)排序 Ordering

屏幕截图 2022-08-15 135516.jpg

7、过滤下推 Predicate PushDown

  • 优点:

    • 在格式层过滤掉大多数不相关的数据
    • 减少真实的读取数据量

屏幕截图 2022-08-15 135600.jpg

8、Spark集成-向量化读

屏幕截图 2022-08-15 135638.jpg

9、深入Dremel数据模型

(1)Repetition Level

屏幕截图 2022-08-15 135748.jpg (2)Definition Level

屏幕截图 2022-08-15 135843.jpg (3)Re-Assembly

屏幕截图 2022-08-15 135927.jpg

三、ORC详解

屏幕截图 2022-08-15 140030.jpg

1、数据模型

屏幕截图 2022-08-15 140107.jpg

2、数据布局

屏幕截图 2022-08-15 140150.jpg

3、ACID特性简介

屏幕截图 2022-08-15 140238.jpg

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 存储

屏幕截图 2022-08-15 140520.jpg (2)小列聚合

屏幕截图 2022-08-15 140607.jpg (3)异步预取

  • 在计算引擎处理已经读到的数据的时候,异步去预取下一批次数据 屏幕截图 2022-08-15 140644.jpg 5、Parquet VS ORC

屏幕截图 2022-08-15 140730.jpg (1)性能

  • Hive上ORC更有优势

屏幕截图 2022-08-15 140801.jpg

屏幕截图 2022-08-15 140827.jpg (2)选择

  • 根据实际业务做细粒度的调优

屏幕截图 2022-08-15 140854.jpg

四、列存演进

1、数仓中的列存

  • 典型的数仓,例如 ClickHouse 的 MergeTree 引擎也是基于列存构建的

    • 默认情况下列按照 Column 拆分成单独的文件,也支持单个文件形式
    • 支持更加丰富的索引,例如 Bitmap Index、Reverted Index、Data Skipping Index、Secondary Index 等
  • 湖仓一体的大趋势下,数仓和大数据数据湖技术和场景下趋于融合,大数据场景下的格式层会借鉴更多的数仓中的技术

屏幕截图 2022-08-15 141005.jpg

2、存储侧下推

屏幕截图 2022-08-15 141058.jpg

3、Column Family 支持

屏幕截图 2022-08-15 141136.jpg