这是我参与「第四届青训营 」笔记创作活动的的第11天
本节课程主要介绍Parquet、ORC以及列式存储。
一、列式存储
典型的大数据系统可以简单的概括为由业务层、计算层和存储层三层结构组成。
在存储层,HDFS 是 Hadoop 生态里第一个分布式存储服务,大数据生态里几乎所有的计算引擎都是基于 HDFS 协议和 HDFS Client 构建的。
行式存储: 每一行 (Row) 的数据在文件的数据空间里连续存放的,读取整行的效率比较高,一次顺序 IO 即可。
列式存储: 每一列 (Column) 的数据在文件的数据空间里连续存放的,同列的数据类型一致,压缩编码的效率更好。
二、Parquet
Parquet 是一种开源的、面向列的数据文件格式,旨在实现高效的数据存储和检索。它提供了高效的数据压缩和编码方案,具有增强的性能,可以批量处理复杂的数据。Parquet 支持多种语言,包括 Java、C++、Python 等...
Parquet支持多种压缩算法:snappy、gzip、zstd。索引主要依赖 Min-Max Index 和 排序 来加速查找。
三、ORC
ORC是适用于 Hadoop 工作负载的最小、最快的列式存储。
ORC 是一种为 Hadoop 工作负载设计的自描述类型感知列文件格式。它针对大型流式读取进行了优化,但集成了对快速查找所需行的支持。以列格式存储数据使读者可以仅读取、解压缩和处理当前查询所需的值。
ORC 会给包括根节点在内的中间节点都创建一个 Column。索引支持 Clusterd Index,更快的主键查找;支持 Bitmap Index,更快的过滤。
四、Parquet vs ORC
- 从原理层面,最大的差别就是对于 NestedType 和复杂类型处理上
- Parquet 的算法上要复杂很多,带来的 CPU 的开销比 ORC 要略大
- ORC 的算法上相对简单,但是要读取更多的数据
- Parquet 在复杂 Schema 场景下的算法开销影响较大,在 Spark 场景下 Parquet 工作的更好;在 Hive 场景下,ORC 更好