什么是数据湖,为什么需要数据湖?
数据湖是一种存储系统,具有底层数据湖文件格式及其不同的数据湖表格式,可存储大量非结构化和半结构化数据,并按原样存储,但没有特定用途。广泛的技术和非技术数据消费者可以访问该数据以进行分析用例和机器学习模型,包括商业智能和报告。
数据湖还消除了通过传统 BI 工具转换数据需要使用专有格式的需要。将数据加载到数据湖中,数据团队花费时间构建和维护复杂 ETL 管道的旧瓶颈消失了,并且跳过了等待数周的数据访问请求。
有了数据湖,数据变得越来越可用,早期采用者发现他们可以通过为业务服务构建新应用程序来获取洞察力。数据湖支持使用多种不同类型的数据以低成本大规模捕获和存储原始数据。一种在顶层执行转换的可访问方式,即使最终需要哪些分析还不精确——主要是快速迭代转换并探索业务价值。
数据湖(2014 年的初始数据湖论文)可以基于多种技术构建,例如 Hadoop、NoSQL、Amazon Simple Storage Service、关系数据库,或各种组合和不同格式(例如 Excel、CSV、文本、日志、Apache Parquet、Apache Arrow、Apache Avro,稍后会详细介绍)。
每个数据湖都从一个简单的存储提供程序、一种数据湖文件格式开始,然后使用我们将在本文后面探讨的数据湖表格式扩展关键的类似数据库的功能。
数据湖、数据仓库 和 Lakehouse 之间有什么区别
那么从数据湖到Lakehouse有什么区别呢?Lakehouse是数据湖和数据仓库的组合(可能还有很多其他意见)。Lakehouse具有开放的数据管理架构,结合了数据湖的灵活性、成本效益和规模。与数据湖一样,它还具有数据湖表格式(Delta Lake、Apache Iceberg 和 Apache Hudi)提供的数据库功能。
与数据湖相比,Lakehouse具有额外的数据治理。它包括集群计算框架和 SQL 查询引擎。更多功能丰富的 Lakehouse 还支持数据目录和最先进的编排。
关于数据湖和Lakehouse请参阅有关现代数据基础架构的新兴架构的完整架构。
在现代数据基础设施的新兴架构中,Lakehouse架构越来越得到认可,并通过知名供应商(包括 AWS、Databricks、Google Cloud、Starburst 和 Dremio)和数据仓库先驱的采用情况验证了这点。 Lakehouse 的基本价值在于将强大的存储层与一系列强大的数据处理引擎(如 Spark、Presto、Apache Druid/Clickhouse 和 Python 库)适配。
为了结束Lakehouse与数据仓库进行比较,我们可以说:Lakehouse更开放(开放格式),并且随着更多的 DIY 和将不同工具,可以支持不同用例,而数据仓库更封闭(主要是闭源),为 BI 构建,完全托管,扩展成本更高。
Databricks 在 2021 年的 CIDR 论文中最先提出了Lakehosue的概念。
数据湖的组件
我们将在本部分讨论数据湖的三个主要组成部分。首先是物理存储数据的层,接下来有一个数据湖文件格式,它主要压缩数据以用于面向行或面向列的写入或查询,最后数据湖表格式位于这些文件格式之上,以提供强大的功能。
数据湖的演变:数据湖及其演变的简史:
- Hadoop & Hive:使用 MapReduce 的第一代数据湖表格式。支持 SQL 表达式。
- AWS S3:下一代简单数据湖存储。维护工作大大减少,并且具有出色的编程 API 接口。
- 数据湖文件格式:适用于云的文件格式,具有面向列、压缩良好并针对分析负载进行了优化。例如 Apache Parquet、ORC 和 Apache Avro格式。
- 数据湖表格式:Delta Lake、Apache Iceberg 和 Hudi,具有成熟的类数据库功能。
存储层/对象存储(AWS S3、Azure Blob Storage、Google Cloud Storage)
从存储层开始,我们拥有来自三大云提供商 AWS S3、Azure Blob Storage 和 Google Cloud Storage 的对象存储服务。 Web 用户界面易于使用,它的功能非常简单,事实上这些对象存储可以很好地存储分布式文件,它们还具有高度可配置性,内置了可靠的安全性和可靠性。
作为 Hadoop 的继承者,它们非常适合云中的非结构化和半结构化数据,AWS S3 是将任何格式的文件上传到云的事实上的标准。
数据湖文件格式(Apache Parquet、Avro、ORC)
数据湖文件格式更面向列,并使用附加功能压缩大文件。这里的主要参与者是 Apache Parquet、Apache Avro 和 Apache Arrow。它是物理存储,实际文件分布在存储层上的不同存储桶中。
数据湖文件格式有助于存储数据,在系统和处理框架之间共享和交换数据。这些文件格式具有其他功能,例如拆分能力和模式演变。
在选择哪种数据湖文件格式时,Apache Parquet 似乎更占优势。 Avro 也很好,因为它具有复杂的模式描述语言来描述数据结构并支持模式演变。
Schema Evolution 不太重要,因为下一章中的数据湖表格式也支持这些。
数据湖表格式
数据湖表格式非常有吸引力,因为它们是数据湖上的数据库。与表相同,一种数据湖表格式将分布式文件捆绑到一个很难管理的表中。可以将其视为物理数据文件之间的抽象层,以及它们的结构以形成表格。
想象一下一次插入数百个文件。它们是上述其中一种开源数据湖文件格式,可优化列存储并高度压缩,数据湖表格式允许直接从数据湖中高效地查询数据,不需要进行转换。
数据湖表格式是数据湖文件格式的引擎。文件格式擅长以压缩方式存储大数据并将其返回以进行面向列的分析查询,但是它们缺乏额外的特性,例如 ACID 事务和对关系数据库中每个人都知道的标准 ANSI SQL 的支持。借助数据湖表格式及其开源解决方案,我们可以获得这些想要的基本功能,并且还可以获得更多,如下一章所示。
问题:在采用数据湖表格式之前思考
- 哪种格式具有我需要的最先进和最稳定的功能
- 哪种格式使我能够使用 SQL 轻松访问我的数据?
- 哪种格式有动力和良好的社区支持?
- 哪种格式提供最强大的版本控制工具?
数据湖表格式的特点
如何使用所有三种重要格式共享的数据湖表格式功能将数据库功能添加到 S3。此外该功能还有助于遵循 GDPR 政策、跟踪和审计,以及删除请求的删除。
为什么所有这些功能都是必不可少的?想象一下需要将分析数据存储在 S3 上的 parquet 文件中。你需要对所有文件进行聚类,记录模式,同时读取和更新所有文件,找到一种备份和回滚的方法,以防你犯了错误,编写模拟更新或删除语句的繁重函数等等。这就是为什么会出现这些数据湖表格式,因为每个人都需要它们并创建了一个标准。
DML 和 SQL 支持:选择、插入、更新插入、删除
直接在分布式文件上提供合并、更新和删除。除了 SQL,有些还支持 Scala/Java 和 Python API。
向后兼容 Schema Evolution 和 Enforcement
自动模式演化是数据湖表格式的一个关键特性,因为改变格式仍然是当今数据工程师工作中的一个难题。 Schema Evolution 意味着在不破坏任何内容甚至扩大某些类型的情况下添加新列,甚至可以重命名或重新排序列,尽管这可能会破坏向后兼容性。不过我们可以更改一张表格,表格格式负责在所有分布式文件上切换它,最重要的是不需要重写表和基础文件。
ACID 事务、回滚、并发控制
ACID 事务确保所有更改都成功提交或回滚。确保永远不会以不一致的状态结束。有不同的并发控制,例如保证读取和写入之间的一致性。每种数据湖表格式在此处都有其他实现和功能。
时间旅行,带有事务日志和回滚的审计历史
随着时间的推移,数据湖表格式会版本化存储在数据湖中的大数据。您可以访问该数据的任何历史版本,通过易于审核简化数据管理,在意外写入或删除错误的情况下回滚数据,并重现实验和报告。时间旅行支持可重现的查询,可以同时查询两个不同的版本。
所有版本都使用时间旅行功能进行快照,它简化了其他复杂方法的实施,例如渐变维度(类型 2)。甚至可以像通常使用更改数据捕获 (CDC) 一样提取变更。
事务日志是每个事务自开始以来的有序记录。事务日志是通过上述许多功能使用的通用组件,包括 ACID 事务、可扩展的元数据处理和时间旅行。例如,Delta Lake 创建一个名为 _delta_log
的文件夹。
可扩展的元数据处理:这些表通过自动检查点和汇总来大规模处理大量文件及其元数据。
分区
分区和分区 Evolution 处理为表中的行生成分区值的繁琐且容易出错的任务,并自动跳过不必要的分区和文件。快速查询不需要额外的过滤器,表格布局可以随着数据的变化而更新。
文件大小调整、数据Clustering与压缩
可以在 Delta Lake 中使用 OPTIMIZE压缩数据,并通过 VACUUM 设置保留日期删除旧版本(其他数据湖表格式具有类似功能)。开箱即用支持数据压缩,您可以选择不同的重写策略,例如分箱或排序,以优化文件布局和大小。优化在解决小文件问题时特别有效,您会随着时间的推移摄取小文件,但查询数千个小文件很慢,优化可以将文件重新碎片化为更大的文件,从而在许多方面提高性能。
统一的批处理和流式处理
统一的批处理和流式处理意味着 Lambda 架构已过时。数据架构无需在批处理和流式中区分——它们都以相同的表结束,复杂性更低,速度更快。
无论是从流还是批处理中读取都没有关系。开箱即用的 MERGE 语句适用于更改应用于分布式文件的流式传输情况。这些数据湖表格式支持单个 API 和目标接收器。可以在 Beyond Lambda: Introducing Delta Architecture 或一些代码示例中看到很好的解释。
数据共享
减少数据重复的一个新的令人兴奋和需要的功能是数据共享。在 Delta 世界里,它被称为 Delta Sharing。 Snowflake 宣布他们也将在 Iceberg 表中具有此功能。据我了解这些是 Databricks 和 Snowflake 中的专有功能。
虽然用于安全数据共享的开源 Delta 共享协议使得与其他组织共享数据变得简单,无论他们使用哪种计算平台。
变更数据流 (CDF)
更改数据流 (CDF) 功能允许表跟踪表版本之间的行级更改。启用后,运行时会记录写入表中的所有数据的“更改事件”。 CDF 包括行数据和元数据,指示是否插入、删除或更新了指定的行。
数据湖表格式(Delta、Iceberg、Hudi)
现在我们有了开源数据湖表格式最显着的特点,让我们来看看已经提到过几次的三个最突出的产品:Delta Lake、Apache Iceberg 和 Apache Hudi。
Delta Lake
Delta Lake 是一个由 Databricks 创建的开源项目,并于 2019 年 4 月 22 日通过其首次公开的 GitHub Commit 开源。 最近宣布的 Delta Lake 2.0。
使用 Spark SQL 在 Delta Lake 中创建表的示例
--creating
CREATE TABLE default.people10m (id INT, firstName STRING, gender STRING ) USING DELTA PARTITIONED BY (gender)
LOCATION 's3a://my-bucket/delta/people10m'
--writing
INSERT INTO default.people10m VALUES (1, 'Bruno', 'M'), (2, 'Adele', 'F');
INSERT INTO default.people10m SELECT * FROM source
--reading
SELECT COUNT(*) > 0 AS 'Partition exists' FROM default.people10m WHERE gender = "M"
Apache Iceberg
Apache Iceberg 最初是在 Netflix 开发的,目的是使用 PB 级的大型表来解决长期存在的问题。 它于 2018 年作为 Apache 孵化器项目开源,并于 2020 年 5 月 19 日从孵化器毕业。他们的第一次公开提交是 2017 年 12 月 19 日——更多关于 Apache Iceberg 简介的故事的见解。
在 Apache Iceberg 中使用 Spark SQL 创建表的示例
--creating
CREATE TABLE local.db.table (id bigint, data string, category string)
USING iceberg
LOCATION 's3://my-bucket/iceberg/table/'
PARTITIONED BY (category)
--writing
INSERT INTO local.db.table VALUES (1, 'a'), (2, 'b'), (3, 'c');
INSERT INTO local.db.table SELECT id, data FROM source WHERE length(data) = 1;
--reading
SELECT count(1) as count, category FROM local.db.table GROUP BY category
Apache Hudi
Apache Hudi 最初于 2016 年在 Uber 开发(代号和发音为“Hoodie”),2016 年底开源(2016-12-16 首次提交),并于 2019 年 1 月提交给 Apache 孵化器。 关于 Apache 软件基金会的背景故事宣布 Apache® Hudi™ 为顶级项目。
在 Apache Hudi 中使用 Spark SQL 创建表的示例
--creating
create table if not exists hudi_table (id int, name string, price double)
using hudi options ( type = 'cow' )
partitioned by (name)
location 's3://my-bucket//hudi/hudi_table';
--writing (dynamic partition)
insert into hudi_table partition (name) select 1, 'a1', 20;
--reading
select count(*) from hudi_table
数据湖表格式比较:Delta Lake vs Apache Hudi vs Apache Iceberg
Delta Lake 在 GitHub 上的 star 最多,可能是 Delta Lake 2.0 发布以来最成熟的。 Apache Iceberg 和 Hudi 的 GitHub 贡献者比 Delta 多得多,Delta 大约 80% 来自 Databricks。
Hudi 开源时间最长,功能最多。 Iceberg 和 Delta 在最近的公告中势头强劲,Hudi 为流式处理提供了最大的便利,Iceberg 支持与数据湖文件格式(Parquet、Avro、ORC)的大多数集成。
Onehouse.ai 的读/写功能的全面概述:
Onehouse.ai 的数据湖表服务比较:
请查看完整的文章 Apache Hudi vs. Delta Lake vs. Apache Iceberg 以获得精彩而详细的功能比较,包括表服务和支持的平台和生态系统的插图。另外两个优秀的分别是 Dremio数据湖表格式比较,和 Hudi、Iceberg 和 Delta Lake:LakeFS 比较的数据湖表格式。
关于 Hudi 版本控制的有趣评论,其中 Hudi 支持不同的源系统,以及它如何基于提交并且可以为单个源系统维护。
数据湖市场趋势
随着最近在Snowflake峰会和数据与人工智能峰会上的公告,开源数据湖表格式市场火爆。 Snowflake 和 Databricks 宣布了 Apache Iceberg Tables(解说视频)的重要一步,将开源 Apache Iceberg 的功能与 Apache Parquet 相结合。 Databricks 开源了所有 Delta Lake,包括以前的高级功能,例如 Delta Lake 2.0 的 OPTIMIZE 和 Z-ORDER。
其他市场趋势正在进一步将数据湖表格式商业化,例如 Onehouse for Apache Hudi 以及 Starburst 和 Dremio 都推出了他们的 Apache Iceberg 产品。 4 月谷歌在今年早些时候宣布支持 BigLake 和 Iceberg,但它现在也支持 Hudi 和 Delta。
数据湖表格式有很大的发展空间;每个大供应商要么自己拥有一个,要么正在寻找完美的开源。到现在为止,你也应该明白为什么了。对我们有利的是所有这些技术都建立在开源数据湖文件格式(Apache Parquet、ORC、Avro)之上,这对我们所有人来说都是好消息。
如何将数据湖变成 Lakehouse
数据湖和Lakehouse的一个重要部分是数据治理。治理主要围绕数据质量、可观察性、监控和安全性,没有它将直接进入数据沼泽。
数据治理对大公司来说是一件大事。在这种情况下 Lakehouse 的实现和功能在这里有所帮助。这些专注于可靠性和强大的治理,并具有更多集成功能。但许多数据治理也设置了正确的流程和访问权限。让跨职能团队以透明的方式快速处理数据。
总结到目前为止的基本部分,从简单的 S3 存储扩展到成熟的Lakehouse,可以按照以下步骤操作:
- 选择合适的数据湖文件格式
- 将上述内容与要使用的最能支持您的用例的数据湖表格式相结合
- 选择要存储实际文件的云提供商和存储层
- 在 Lakehouse 之上和组织内部构建一些数据治理。
- 将数据加载到数据湖或Lakehouse中
替代方案或何时不使用数据湖或Lakehouse:如果需要数据库。不要使用 JSON 代替 Postgres-DB。当需要在不移动数据的情况下快速查询多个数据源时可以利用数据虚拟化技术。
总结
在本文中我们了解了数据湖和Lakehouse之间的区别。 2022 年市场在做什么,如何将数据湖变成数据湖。它的存储层、数据湖文件格式和数据湖表格式这三个层次都具有强大的功能,其中开源表格式有 Apache Hudi、Iceberg 和 Delta Lake。
另一个问题是如何在数据湖或Lakehouse中获取数据。 Airbyte 可以通过集成数据的 190 多个源连接器为您提供支持。假设想按照以下步骤动手构建数据湖。可以参考教程:关于使用 Dremio 构建开放数据 Lakehouse;使用Delta Lake 表格格式将数据加载到 Databricks Lakehouse 并运行简单分析。