列存 VS 行存 | 青训营笔记

172 阅读2分钟

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

01. 列存 VS 行存

1.1 数据格式层概述

  • 计算层:各种计算引擎
  • 储存层:承载数据的持久化储存
  • 数据格式层:定义了存储层文件内部的组织格式,计算引擎通过格式层的支持来读写文件
  • 严格意义上,并不是一个独立的层级,而是运行在计算层的一个Library
  • 在计算层,有各种计算引擎解决不同场景的问题,例如

    • 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 和协议访问对象存储。典型的例如:

1.2 分层视角下的数据形态

  • 存储层:File,Blocks
  • 格式层:File 内部的数据布局 (Layout + Schema)
  • 计算引擎:Rows + Columns

1.3 OLTP vs OLAP

1.PNG

1.4 OLPT:行存式储存格式

  • 每一行 (Row) 的数据在文件的数据空间里连续存放的
  • 读取整行的效率比较高,一次顺序 IO 即可
  • 在典型的 OLTP 型的分析和存储系统中应用广泛,例如:MySQL、Oracle、RocksDB 等

1.5 OLAP:列存式储存格式

  • 每列的数据在文件上是连续存储的

  • 读取整列的效率较高

  • 同列的数据类型一致,压缩编码的效率更好

  • 典型系统

    • 大数据分析系统:Hive、Spark,数据湖分析
    • 数据仓库:ClickHouse,Greenplum,阿里云 MaxCompute