作者 | 吴刚 云器科技 Lakehouse 技术专家
随着 Data+AI 技术的快速演进迭代,湖仓一体架构(Lakehouse)已经成为当前数据平台的事实标准。本文将简要概述数据平台的发展史,阐述湖仓架构产生的必然性。再从开放性的角度出发,探讨 Lakehouse 架构的选型,以及为什么开放式湖仓设计(Open Lakehouse)会是湖仓一体架构的最终归宿。
湖仓一体的诞生
我们先来看下湖仓一体架构出现之前,数据平台经过了怎样的发展。根据 CCSA TC601 大数据技术标准推进委员会发布的《湖仓一体技术与产业研究报告(2023 年)》显示,数据平台架构持续演进主要经历了数据库、数据仓库、数据湖三个阶段,它们各自都有明显的优缺点:
既然数据仓库和数据湖有着非常明显的优缺点(见上表),就短暂地诞生过一种“湖仓混合”架构(见下图),企业将数据湖和数据仓库结合起来,以充分发挥它们各自的优势。例如,企业可以使用数据湖作为数据的原始存储和数据探索的平台,而将数据仓库用于数据集成、数据清洗和高性能的分析查询。但是,"数据湖 + 数据仓库"混合架构也有着明显的缺点:
由于现有架构中的数据仓库和数据湖有着各种各样的问题,湖仓一体架构就应运而生了,接下来我们来看看什么是湖仓一体。
湖仓一体是什么
Databricks 公司在 CIDR 2021 发表论文首次正式提出了 Lakehouse 的概念 ,但实际上湖仓一体的概念并非由单一个体提出,而是随着技术的发展和需求的变化逐渐形成的,下图分别列举了国外主流厂商对 Lakehouse 的理解。
与"湖 + 仓"混合架构简单地把数据湖和数据仓库进行简单的堆积不同,湖仓一体架构(Lakehouse)是一种新兴的数据架构,将数据湖和数据仓库的特点融合在一起。它旨在解决传统数据湖和数据仓库各自的局限性,并提供更强大的数据管理和分析能力。湖仓一体架构的特点如下:
湖仓一体架构通过将数据湖和数据仓库的优势结合起来,提供了更灵活、可扩展和强大的数据管理和分析能力。它适用于各种数据场景,包括实时分析、机器学习、数据探索和报表等。
传统数据仓库和数据湖的老玩家,演进到湖仓一体架构有两个主要方向:一是“湖上建仓”,即在数据湖的基础上构建数据仓库,保留数据湖的灵活性和可扩展性,同时引入数据仓库的治理和分析能力,典型的例子是 Databricks 和开源 Hadoop 体系;二是“仓外挂湖”,即在数据仓库外部挂载数据湖,让数据湖成为数据仓库的一个数据源,以便企业更好地利用数据湖中的数据,典型的例子是 Amazon Redshift、Google BigQuery、阿里云 MaxCompute。由此可见,湖仓一体技术的发展,旨在融合数据湖和数据仓库的优势,形成一种更强大、灵活且易于管理的数据管理架构。通过湖仓一体,企业可以更好地处理和分析各种数据类型,实现数据价值的释放,因此湖仓一体架构已经成为当代大数据平台的事实标准。
湖仓一体发展趋势
随着用户场景和业务需求的不断变化,湖仓一体架构在发展过程中也出现了新的趋势。Dremio 在 2023 年发表的论文《The Data Lakehouse: Data Warehousing and More》中,提出 Lakehouse 是一个与具体实现无关的模块化湖仓一体架构:
模块化的湖仓一体架构,核心模块包括以下几个方面:
模块化的设计让湖仓一体架构更加清晰和可解释,这个观点与 Voltron Data(开源项目 Apache Arrow 背后的商业公司)提出的 Composable Codex 不谋而合。
Voltron Data 联合 Meta 和 Databricks 发表在 VLDB 23 上的论文《The Composable Data Management System Manifesto》指出,不仅模块化是数据系统的正确发展方向,基于开放标准和开源模块构建的数据系统才是未来,可以带来很多好处:
开放式湖仓才是未来
传统数据仓库对用户最大的困扰是很容易被运营商锁定(Vendor Lock-in),通常有以下几个原因:
湖仓一体架构发展到今天,其最吸引人的一个特点就是就是数据开放性,这是因为其独特的模块化设计带来的:
值得一提的是,有些厂商声称自己是“开放式”湖仓一体架构,但所谓的“开放”实际是存算分离架构的“开放”,其实是与开放式湖仓一体混为一谈。存算分离是一种大数据处理架构,它将存储和计算节点分开,数据节点负责数据的存储和管理,而计算任务则由单独的计算节点来负责执行。相对于传统的存算一体架构,存算分离架构设计使得系统能够扩展到更大规模的并发能力和数据容量。相较于湖仓一体架构的开放数据设计,存算一体架构只是把数据放在了存储节点上,并没有保证数据的开放性(如使用开源表格式 Apache Iceberg,或者开源文件格式 Apache Parquet 等),因此并不能认为存算分离架构也是开放的。
随着人工智能(AI)和大语言模型(LLM)的热潮,AI 给数据平台带来新的挑战:AI 需要更丰富的数据,数据需要更多样的 BI+AI 应用。Data 与 AI 的关系不再是 Data+AI,而是 Data*AI ——数据平台不再是一对一的计算和存储架构,而是 m 对 n 关系的架构。这样的架构改变变化下,数据平台的架构更应有兼具一体化与开放性的设计。开放式湖仓一体架构,是面向 Data+AI 融合场景的新趋势。
云器开放式湖仓的设计理念
我们(云器科技)是一家新兴的数据平台服务提供商,主打多云及一体化的数据平台服务。我们依照 Open Lakehouse 的设计理念,实现了一套完整的系统,并服务多家头部客户。存储层设计兼容各种主流的开放存储格式,确保与广泛的数据环境的无缝集成:
文章前半部分讲述了 Open Lakehouse 的架构优势、设计目标和原则。文章后半部分,重点介绍我们在实现过程中的设计、取舍和经验总结。
云器开放式湖仓的设计实践
拥抱 Apache Iceberg 打造开放生态
Apache Iceberg、Apache Hudi 和 Delta Lake 是当前数据湖领域中的三种主要表格式,它们都在努力成为数据湖的标准表格式,这种竞争有时被形象地称为"Table Format War"。这三种表格式都是开源的,拥有非常好的生态,背后都有一个商业公司在支持。云器认为重复再造一个新的表格式的轮子并不能让 Lakehouse 更加地开放,因此选择一个最合适的表格式,围绕它构建 Lakehouse 的内置表格式,打造一个开放的生态是对用户最负责任的方案。
为什么是 Apache Iceberg
来自 Tabular(Apache Iceberg 背后的商业公司)的 Brian Olsen 在 2023 年 7 月发表了一篇文章 Iceberg won the table format war,他认为 Apache Iceberg 已经在这场表格式的竞争中取得了胜利。其观点基本符合我们的看法,也是云器科技选择使用 Apache Iceberg 作为开放存储底座的原因:
如何基于 Apache Iceberg 构建通用的增量存储
云器 Lakehouse 使用 Apache Iceberg 表格式,以及 Apache Parquet 文件格式,打造了一个能够实时兼容 Apache Iceberg 标准的存储文件布局,其元数据通过完全兼容 Iceberg 的 catalog 进行输出,天然兼容所有支持消费 Apache Iceberg 的开源框架,如 Apache Spark 和 Trino 等。由于所有云器 Lakehouse 内表输出的数据文件都是以 Apache Parquet 格式存放在云对象存储上,元数据完全兼容 Apache Iceberg,用户真正拥有自己的数据资产,无需担心 Lock-in 的风险。
前面提到过增量计算模式依赖增量存储,这也是通过 Apache Iceberg 实现的。具体来说,基于 Snapshot Isolation 使用 Apache Iceberg V2 标准引入的 Position Delete File 来表示增量数据。由于 Position Delete File 只能表示数据的删除,我们需要把 Update 拆分成经典的 Delete+Insert 模式,这样的设计对数据有三个挑战:
围绕 Apache Parquet 锤炼极致性能
对于 Lakehouse 的引擎来说,一个 SQL 查询始于读(TableScan)终于写(TableSink)。如果说开放的表格式决定了 Lakehouse 的能力下限,那合适的文件格式则可以决定 Lakehouse 的性能上限。在大数据领域,Apache Parquet 和 Apache Orc 基本就是列存格式的实施标准。两者曾一度各占半壁江山,但现在就像 DuckDB 作者 Hannes 回答社区问题时说的,似乎 Apache Orc 已经被用得越来越少了。那在 Apache Parquet 越来越独领风骚的今天,是不是无脑选择它就能高枕无忧了?
事实并非如此,Parquet 标准其实是一个基于 Thrift 协议定义的文件格式,其中包含很多可选的字段,这为后面的问题埋下了伏笔:
尽管 Parquet 有各种各样的问题,它仍然是当前大数据文件格式的事实标准,在开放存储这个大前提下,也没有什么好纠结的。既然 Parquet 是开源的,是不是挑一个开源实现拿来用就好了?很多引擎和框架都实现了自己的 Parquet 读写模块,但由于前面提到的问题,要么功能不全,要么性能不佳,基本没有能直接拿来用。早在云器 Lakehouse 选型文件格式的时候(2022 年初),C++ 的开源 Parquet 实现只有 Apache Arrow、Apache Impala 和 DuckDB 三家,其中后两者都只实现了 V1 的功能;而 Apache Arrow 中的 Parquet C++ 代码是 Parquet 社区捐赠的,V2 的功能也实现了一部分,但仍然缺少 Predicate Pushdown、Page Index 和 Bloom Filter 等重要功能,并且内部测评的性能也不及预期,无法直接使用。
Community Over Code
纵观国外的一些友商,Velox 和 Databricks 开发了自己的 Native C++ Parquet 实现,而 Snowflake、BigQuery 和 ClickHouse 则都是基于 Apache Arrow 中的 Parquet C++ 实现来完成 Parquet 的拼图。虽然从头开发一套 Parquet 实现的确能够获得最佳的定制和性能,但也需要付出大量重复劳动,也可能会掉进一些前人踩过的坑。既然 Apache Parquet 是一个开源的标准,没有任何秘密,而 Apache Arrow 已经被友商广泛使用,那直接基于 Apache Arrow 中的 Parquet 代码来实现云器 Lakehouse 的文件格式,也符合云器 Lakehouse 追求最佳开放性的设计理念。与此同时,云器科技也决定投入到社区当中,补全 Parquet 缺失的功能,并且深度优化性能,从而真正成为社区的一部分。
主要贡献
云器科技对 Parquet 社区的贡献,主要涉及了 Apache 软件基金会旗下两个顶级项目 Apache Parquet 和 Apache Arrow 的三个 GitHub 仓库:
上面两张图基本涵盖了云器科技在 Parquet 社区中最主要的贡献,团队两名成员也因此被 Apache Parquet 和 Apache Arrow 社区提名为 Committer。云器科技对开源社区的投入不会停止,团队成员在 2023 年 8 月北京举行的“Apache Software Foundation 旗下大会 - Community Over Code Asia 2023”上分享了参与开源项目的心得,后续仍会深耕社区,把我们认为有价值的功能贡献回社区,让更多的用户受益。
总 结
本文回顾和分析了数据湖仓的历史和大数据平台的演进趋势,提出了基于增量计算的一体化趋势,以及该架构必然需要一个开放式的增量存储支撑。基于 Single Engine · All Data 理念云器发布了一体化数据平台——云器 Lakehouse,并分享了如何围绕 Apache Iceberg 和 Apache Parquet,来构建开放湖仓之上的增量存储,获得最佳开放性和极致性能。同时云器科技也大力投入开源社区,以合作共赢的姿态践行构建 Open Lakehouse 的设计理念。
作者简介:
吴刚,云器科技,Lakehouse 技术专家。目前是 Apache ORC 的 PMC,也是 Apache Arrow 和 Apache Parquet 的 committer。在此之前,曾是阿里巴巴的高级技术专家,负责 MaxCompute 的存储系统,也曾在 Uber 负责 Apache Spark 平台。
选择哪种编程语言已经不重要了,只提倡程序员下班后“多看看书”提升竞争力是误人子弟|独家专访亚马逊 CTO
一代更比一代强,AI 时代的至强如何为云服务保驾护航?
寻找增长,SaaS 企业选择上飞书
离开云转战 AI?23 岁写了百万人用的开源软件,这个 IT 奇才 11 年后离开了自己的上市公司