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

119 阅读2分钟

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

学习目标

  • 理解列式存储的应用场景
  • 理解Paequet与ORC的原理与区别
  • 了解列式存储格式中常见的编码与压缩算法
  • 学会在大数据分析中选择合适的列式格式,知道具体的调优方向

目录

  • 列存VS行存
  • Parquet原理详解
  • ORC详解与对比
  • 列存演进

列存VS行存

数据格式层概述

  • 计算层:各种计算引擎
  • 存储层:承载数据持久化存储
  • 数据格式层:定义了存储层内部的组织格式

OLTP VS OLAP

OLTP(行存)

  • 每行的数据在文件上是连续存储的
  • 读取整行数据效率高,单次IO顺序读即可
  • 典型系统
    • 关系型数据库:MySQL 、Oracle
    • key-Value 数据库

OLAP(列存)

  • 每列数据在文件上是连续存储的
  • 读取整列的效率较高
  • 同列的数据类型一致,压缩编码效率高
  • 典型系统
    • 大数据分析系统:SQL-on-Hadoop、数据湖分析
    • 数据仓库:ClickHouse、Greenplum、阿里云MaxCompute

总结

  • 格式层定义了数据的布局,连接计算引擎和存储服务
  • OLAP和OLTP场景差异明显

Parquet原理详解

地址:项目地址

  • 大数据分析邻域使用最广的列式存储格式
  • Spark推荐存储格式

数据布局

  • RowGroup:每一个行组包含一定的数量或者固定大小的行集合
  • ColumnChunk:RowGroup中按照列切分为多个ColumnChunk
  • Page:ColumnChunk内部继续切分page,一般建议8KB大小,压缩和编码的基本单元
    • 根据保存的数据类型分为:Data page、Dictionary page、Index Page
  • Footer:保存文件的元信息
    • Schema
    • Config
    • Metadata
      • RowGroup Meta
        • Column Meta

编码

  • Plain 直接存储原始数据
  • Run Length Encoding:适合列基数不大,重复值较多的场景
  • 字典编码:适合列基数不大,构造字典,写到Dictionary Page;把数据用字典Index替换,然后RLE编码

压缩

  • Page完成Encoding以后,进行压缩
  • 支持多种压缩算法
  • snappy:压缩速度快,压缩比不高,适合热数据
  • gzip:压缩速度慢,压缩比高,适合冷数据
  • zstd:新引入的压缩算法,压缩比跟gzip差不多,压缩速度比肩snappy

索引

  • 与传统数据库相比,对索引支持非常简陋
  • Min-Max Index:记录Page内部Column的min_value和max_value
  • Column Index:
    • Footer里面的Column Metadata包含ColoumnChunk的全部Page的Min-Max Value
  • Offset Index:记录Page在文件中的Offset和Page的RowRange

索引 -布隆过滤器

  • 对列基数比较大的场景,或者非排序的过滤,Min_Max Index很难发挥作用
  • 引入布隆过滤器可以加速过滤判断

\