在现代云计算环境中,数据仓库模型通常包括一个基于云存储账户(如Azure Data Lake Storage Gen2)的数据湖和一个数据仓库计算引擎,例如Azure的Synapse Dedicated Pools或AWS的Redshift。这些服务虽然在用法和特性上有所不同,但基本上遵循类似的架构概念。
在这种架构中,关键主题包括将数据摄入到云存储层,特别是数据湖的“原始”区域。这些数据是未类型化、未转换的,并且没有进行任何清理。批量数据通常以CSV文件的形式出现。
然后,处理器在数据湖区域中清理和转换数据,从原始数据开始,经过丰富、修改(其他人可能知道这种模式为铜/银/金)。在丰富的阶段,数据被清理、去重等,而在策划阶段,创建汇总输出,包括事实和维度,都在数据湖中。
然后,管理区被送入像Synapse Dedicated SQL Pools这样的云数据仓库,它们作为BI工具和分析师的服务层。这种模式非常普遍,可能是在领域中看到最多的一种。
缺乏事务支持、难以强制执行数据质量、在数据湖中合并添加、更新和删除的困难。这可能导致数据湖本身的数据管理问题,导致数据沼泽而不是数据湖。它有多个存储层——数据湖中的不同区域和文件类型,以及数据仓库本身内部,通常还有BI工具中。
简而言之(这有点过于简化,但对于本文来说足够了),Lakehouse的主要主题是两件事——Delta Lake和数据湖与数据仓库没有区别,它们是同一件事。
Delta Lake是Lakehouse模式的秘诀,它试图解决Databricks文件中突出的问题。Delta Lake是一个开源项目,它使数据湖能够直接在数据湖上实现数据仓库功能,并在下面的图片中很好地总结。
Delta Lake为数据湖提供了ACID(原子性、一致性、隔离性和持久性)事务,允许在数据湖中运行安全和完整的事务,就像在数据库中一样。Delta为管理这些。像时间旅行这样的功能允许像通过时间戳或版本(类似于SQL时间表)一样查询以前状态的数据。
Delta允许表同时作为批处理和流处理的接收器/发送器。以前,必须创建复杂的lambda架构模式,使用不同的工具和方法——有了Delta,可以将其统一为一个更简单的架构。没有单独的数据仓库和数据湖。
模式强制允许定义具有约束、数据类型等的类型化表,确保数据是干净、结构化,并与特定数据类型对齐。CRUD——使用Delta编辑、添加和删除数据要容易得多。
对于那些不知道Synapse是什么的人——简而言之,它是一个在Azure上运行的统一的云原生分析平台,根据用例和用户技能提供不同的服务和工具。这些范围从SQL池到Spark引擎到图形ETL工具等。
Synapse Pipelines(本质上是Synapse伞下的Data Factory)是一个图形ELT/ELT工具,允许编排、移动和转换数据。可以从大量来源拉取数据,将其摄入、转换和加载到Lakehouse。关于Lakehouse特别地,Synapse Pipelines允许利用Delta Lake格式使用内联数据集类型,这允许利用Delta的所有好处,包括upsert、时间旅行、压缩等。
就Lakehouse模式而言,Synapse Spark允许使用选择的语言(SQL、Scala、Pyspark、C#)开发基于代码的数据工程笔记本。对于那些喜欢代码驱动的ELT/ELT开发的人来说,Spark是一个优秀且多功能的平台,允许结合代码(例如,在pyspark中执行强大的转换,然后切换到SQL并对同一数据执行SQL样式的转换)并通过Synapse Pipelines运行笔记本。
像Synapse Pipelines一样,Synapse Spark使用Spark运行时3.2,包括Delta Lake 1.0。这将允许利用Delta提供的所有选项。
想提到的最后一个主要服务是SQL池——特别是无服务器SQL池——在Lakehouse模式中。Synapse已经有专用SQL池的概念,它们是为服务层设计的大规模并行处理(MPP)数据库引擎。
然而,在Lakehouse中,不使用专用SQL池。相反,使用Synapse中的另一个SQL池产品,无服务器SQL池。这些非常适合Lakehouse,因为它们是按查询付费的,而不是总是带有计算的。它们通过在数据湖上创建一个T-SQL层来工作,允许编写查询并创建每个湖的外部对象,然后外部工具可以消费这些对象。就Lakehouse而言,无服务器SQL池支持Delta格式,允许在这些Delta结构上直接创建外部对象,如视图和表。
以上展示了如何将这些服务转化为使用Synapse平台和Delta Lake的端到端架构。简而言之,有——以批处理或流的形式接收数据,写入数据湖。这些数据以原始格式如CSV从数据库或JSON从事件源输入。直到进一步丰富之前都不使用Delta。
Synapse Spark和/或(不是二元选择)Synapse Pipelines用于将数据从原始转换为丰富,然后修改。使用哪个工具取决于和主要取决于用例和用户偏好。清理和转换后的数据以Delta格式存储在丰富和策划区域,因为这是最终用户将访问Lakehouse的地方。
底层存储是Azure Data Lake Storage Gen 2,这是为分析优化的Azure云存储服务,并与所有使用的服务本地集成。在丰富/策划中创建Delta表,然后通过SQL Serverless对象如视图和表暴露。这允许SQL分析师和BI用户使用熟悉的SQL端点分析数据和创建内容,该端点指向在湖上的Delta表。
数据湖区域是一个过渡层,可能存在也可能不存在。它通常用作每日配给的临时转储,然后才摄入到原始层。在后者中,经常看到数据以追加方式存储在子文件夹中,例如:
在原始之后,现在看到丰富和策划区域现在以Delta格式存在。这充分利用了Delta,更重要的是,创建了一个允许数据通过DeltaAPI被其他工具访问/编辑/使用的元数据层。
现在,将做一个快速的演示,总结更详细的方法——特别是如何在Synapse中使用Lakehouse模式摄取、转换和服务数据。