Parquet 诞生记
本文是作者“构建开源标准的十年”系列博客的第一部分,回顾了列式存储格式 Parquet 的诞生历程与开源项目经验。
早期经历与灵感
作者于 2007-2011 年在 Yahoo! 工作,使用 MapReduce 和 Apache Pig。期间阅读了 Google 的 Dremel 论文,该论文描述了一种用于嵌套数据的列式存储格式和查询引擎,成为其后续工作的重要灵感来源。通过参与 Pig 社区,作者积累了开源项目经验并扩展了行业人脉。
Twitter 时期的技术挑战
2011 年,作者加入 Twitter 数据平台团队。当时平台主要依赖两个工具:
- Hadoop:可扩展性高、吞吐量大,但延迟高(MapReduce 相当于暴力处理)。
- Vertica:一种 MPP 数据库,采用列式存储和向量化处理,延迟低但成本高、扩展性有限。
这引出了一个核心问题:如何让 Hadoop 具备 Vertica 的列式存储优势?
列式布局的优势
传统的行式存储将每行数据依次存储,而列式存储将同一列的所有数据连续存储。列式存储的主要优势包括:
- 查询效率高:只需读取所需列的数据,减少磁盘寻址。
- 压缩率高:同一列的数据类型相似,更易压缩。
Red Elm:Parquet 的前身
作者在通勤途中开始原型开发,最初命名为 Red Elm(对 Dremel 的变位词),旨在实现 Dremel 论文中描述的列式分裂算法。他借鉴了 Twitter 使用的 Thrift 和 Pig 上下文以及其他现有格式(TFile、RCFile 等)。
合作与 Parquet 的诞生
作者意识到,要让项目可持续,必须与开源数据生态系统集成,而非仅作为 Twitter 的专有格式。通过推特分享,他联系上了同样在开发列式格式的 Cloudera Impala 团队。
- 互补优势:作者带来 JVM 生态兼容性;Cloudera 带来基于 LLVM 的分布式查询引擎。
- 合并设计:作者实现 Java 部分,Cloudera 实现 Impala 中的原生读取器,共同创建了 Parquet,名称寓意“数据库的底层布局”。
社区发展与行业采用
Parquet 发布后,多家公司迅速参与:
- Criteo 为 Hive 提供支持。
- Netflix 采用 Parquet 并为 Presto 提供支持。
- Apache Drill 将 Parquet 作为基础存储格式。
项目进入 Apache 孵化器,最终成为 Apache 顶级项目。随着 SparkSQL 构建于 Parquet 之上,它迅速达到“逃逸速度”,如今已成为所有主流数据仓库的标准格式。
开源项目的经验总结
作者从 Parquet 的发展中总结了三点关键经验:
- 每个贡献者都是利益相关者:尤其在定义标准格式的项目中,需确保贡献者拥有发言权和影响力,使其更负责任地参与。
- 雪球效应:开源项目初期像推石上山,但随着贡献者增加,项目会加速增长,最终达到“逃逸速度”,形成自增长的良性循环。
- 开源形态多样:开源不仅是代码公开,更涉及许可证、治理和基金会。关键点包括:
- 许可证:如 Apache 许可证(宽松,保护署名)与 GPL(具有“病毒性”,要求衍生作品同样开源)。
- 治理:明确决策机制、如何成为贡献者/维护者。加入 Apache 基金会等组织可保证中立性和治理最佳实践。
- 重要性:无论采用何种形式,关键是要明确使用规则和决策流程,管理好用户预期。
Parquet 的成功源于技术需求、跨公司合作、开源社区动力以及清晰的治理模式。