你曾经是否有构建一个开源数据湖来存储数据以进行分析需求?

数据湖包括哪些组件和功能?

不了解 Lakehouse数据仓库 之间的区别?

或者只是想管理数百到数千个文件并拥有更多类似数据库的功能但不知道如何操作?

本文解释了数据湖的细节以及哪些技术可以构建一个Lakehouse,以避免创建没有结构和孤立文件的数据沼泽。 并讨论数据湖的分析能力以及如何构建,我们将介绍何时不使用数据湖以及有哪些替代方案。

随着 Databricks 开源了完整的 Delta Lake 2.0,包含了很多高级功能以及 Snowflake 宣布集成 Iceberg 表,市场现在很火爆。

什么是数据湖,为什么需要数据湖?

数据湖是一种存储系统,具有底层数据湖文件格式及其不同的数据湖表格式,可存储大量非结构化和半结构化数据,并按原样存储,但没有特定用途。广泛的技术和非技术数据消费者可以访问该数据以进行分析用例和机器学习模型,包括商业智能和报告。

数据湖还消除了通过传统 BI 工具转换数据需要使用专有格式的需要。将数据加载到数据湖中,数据团队花费时间构建和维护复杂 ETL 管道的旧瓶颈消失了,并且跳过了等待数周的数据访问请求。

有了数据湖,数据变得越来越可用,早期采用者发现他们可以通过为业务服务构建新应用程序来获取洞察力。数据湖支持使用多种不同类型的数据以低成本大规模捕获和存储原始数据。一种在顶层执行转换的可访问方式,即使最终需要哪些分析还不精确——主要是快速迭代转换并探索业务价值。

数据湖(2014 年的初始数据湖论文)可以基于多种技术构建,例如 Hadoop、NoSQL、Amazon Simple Storage Service、关系数据库,或各种组合和不同格式(例如 Excel、CSV、文本、日志、Apache ParquetApache ArrowApache Avro,稍后会详细介绍)。

每个数据湖都从一个简单的存储提供程序、一种数据湖文件格式开始,然后使用我们将在本文后面探讨的数据湖表格式扩展关键的类似数据库的功能。

数据湖、数据仓库 和 Lakehouse 之间有什么区别

