第1章介绍了数据湖仓的概念,它结合了传统数据仓库和数据湖的最佳元素。在本书中,您学到了支持湖仓架构的五个关键功能:存储层、数据管理、SQL分析、数据科学和机器学习,以及勋章架构。在深入探讨在Delta Lake上构建湖仓之前,让我们快速回顾一下行业数据管理和分析的演进:
- 数据仓库:从1970年代到21世纪初,数据仓库的设计旨在将数据收集和 consolida 到业务背景中,为业务智能和分析提供支持。随着数据量的增长,速度、多样性和真实性也在增加。数据仓库在以灵活、统一和经济的方式解决这些要求方面存在挑战。
- 数据湖:在21世纪初,数据量的增加推动了数据湖的发展(最初在Hadoop上以及后来在云上),这是一个成本效益的中央存储库,可以以任何规模存储任何格式的数据。但是,即使带来了额外的好处,仍然存在额外的挑战。数据湖没有事务支持,不适用于业务智能,提供有限的数据治理支持,并且仍然需要其他技术(例如数据仓库)来充分支持数据生态系统。这导致了一个过于复杂的环境,其中包含不同的工具、系统、技术和多份数据的拼贴。
- 湖仓:在2010年代末,湖仓的概念出现了。这引入了数据仓库的现代化版本,提供了所有的优势和功能,而不会影响数据湖的灵活性。湖仓利用了低成本、灵活的云存储层,结合了数据湖,并通过支持ACID事务的技术提供了数据的可靠性和一致性保证。这种灵活性有助于支持流处理、分析和机器学习等多样的工作负载,所有这些工作负载都在单一的统一平台下实现,最终实现对所有数据资产的单一安全性和治理方法。随着Delta Lake和湖仓的出现,由于这种架构模式启用的关键特性,端到端数据平台的范式已经开始发生变化。
通过将湖仓的能力与本书学到的内容相结合,您将学习如何启用湖仓架构提供的关键功能,并完全上手Delta Lake。
存储层
在任何设计良好的架构中,第一步或第一层是决定在哪里存储您的数据。在一个不断增加的数据量以不同形式和形状从多个异构数据源进入的世界中,有一个允许以灵活、经济且可扩展的方式存储大量数据的系统是至关重要的。这就是为什么像数据湖这样的云对象存储是湖仓的基础存储层的原因。
什么是数据湖?
如前述于第1章中定义的,数据湖是一个经济高效的中央存储库,可存储任何规模的结构化、半结构化或非结构化数据,以文件和数据块的形式存在。这在数据湖中是可能的,因为在写入数据时它不强制使用模式,所以数据可以按原样保存。数据湖使用扁平的体系结构和对象存储来存储数据,与数据仓库不同,数据仓库通常将数据存储在具有目录和文件的分层结构中并强制使用模式。每个对象都附带有元数据和唯一标识符,以便应用程序可以轻松访问和检索。
数据的类型
结构化数据:结构化数据具有预定义的结构或模式。这种数据通常是关系数据库中以表格形式呈现的,包含行和列。
半结构化数据:半结构化数据不符合典型的关系格式,而是以模式或标签松散结构化,例如键/值对。半结构化数据的示例包括Parquet、JSON、XML、CSV文件,甚至电子邮件或社交媒体信息。
非结构化数据:非结构化数据不包含有组织的结构,没有任何模式或模板。它通常以媒体文件的形式呈现,例如照片(例如JPEG)或视频文件(例如MP4)。组成视频的数据本身是非结构化的。
非结构化和半结构化数据通常对于AI和机器学习用例至关重要,而结构化和半结构化数据对于BI用例至关重要。由于Delta Lake本地支持这三种数据分类,因此可以创建一个支持数据湖中这些多样化工作负载的统一系统。这些工作负载可以在设计良好的处理架构中相互补充,您将在本章的后面学到更多内容。数据湖有助于解决与数据量、类型和成本相关的许多挑战,而Delta Lake在数据湖之上运行,优化为在云数据湖上最佳运行。
云数据湖的关键优势
云数据湖相对于本地数据湖或数据仓库有助于最好地支持湖屋架构的存储层,原因如下:
- 单一存储层: 湖屋的最重要特征之一是统一平台,云数据湖有助于消除和 consol 种数多的数据孤岛和不同类型的数据到一个单一的对象存储中。云数据湖允许您在单一系统上处理所有数据,防止在不同系统之间来回传输数据的额外复制。数据在不同系统之间的移动减少,也意味着错误发生的地方更少。单一存储层减少了需要覆盖不同系统的多个安全策略,并有助于解决在系统之间进行协作时的困难。它还为数据消费者提供了一个查找所有数据源的单一位置。
- 灵活的按需存储层: 无论是速度(流式处理还是批处理)、容量还是种类(结构化还是非结构化),云数据湖都允许以最终的灵活性存储数据。根据Rukmani Gopalan在他最近出版的书《云数据湖》中的说法,"这些系统设计用于处理以任何速度进入数据湖的数据:连续发射的实时数据以及按计划定期摄入的大量数据。" 不仅数据灵活,基础设施也很灵活。云提供商允许您按需配置基础设施,并迅速弹性地扩展或缩小。由于这种程度的灵活性,组织可以拥有一个提供无限可扩展性的单一存储层。
- 解耦的存储和计算: 传统的数据仓库和本地数据湖通常具有紧密耦合的存储和计算。存储通常是廉价的,而计算则不是。云数据湖允许您解耦这一点,并独立扩展存储,以极低的成本存储大量数据。
- 技术集成: 数据湖通过标准化的API提供简单的集成,因此具有完全不同的技能、工具和编程语言的组织和用户(例如SQL、Python、Scala等)可以同时执行不同的分析任务。
- 复制: 云提供商提供了易于设置的数据湖到不同地理位置的复制。启用复制的简便性使其在满足合规性要求、业务关键操作的故障转移、灾难恢复以及通过将对象存储在不同位置降低延迟方面非常有用。
- 可用性: 大多数云系统为云数据湖提供不同类型的数据可用性。这意味着对于很少访问的或已归档的数据,与频繁访问的"热"数据相比,您可以设置生命周期策略。这些生命周期策略允许您将数据移动到不同的存储可用性类别(对于很少访问的数据有更低的成本),以满足合规性、业务需求和成本优化。
- 成本: 使用云数据湖,您通常按使用付费,因此您的成本始终与您的数据量保持一致。由于只有一个存储层,数据在不同系统之间的移动减少,可用性设置和存储与计算解耦,因此您只需为数据存储支付隔离和最小化的费用。对于更大的成本分配,大多数云数据湖提供桶或容器(文件系统,不要与应用程序容器混淆)来存储数据的不同层次(例如原始与转换数据)。这些容器允许您对组织的不同区域进行更精细的成本分配。由于数据源和数据量呈指数级增长,因此在不限制可以存储的数据的体积或种类的情况下,非常重要的是分配和优化成本。
图10-1展示了在撰写本文时流行的云数据湖的不同类型,以及存储在其中的不同类型的数据。
总的来说,存储层是湖屋架构的关键组成部分,因为它使组织能够以经济高效和可扩展的方式存储和管理大量数据。现在您已经有了一个明确定义的存储数据的地方,接下来需要适当地管理它。
数据管理
尽管云数据湖允许弹性地以其原生格式存储大规模数据,但湖屋架构的下一部分是促进数据管理。根据Gartner的定义,数据管理(DM)包括在企业中跨数据主题区域和数据结构类型的全谱中实现对数据一致访问和交付的实践、架构技术和工具,以满足所有应用程序和业务流程的数据消耗需求。数据管理对于任何组织都是关键的功能,很大程度上取决于在数据访问和交付中使用的工具和技术。传统上,数据湖将数据简单地管理为半结构化格式(例如Parquet)中的"一堆文件",这使得难以实现数据管理的一些关键功能,例如可靠性,由于缺乏对ACID事务、模式强制执行、审计跟踪以及数据集成和互操作性的支持。
数据湖上的数据管理始于可靠性的结构化事务层。这种可靠性来自支持ACID事务、开放表格格式、批处理和流处理数据处理之间集成以及可伸缩的元数据管理的事务层。这就是Delta Lake作为湖屋架构的核心组件引入的地方,支持数据管理。在图10-2中,您可以看到云数据湖支持的不同数据类型,Delta Lake建立在数据湖之上,充当结构化事务层。
Delta Lake为您的数据湖带来耐久性、可靠性和一致性。Delta Lake有几个关键元素有助于促进数据管理:
元数据:Delta Lake的核心是元数据层。这一层提供了广泛且可扩展的元数据跟踪,使Delta Lake的大多数核心功能得以实现。它提供了一种抽象层,以实施ACID事务和各种其他管理功能。这些元数据层也是启用治理功能(例如访问控制和审计日志记录)的自然场所。
ACID事务:Delta Lake将确保在单个表上存在并发事务时,数据保持完整。对ACID事务的支持为数据湖带来一致性和可靠性,这是通过事务日志实现的。事务日志跟踪所有提交,并使用隔离级别保证数据的一致性和准确的数据视图。
版本控制和审计历史:由于Delta Lake将有关哪些文件属于表的信息存储为事务日志,它允许用户查询旧版本的数据并执行回滚,也称为时间旅行。这为业务需求或法规要求提供了数据的完整审计跟踪,并且还可以支持机器学习过程。
数据集成:这可以定义为将不同来源的数据 cons 收集到单一位置。Delta Lake可以处理表上的并发批处理和流处理操作;它为用户提供了查看数据的单一位置。不仅如此,执行INSERT、UPDATE和DELETE等DML操作的能力使您能够执行有效的数据集成并在所有表上保持一致性。
模式强制执行和演变:与传统的RDBMS系统一样,Delta Lake提供了模式强制执行以及灵活的模式演变。这有助于通过约束保证数据的清洁和一致的数据质量,同时为由其他进程和上游来源引起的模式漂移提供了灵活性。
数据互操作性:Delta Lake是一个与云无关的开源框架,由于它通过提供一组API和扩展与Apache Spark无缝交互,因此在项目、其他API和平台之间具有大量不同的集成能力。这使您能够通过不同的工具和框架轻松集成现有的数据管理工作流和流程。Delta UniForm与Apache Iceberg提供格式互操作性,进一步扩展了可以集成的系统和工具的范围。与使数据跨组织安全共享变得简单的Delta Sharing一起,Delta Lake避免了供应商锁定,并实现了互操作性。
机器学习:因为机器学习(ML)系统通常需要处理大量数据并使用传统SQL不太适用于的复杂逻辑,它们现在可以轻松地使用Delta Lake的DataFrame API访问和处理数据。这些API允许ML工作负载直接受益于Delta Lake提供的优化和功能。现在可以将所有不同工作负载的数据管理集中到Delta Lake中。
通过添加一个更适合处理数据管理的结构化事务层,湖屋同时支持原始数据、为分析策划数据的ETL/ELT流程以及ML工作负载。通过Delta Lake提供的数据管理功能对数据进行整理的ETL/ELT传统上被认为是在数据仓库的背景下进行的,但通过Delta Lake,您可以将这些过程集中到一个地方。这也使ML系统能够直接受益于Delta Lake提供的功能和优化,以完成跨不同工作负载的数据管理和整合。通过结合所有这些努力,您可以为数据湖带来更大的可靠性和一致性,并创建一个在企业中成为所有类型数据的单一真相来源的湖屋。
SQL分析
在数据分析、商业智能和数据仓库领域,通常被认为 SQL 是最常见且灵活的语言之一。部分原因不仅在于它提供了易于学习的曲线和低门槛的入口,还因为它能执行复杂的数据分析操作。SQL 不仅允许用户快速与数据互动,还让各技能水平的用户编写即席查询、为 BI 工具准备数据、创建报告和仪表板以及执行各种数据分析功能。由于这样的原因,SQL 已成为从数据工程师到业务用户等所有人的商业智能和数据仓库首选的语言。这也是湖屋架构在可伸缩性和性能方面实现出色 SQL 性能并实现 SQL 分析的原因。
幸运的是,以 Delta Lake 为事务层的湖屋架构具有可伸缩的元数据存储,可通过 Apache Spark 和 Spark SQL 轻松访问。
通过 Spark SQL 进行 SQL 分析
Spark SQL 是 Apache Spark 的一个模块,也被称为库,用于处理结构化数据。它提供了一个编程接口,使用 SQL 和 DataFrame API 处理结构化数据,所有这些都由 Spark SQL 引擎支持。与其他 SQL 引擎类似,Spark SQL 引擎负责生成高效的查询和紧凑的代码。这个执行计划在运行时进行调整。Apache Spark 生态系统由不同的库组成,其中 Spark Core 和 Spark SQL 引擎是它们构建的基础(图 10-3)。
Spark SQL 库支持 ANSI SQL,允许用户使用他们熟悉的 SQL 语法查询和分析数据。正如我们在前几章中看到的,Delta 表可以使用 Spark SQL 和 PySpark 中的 sql() 方法轻松查询,例如:
perl
%python
spark.sql("SELECT count(*) FROM taxidb.tripData")
或者,类似于本书中的大多数查询的编写方式,您可以在笔记本或某些集成开发环境 (IDEs) 中使用魔术命令和 %sql
来指定语言引用,然后直接在单元格中编写 Spark SQL:
sql
%sql
SELECT count(*) as count FROM taxidb.tripData
不仅如此,Spark SQL 库还允许您使用 DataFrame API 与数据集和表进行交互:
matlab
%python
spark.table("taxidb.tripData").count()
分析师、报告生成者和其他数据使用者通常会通过 SQL 接口与数据进行交互。这个 SQL 接口意味着用户可以利用 Spark SQL 在 Delta 表上执行简单或复杂的查询和分析,充分利用 Delta 表提供的性能和可扩展性,同时还能利用 Spark SQL 引擎、分布式处理和优化。由于 Delta Lake 确保了串行性,因此完全支持并发读取和写入。这意味着所有数据使用者可以在通过不同的 ETL 工作负载更新数据的同时自信地读取数据。简而言之,Spark SQL 引擎生成一个执行计划,用于优化和执行查询,使查询尽可能快速。
图 10-4 说明您可以使用 Spark SQL 库表达 SQL 查询,或者您可以使用 DataFrame API 与数据集交互,并利用 Spark SQL 引擎和执行计划。无论是使用 Spark SQL 还是 DataFrame API,Spark SQL 引擎都会生成一个查询计划,用于优化和执行在集群上的命令。
一般来说,建议在 ETL 和数据摄取过程3或机器学习工作负载中使用 DataFrame API,而大多数数据使用者(例如分析师、报告生成者等)将使用 Spark SQL 与 Delta 表进行交互。您还可以通过标准的 JDBC/ODBC 数据库连接器或使用命令行与 SQL 接口进行交互。JDBC/ODBC 连接器意味着 Spark SQL 还提供了与 Power BI、Tableau 和其他 BI 工具等外部工具进行交互和使用表进行分析的桥梁。
通过其他 Delta Lake 集成进行 SQL 分析
尽管 Delta Lake 强大地集成了 Spark SQL 和 Spark 生态系统的其他组件,但它也可以被许多其他高性能的查询引擎访问。支持的查询引擎包括:
- Apache Spark
- Apache Hive
- Presto
- Trino 这些连接器有助于将 Delta Lake 引入到除了 Apache Spark 之外的大数据 SQL 引擎,并允许您进行读取和写入(取决于连接器)。Delta Lake 连接器存储库包括:
- Delta Standalone,用于读取和写入 Delta Lake 元数据的本地库
- 与流行的大数据引擎(如 Apache Hive、Presto、Apache Flink)和常见报告工具(如 Microsoft Power BI)的连接器。 还有一些托管服务,允许您集成并从 Delta Lake 读取数据,包括:
- Amazon Athena 和 Redshift
- Azure Synapse 和 Stream Analytics
- Starburst
- Databricks 请查阅 Delta Lake 网站以获取完整支持的查询引擎和托管服务列表。 在进行 SQL 分析时,重要的是利用高性能的查询引擎,它可以解释 SQL 查询并针对 Delta 表执行大规模的数据分析。在图 10-5 中,您可以看到 lakehouse 由三个不同的叠加层组成,以及允许不同层之间进行通信的 API:
- 存储层 用于结构化、半结构化和非结构化数据的可扩展、低成本的云数据存储的数据湖。
- 事务层 符合 ACID 标准的开放表格式,通过 Delta Lake 实现可伸缩的元数据。
- API SQL API 允许用户访问 Delta Lake 并执行读取和写入操作。然后,元数据 API 帮助系统理解 Delta Lake 事务日志以适当地读取数据。
- 高性能查询引擎 一种解释 SQL 的查询引擎,使用户可以通过 Apache Spark SQL 或 Delta Lake 集成的其他查询引擎执行数据分析。
数据科学和机器学习的数据
由于Delta Lake有助于在您的lakehouse中提供可靠且简化的数据管理,因此它对于用于数据科学活动和机器学习的数据及数据管道带来了各种好处。
传统机器学习存在的挑战
一般来说,机器学习运营(MLOps)是涉及端到端机器学习生命周期的一组实践和原则。在MLOps中,许多组织和数据科学家在试图在其组织中构建并最终将机器学习模型投产时面临一些常见挑战:
- 数据孤立 数据孤立通常在数据工程活动和数据科学活动之间的差距不断扩大时开始形成。数据科学家经常花费大部分时间创建单独的ETL和数据管道,清理和转换数据,并将其准备成模型所需的特征。这些孤立通常会因为用于数据工程的工具和技术不支持数据科学家进行相同的活动而形成。
- 批处理和流处理数据的整合 机器学习模型使用历史数据来训练模型,以便在流式数据上进行准确预测。问题在于传统体系结构不支持可靠地组合历史数据和流数据,这在将两种类型的数据输入到机器学习模型中时会产生挑战。
- 数据量 机器学习系统通常需要处理大量数据,并使用复杂的代码,这不一定适用于SQL。如果数据科学家希望通过ODBC/JDBC接口从通过数据工程管道创建的表中消耗数据,这些接口可能会创建一个非常低效的过程。这些低效的过程主要是因为这些接口设计为与SQL一起工作,并对非SQL代码逻辑提供有限的支持。这导致非SQL查询的低效,可能是由于数据量、数据转换和非SQL代码逻辑通常包含的复杂数据结构。
- 可复现性 MLOps最佳实践包括需要重现和验证ML工作流的每个阶段。重现模型的能力降低了错误的风险,并确保ML解决方案的正确性和鲁棒性。在可复制性中面临的最困难的挑战是一致的数据,只有在使用完全相同的数据时,ML模型才会重现完全相同的结果。由于数据随时间不断变化,这可能对ML可重现性和MLOps引入重大挑战。
- 非表格数据 尽管我们通常认为数据存储在表格中,但越来越多的机器学习工作负载用于支持大量的非表格数据,如文本、图像、音频、视频或PDF文件。这些非表格数据需要与表格数据相同的治理、共享、存储和数据探索功能。如果没有某种功能来编目这些目录和非表格数据的集合,很难提供与表格数据一样的治理和管理功能。
由于传统体系结构对将机器学习模型投产引入了挑战,机器学习往往变得非常复杂且孤立。这些孤立的复杂性为数据管理引入了更多挑战。
支持机器学习的Delta Lake功能
Delta Lake通过多种功能来支持机器学习生命周期,有助于弥补传统上由机器学习活动引入的数据管理挑战,并弥合用于BI/报告分析和高级分析的数据和流程之间的差距。以下是 Delta Lake 提供的几个支持机器学习生命周期的不同功能:
- 优化和数据量: Delta Lake建立在Apache Spark之上,数据科学活动可以直接通过Spark SQL使用DataFrame API从Delta Lake表中访问数据,从而使机器学习工作负载能够直接受益于Delta Lake提供的优化和性能增强。
- 一致性和可靠性: Delta Lake提供ACID事务,确保数据一致性和可靠性。这对于机器学习和数据科学工作流程非常重要,因为模型的训练和预测需要这种可靠性,以避免来自不准确或不一致数据的负面影响。
- 整合批处理和流处理数据: Delta Lake表可以无缝处理来自历史和流处理源的持续数据流,这是通过Spark Streaming和Spark Structured Streaming实现的。这意味着您可以简化用于机器学习模型的数据流程,因为这两种类型的数据被整合到单个表中。
- 模式强制执行和演进: 默认情况下,Delta Lake表具有模式强制执行,这意味着可以强制执行更好的数据质量,从而提高用于机器学习输入的数据的可靠性。但是,Delta Lake还支持模式演进,这意味着数据科学家可以轻松地向现有的机器学习生产表中添加新列,而无需破坏现有的数据模型。
- 版本控制: 正如您在先前章节中了解到的,Delta Lake允许您轻松为数据进行版本控制并通过事务日志执行时间旅行。这种版本控制有助于减轻通常在ML可再现性中看到的一些挑战,因为它允许您在特定时间点轻松重新创建机器学习实验和模型输出。这有助于显着减少在MLOps过程中遇到的一些挑战,因为简化的版本控制可以提供更大的可追溯性、可重现性、审计和ML模型的合规性。
- 集成: 在第1章和本章中,您了解到Delta Lake可以通过Apache Spark中的Spark SQL库进行访问。您还在第8章中了解到了Spark Streaming和Delta Lake与该库的集成。 Spark生态系统中的另一个库是MLlib。 MLlib为您提供对常见学习算法、特征化、流水线、持久性和实用程序的访问。实际上,许多机器学习库(例如TensorFlow、scikit-learn)也可以利用DataFrame API来访问Delta Lake表。
Spark生态系统由在Spark Core之上运行的多个库组成,为所有类型的数据和分析用例提供了多功能的支持。除了Spark标准库之外,Spark还与其他平台(例如MLflow,这是一个用于管理端到端机器学习生命周期的流行开源平台)进行集成,该平台允许跟踪、记录和复制Spark MLlib模型。
正如前面提到的,机器学习模型通常是使用诸如TensorFlow、PyTorch、scikit-learn等库构建的。尽管Delta Lake不是直接用于构建模型的技术,但它专注于解决并为许多机器学习活动面临的挑战提供有价值的基础支持。MLOps 和模型依赖于Delta Lake 提供的数据质量和完整性、可再现性、可靠性以及数据的统一性。Delta Lake 提供的强大数据管理和集成功能简化了 MLOps,并使机器学习工程师和数据科学家能够更轻松地访问和处理用于训练和部署模型的数据。
将一切整合在一起
通过Delta Lake启用的功能,可以更轻松地统一机器学习和数据工程的生命周期。Delta Lake使机器学习模型能够从历史(批量)和流式数据中学习和预测,所有这些数据都来自一个地方,同时本地利用Delta表的优化。ACID事务和模式强制有助于为用于机器学习模型输入的表提供数据质量、一致性和可靠性。Delta Lake的模式演进有助于机器学习输出随时间变化,而不会对现有流程引入破坏性变化。时间旅行功能使轻松审计或重现机器学习模型成为可能,并且Spark生态系统提供了额外的库和其他机器学习生命周期工具,以进一步支持数据科学家。
在图10-7中,您可以看到完全构建的lakehouse环境的所有结果层。总的来说,Delta Lake的特性有助于弥合数据工程师和数据科学家之间的鸿沟,以减少信息孤岛并统一工作负载。借助Delta Lake和健壮的lakehouse架构,组织可以更快、更高效地构建和管理机器学习模型。