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

130 阅读2分钟

  这是我参与「第四届青训营 」笔记创作活动的的第8天。本篇笔记对于8.6日郭俊老师讲授的《 Parquet 和 ORC:高性能列式存储》的内容做一个复习总结。


列存与行存
  • 数据格式层:定义了存储层文件内部的组织格式,便于计算引擎读写文件
  • 各层的数据形态:
    • 存储层:inode + blocks
    • 格式层:File 内部的数据布局( Data Region + Index Region + Schema)
    • 计算引擎:rows + columns
  • OLTP 和 OLAP :
    • OLTP:行式存储格式
      • 每行的数据在文件上连续存储
      • 整行读取效率高,单次 IO 开销
      • 典型应用与关系型数据库,Key - Value 数据库
    • OLAP:列式存储格式
      • 每列的数据在文件上连续存储
      • 整列读取效率高
      • 同列数据因为类型一致,压缩编码更高效
      • 应用于分析系统或数仓( clickhouse )

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