那么从数据湖到Lakehouse有什么区别呢?Lakehouse是数据湖和数据仓库的组合(可能还有很多其他意见)。Lakehouse具有开放的数据管理架构,结合了数据湖的灵活性、成本效益和规模。与数据湖一样,它还具有数据湖表格式(Delta LakeApache IcebergApache 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的概念。

数据湖的组件

我们将在本部分讨论数据湖的三个主要组成部分。首先是物理存储数据的层,接下来有一个数据湖文件格式,它主要压缩数据以用于面向行或面向列的写入或查询,最后数据湖表格式位于这些文件格式之上,以提供强大的功能。

数据湖的演变:数据湖及其演变的简史:

  1. Hadoop & Hive:使用 MapReduce 的第一代数据湖表格式。支持 SQL 表达式。
  2. AWS S3:下一代简单数据湖存储。维护工作大大减少,并且具有出色的编程 API 接口。
  3. 数据湖文件格式:适用于云的文件格式,具有面向列、压缩良好并针对分析负载进行了优化。例如 Apache Parquet、ORC 和 Apache Avro格式。
  4. 数据湖表格式: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.0OPTIMIZEZ-ORDER

其他市场趋势正在进一步将数据湖表格式商业化,例如 Onehouse for Apache Hudi 以及 StarburstDremio 都推出了他们的 Apache Iceberg 产品。 4 月谷歌在今年早些时候宣布支持 BigLakeIceberg,但它现在也支持 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 并运行简单分析

Lakehouse架构指南的更多相关文章

  1. NET 架构指南频道

    NET 架构指南频道 微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软 ...

  2. 译:微软发布.NET应用架构指南草案

    原文<Microsoft Announces Draft .NET Architecture Guidance> 译注:上周微软发布了全新的<.NET应用架构指南>草案,以征求 ...

  3. 免费开源《OdooERP系统部署架构指南》试读:第一章 Odoo架构概述

    文/开源智造联合创始人老杨 本文来自<OdooERP系统部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 从web浏览器到PostgreSQL,多层与其他层交互以处理 ...

  4. 《开源自主OdooERP部署架构指南》试读:第二章数据库服务构建

    文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 使用apt.postgresql.org 您可以选择使用 ...

  5. SequoiaDB 架构指南

    1 简介 SequoiaDB(巨杉数据库)是一款分布式非关系型文档数据库,可以被用来存取海量非关系型的数据,其底层主要基于分布式,高可用,高性能与动态数据类型设计,与当前主流分布式计算框架 Hadoo ...

  6. .NET微服务 容器化.NET应用架构指南(支持.NET Core2)

    介绍 企业通过使用容器,日益实现成本节约.解决部署问题并改进 DevOps 和生产操作. 通过创建 Azure 容器服务.Azure Service Fabric 等产品,同时与 Docker.Mes ...

  7. App开发架构指南(谷歌官方文档译文)

    这篇文章面向的是已经掌握app开发基本知识,想知道如何开发健壮app的读者. 注:本指南假设读者对 Android Framework 已经很熟悉.如果你还是app开发的新手,请查看 Getting ...

  8. 《容器化.NET应用架构指南》脑图学习笔记(第一部分)

    一.关于这本官方“圣经” 作为.NET程序员,对于微软官方推动的架构示例总是特别关注,从PetShop到MusicStore再到eShopOnContainers,每一次关注,都会了解到业界最新的架构 ...

  9. 微软在.NET官网上线.NET 架构指南频道

    微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软给这个参考应用写了完善 ...

  10. 【转】 微软在.NET官网上线.NET 架构指南

    原文地址:http://www.cnblogs.com/shanyou/p/6676357.html. 微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://g ...

随机推荐

  1. 国产PLM软件在创新实践中强势崛起

    近日,"璞华PLM"先后获得微度医疗.埃特斯等多个客户的订单,即使在疫情环境下也展现出了强劲的高速增长.在产品生命周期管理(PLM,Product Lifecycle Manage ...

  2. CSS之垂直水平居中的背后

    最开始,我想说,这个体系有点大,我写的并不好.就当作是一个思路吧,虽然这个思路有点乱.几乎每一个实现方案的背后都是该属性及其组合的原理,每一个都要剖析其规范细节的话,这篇文章绝不会是这样的篇幅,所以每 ...

  3. eclipse最常应用的几个快捷键,新手必看!

    首先eclipse快捷键可以使用 Ctrl + Shift + L 打开,在这里可以查看所有快捷键. 另外就是常用的几个快捷键 选中光标所在行 好像没有,但是可以 Ctrl + d 然后 Ctrl + ...

  4. Kubernetes 安全

    RBAC 权限控制 对资源对象的操作都是通过 APIServer 进行的,那么集群是怎样知道我们的请求就是合法的请求呢?这个就需要了解 Kubernetes 中另外一个非常重要的知识点了:RBAC(基 ...

  5. K8S概念理解

    Master 负责管理集群 负责协调集群中的所有活动,例如调度应用程序,维护应用程序的状态,扩展和更新应用程序. Worker节点是VM(虚拟机)或物理计算机,充当k8s集群中的工作计算机. 每个Wo ...

  6. 使用shell做http web接口,可以传递参数--废弃

    此文章废弃,参考另一篇 参考网址: https://me.jinchuang.org/archives/114.html https://www.cnblogs.com/jinchuang/p/142 ...

  7. tcp_tw_recycle参数引发的故障

    文章转载自:https://blog.csdn.net/wireless_tech/article/details/6405755 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反 ...

  8. redis监控规则

    其他说明参考host主机监控规则:https://www.cnblogs.com/sanduzxcvbnm/p/13589848.html groups: - name: Redis monitori ...

  9. Multi-View Intent Disentangle Graph Networks for Bundle Recommendation解读

    简要论述 bundle recommendation 的目的是向user推荐一个整体的bundle package about items.以前的模型捕获了user对item and item关联的偏 ...

  10. Vu3.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定

    观前须知:本人演示使用的input是自己手敲的,如果使用的是element-ui等表单组建的input框请选择性参考,不保证我的方法对你们也完全有效. 父组件代码: 这里我的MiniInput是以组件 ...