第1章介绍了数据湖仓的概念,它结合了传统数据仓库和数据湖的最佳元素。在本书中,您学到了支持湖仓架构的五个关键功能:存储层、数据管理、SQL分析、数据科学和机器学习,以及勋章架构。在深入探讨在Delta Lake上构建湖仓之前,让我们快速回顾一下行业数据管理和分析的演进:
通过将湖仓的能力与本书学到的内容相结合,您将学习如何启用湖仓架构提供的关键功能,并完全上手Delta Lake。
在任何设计良好的架构中,第一步或第一层是决定在哪里存储您的数据。在一个不断增加的数据量以不同形式和形状从多个异构数据源进入的世界中,有一个允许以灵活、经济且可扩展的方式存储大量数据的系统是至关重要的。这就是为什么像数据湖这样的云对象存储是湖仓的基础存储层的原因。
如前述于第1章中定义的,数据湖是一个经济高效的中央存储库,可存储任何规模的结构化、半结构化或非结构化数据,以文件和数据块的形式存在。这在数据湖中是可能的,因为在写入数据时它不强制使用模式,所以数据可以按原样保存。数据湖使用扁平的体系结构和对象存储来存储数据,与数据仓库不同,数据仓库通常将数据存储在具有目录和文件的分层结构中并强制使用模式。每个对象都附带有元数据和唯一标识符,以便应用程序可以轻松访问和检索。
结构化数据:结构化数据具有预定义的结构或模式。这种数据通常是关系数据库中以表格形式呈现的,包含行和列。
半结构化数据:半结构化数据不符合典型的关系格式,而是以模式或标签松散结构化,例如键/值对。半结构化数据的示例包括Parquet、JSON、XML、CSV文件,甚至电子邮件或社交媒体信息。
非结构化数据:非结构化数据不包含有组织的结构,没有任何模式或模板。它通常以媒体文件的形式呈现,例如照片(例如JPEG)或视频文件(例如MP4)。组成视频的数据本身是非结构化的。
非结构化和半结构化数据通常对于AI和机器学习用例至关重要,而结构化和半结构化数据对于BI用例至关重要。由于Delta Lake本地支持这三种数据分类,因此可以创建一个支持数据湖中这些多样化工作负载的统一系统。这些工作负载可以在设计良好的处理架构中相互补充,您将在本章的后面学到更多内容。数据湖有助于解决与数据量、类型和成本相关的许多挑战,而Delta Lake在数据湖之上运行,优化为在云数据湖上最佳运行。
云数据湖相对于本地数据湖或数据仓库有助于最好地支持湖屋架构的存储层,原因如下:
图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 不仅允许用户快速与数据互动,还让各技能水平的用户编写即席查询、为 BI 工具准备数据、创建报告和仪表板以及执行各种数据分析功能。由于这样的原因,SQL 已成为从数据工程师到业务用户等所有人的商业智能和数据仓库首选的语言。这也是湖屋架构在可伸缩性和性能方面实现出色 SQL 性能并实现 SQL 分析的原因。
幸运的是,以 Delta Lake 为事务层的湖屋架构具有可伸缩的元数据存储,可通过 Apache Spark 和 Spark 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() 方法轻松查询,例如:
%python
spark.sql("SELECT count(*) FROM taxidb.tripData")
或者,类似于本书中的大多数查询的编写方式,您可以在笔记本或某些集成开发环境 (IDEs) 中使用魔术命令和 %sql
来指定语言引用,然后直接在单元格中编写 Spark SQL:
%sql
SELECT count(*) as count FROM taxidb.tripData
不仅如此,Spark SQL 库还允许您使用 DataFrame API 与数据集和表进行交互:
%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 强大地集成了 Spark SQL 和 Spark 生态系统的其他组件,但它也可以被许多其他高性能的查询引擎访问。支持的查询引擎包括:
由于Delta Lake有助于在您的lakehouse中提供可靠且简化的数据管理,因此它对于用于数据科学活动和机器学习的数据及数据管道带来了各种好处。
一般来说,机器学习运营(MLOps)是涉及端到端机器学习生命周期的一组实践和原则。在MLOps中,许多组织和数据科学家在试图在其组织中构建并最终将机器学习模型投产时面临一些常见挑战:
由于传统体系结构对将机器学习模型投产引入了挑战,机器学习往往变得非常复杂且孤立。这些孤立的复杂性为数据管理引入了更多挑战。
Delta Lake通过多种功能来支持机器学习生命周期,有助于弥补传统上由机器学习活动引入的数据管理挑战,并弥合用于BI/报告分析和高级分析的数据和流程之间的差距。以下是 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架构,组织可以更快、更高效地构建和管理机器学习模型。
这个湖仓的设计理念围绕着统一的概念,将不同技术的最佳元素融合到一个地方。这意味着湖仓内部的数据流也很重要,需要支持数据的这种统一。为了支持所有用例,这个数据流需要将批处理和流处理数据合并成一个单一的数据流,以支持整个数据生命周期中的各种情况。
第一章介绍了勋章架构的概念,这是一种流行的数据设计模式,包含青铜、白银和黄金层,最终通过Delta Lake实现。这一流行的模式用于以迭代的方式组织湖屋中的数据,以提高整个数据湖中数据的结构和质量,每一层在分析中具有特定的功能和目的,同时统一批处理和流处理数据流。勋章架构的示例见图10-8。
图10-8中显示的青铜、白银和黄金层在表10-1中有简要概述。对于每个层次,您将看到其商业价值、属性以及实施细节(例如“如何完成”)。
在接下来的部分中,您将更详细地了解构成勋章架构的不同层次。
从数据源提取的原始数据被摄取到青铜层,没有经过任何转换或业务规则强制执行。这一层是我们原始数据的“着陆区”,因此,该层中的所有表结构与源系统结构完全对应。数据源的格式保持不变,因此当数据源是CSV文件时,它以CSV文件的形式存储在青铜层,JSON数据以JSON格式写入,依此类推。从数据库表中提取的数据通常以Parquet或AVRO文件的形式落入青铜层。
在这一点上,不需要模式。随着数据的摄取,会维护详细的审计记录,其中包括数据源、是否执行了完整或增量加载以及支持需要的增量加载的详细水印。青铜层包括一个归档机制,以便数据可以长时间保留。这个归档和详细的审计记录可以在勋章架构下游的某个地方发生故障时用于重新处理数据。
摄取的数据以“源系统镜像”的形式落入青铜层,保持源系统格式的结构和数据类型,尽管通常会增加额外的元数据,如加载日期和时间以及ETL过程系统标识符。摄取过程的目标是将源数据迅速、轻松地着陆在青铜层,只需足够的审计和元数据以启用数据血缘和重新处理。
青铜层通常用作变更数据捕获(CDC)过程的源,允许新到达的数据通过白银层和黄金层立即进行处理。
在白银层,我们首先对数据进行清理和规范化。我们确保使用标准格式,如日期和时间,强制执行公司的列命名标准,去重数据,并在需要时执行一系列附加的数据质量检查,删除低质量的数据行。
接下来,相关的数据被合并和融合。Delta Lake的合并功能非常适用于此目的。例如,来自各种来源(销售、CRM、POS系统等)的客户数据被合并成一个单一实体。已经在不同主题领域中重复使用的数据实体(称为协同数据)被识别并在视图中进行规范化。在先前的例子中,合并的客户实体就是这种协同数据的一个例子。
在这一点上,数据的组合企业视图开始显现出来。请注意,我们在这里应用了“刚刚好”的理念,即我们提供足够的细节,付出最少的努力,确保我们保持对构建勋章架构的敏捷方法。
在这一点上,我们开始强制执行模式,并允许模式在下游演变。白银层也是我们可以应用GDPR和/或PII/PHI执行规则的地方。
由于这是强制执行数据质量并创建企业视图的第一层,它对业务非常有用,特别是对于自助分析和临时报告等目的。白银层被证明是机器学习和人工智能用例的出色数据源。事实上,这些类型的算法在白银层的“较不完善”数据中的表现比黄金层中的消耗格式更好。
在黄金层,我们创建业务级别的聚合。这可以通过标准的Kimball星型模式、Inmon雪花模式维度模型,或者适用于消费者业务用例的任何其他建模技术来实现。在这里应用数据变换和数据质量规则的最终层,产生高质量、可靠的数据,可作为组织中的单一真相源。
黄金层通过向下游用户和应用提供高质量、干净的数据,持续提供业务价值。黄金层的数据模型通常包括数据的许多不同视角或视图,具体取决于使用情况。黄金层将实施多种Delta Lake优化技术,例如分区、数据跳过和Z-ordering,以确保以高性能的方式交付质量数据。
经过优化,以便由BI工具、报告、应用程序和业务用户进行最佳消费,这成为使用高性能查询引擎读取数据的主要层。
一旦您在基于Delta Lake的体系结构中实施了勋章架构,您就可以开始看到湖仓的全部优势和可扩展性。在本章构建湖仓的过程中,您已经看到了不同层次如何相互补充,以统一整个数据平台。
图10-9展示了整个湖仓的情况,包括它在勋章架构下的外观。虽然勋章架构并非是湖仓中数据流的唯一设计模式,但它是最受欢迎的之一,而且理由充分。通过Delta Lake启用的功能,最终使勋章架构支持在单一数据流中统一批处理和流处理工作负载、机器学习、业务级别的聚合以及全面的分析,适用于所有角色。
在本书中,您了解到开放表格格式的出现,Delta Lake的开源标准为数据湖带来了可靠性、可扩展性和整体更好的数据管理。通过克服许多传统技术的局限性,Delta Lake有助于弥合传统数据仓库和数据湖之间的差距,为组织带来了以湖仓形式的单一统一的大数据管理平台。
Delta Lake继续改变组织存储、管理和处理数据的方式。其强大的功能,如ACID事务、数据版本控制、流处理和批处理事务支持、模式强制执行以及性能调整技术,使其成为数据湖中事实上的开放表格格式的选择。
在撰写本文时,Delta Lake是全球范围内被广泛采用的湖仓格式,每月下载数以百万计,并拥有庞大的不断增长的社区贡献者。随着贡献者实力的增强和对Delta Lake的采用不断增长,Delta生态系统不断扩大,随着大数据领域的整体演变,Delta Lake的功能也将自然而然地得到扩展,这要归功于其开放源代码格式和开源社区的贡献。
Delta Lake和湖仓范式的持续崛起在数据平台和数据管理的演进中构成了一个重要的里程碑。Delta Lake提供了在当今数据驱动的世界中实现规模成功所需的功能和特性,而湖仓则提供了一个统一、可扩展的架构来支持它。Delta Lake和湖仓将继续在简化架构和推动不断增长的数据和技术生态系统中发挥关键作用。
阅读量:1404
点赞量:0
收藏量:0