技术深度解析
列式存储的核心在于颠覆了数据的基本组织方式。传统的行式数据库(如MySQL或PostgreSQL)将单个记录的所有属性连续存储,而列式系统则将单个属性的所有值存储在一起。这一看似简单的反转,为分析和机器学习工作负载带来了深远优势。
其技术架构通常包含以下要素:
1. 列块与页面:数据被划分为列块(通常对应HDFS块或云存储对象),并进一步细分为页面——这是最小的I/O单元。每个页面包含压缩元数据、字典编码以及统计信息(最小值/最大值、空值计数),这些信息支持谓词下推过滤。
2. 编码方案:列式格式采用根据数据特征定制的复杂编码策略。游程编码(RLE)适用于已排序或低基数列,而字典编码则用紧凑的整数键替换重复值。差值编码存储连续值之间的差异,位打包技术则用于压缩整数范围。
3. 嵌套数据支持:Parquet等现代格式采用Google开发的Dremel编码方案,利用定义级别和重复级别来高效存储嵌套和重复结构,而无需将其扁平化——这对于ML应用中常见的类JSON特征数据至关重要。
4. 谓词下推与统计信息:文件级和页面级的统计信息允许查询引擎跳过整个数据段而无需读取。例如,对 `timestamp > '2024-01-01'` 的过滤器可以跳过最大时间戳早于此值的文件,从而大幅减少I/O。
性能优势是可量化的。以一个典型的分析查询为例,该查询从一个包含100列、10亿行的表中扫描10列:
| 存储格式 | 读取数据量 | 压缩比 | 查询时间(估算) |
|---|---|---|---|
| 行式(CSV/JSON) | 100%的数据(所有列) | 1:1(无压缩) | 120分钟 |
| 列式(Parquet)- 未压缩 | 10%的数据(仅所需列) | 1:1 | 12分钟 |
| 列式(Parquet)- 压缩 | 10%的数据 + 5:1压缩 | 5:1 | ~2.4分钟 |
数据要点:列式存储结合压缩,通过减少读取的数据量(列裁剪)及其物理大小(压缩),可为分析查询带来高达50倍的性能提升。
推动这一生态系统的关键开源项目包括:
- Apache Parquet:占主导地位的列式格式,拥有广泛的生态系统支持。`parquet-format` GitHub仓库定义了规范,已获得超过2.3k星标。
- Apache Arrow:提供内存中的列式格式,实现系统间的零拷贝数据共享。`arrow` 仓库已获得超过13k星标,使Pandas、Spark和TensorFlow等框架能够无需序列化开销即可交换数据。
- Apache ORC:为Hive工作负载优化,提供强大的ACID事务支持。虽然在云环境中不如Parquet占主导地位,但在Hadoop生态系统中仍然重要。
近期的进展主要集中在增强列式格式以应对AI特定工作负载。Parquet 2.9规范引入了对大型二进制对象(对存储嵌入向量和模型权重至关重要)的改进支持,以及对数值特征中常见的浮点数据更高效的编码。与此同时,像 lance(一种面向ML的列式数据格式,GitHub上3.8k星标)这样的项目正专为AI而兴起,提供对单个记录更快的随机访问能力——这是传统为顺序扫描优化的列式格式的一个弱点。
关键参与者与案例研究
列式存储革命在整个数据技术栈中创造了赢家,从基础设施提供商到利用该范式获取竞争优势的应用层公司。
基础设施主导者:
- Databricks:围绕Delta Lake(以Parquet作为底层格式)构建了Lakehouse架构,并结合了向量化查询引擎Photon。他们统一分析和ML的方法已吸引了超过10,000家客户。
- Snowflake:从头开始设计其平台,采用专为云对象存储优化的专有列式格式。其存储与计算分离的架构,结合微分区和聚类键,展示了列式组织如何实现弹性扩展。
- Google BigQuery:使用其内部列式格式Capacitor开创了无服务器数据仓库的先河。BigQuery每天为ML训练管道处理PB级数据,并通过自动后台优化(如重新聚类)来维持性能。
工具与平台创新者:
- Apache Spark:作为大数据分析的主导处理引擎,于2016年将Parquet采纳为其默认存储格式。Spark的Catalyst优化器生成执行计划,通过谓词下推、列裁剪和针对列式数据的向量化处理,最大化列式存储的优势。