首页 > 数据库 > 数据库开发技术 > 湖仓一体的管理引擎分析
前面已经有几篇文章介绍了湖仓一体出现的原因和优势,详细参见《数据平台:湖仓一体、流批一体、存算分离的核心问题及原因解析》、《云原生湖仓一体的优势和挑战》、本文详细介绍一下湖仓一体的关键组件以及技术。
01
—
湖仓一体诞生的由来
湖仓一体(Lakehouse)的概念最初是由Databricks公司提出的,该公司是由Apache Spark的创始人之一成立的。Lakehouse是Databricks提出的将数据湖(Data Lake)和数据仓库(Data Warehouse)融合在一起的概念,旨在解决传统数据仓库和数据湖之间的差异和限制。
Databricks团队于2019年在Spark + AI Summit上首次提出了Lakehouse的概念,并在之后的时间中推动其发展。他们认为,传统数据仓库和数据湖各有优势,但由于差异性,数据管理和分析变得复杂。Lakehouse通过将数据湖和数据仓库的特点相结合,提供一种统一且综合的数据管理和分析解决方案。
Databricks的Lakehouse概念在业界引起了广泛的关注和讨论,越来越多的组织开始关注和采用湖仓一体的建设方案。同时,也有其他公司和开源社区推动湖仓一体概念的发展,并提供相应的解决方案和工具。
数据仓库和数据湖的特性区别如下图所示:
| 特性 | 数据仓库 | 数据湖 |
| 数据来源 | 来自事务系统、运营数据库和业务线应用程序的关系数据 | 来自 IoT 设备、网站、移动应用程序、社交媒体和企业应用程序的非关系和关系数据 |
| 数据结构 | 结构化 | 非结构化 |
| Schema | 设计在数据仓库实施之前(写入型 Schema) | 写入在分析时(读取型 Schema) |
| 存储成本 | 更快查询结果会带来较高存储成本 | 更快查询结果只需较低存储成本 |
| 数据质量 | 可作为重要事实依据的高度监管数据 | 任何可以或无法进行监管的数据(例如原始数据) |
| 用户 | 业务分析师 | 数据科学家、数据开发人员和业务分析师 |
| 用途 | 批处理报告、BI 和可视化 | 机器学习、预测分析、数据发现和分析 |
而数据仓库和数据湖处理数据的方式造成了,数据仓库数据处理类型是BASE,而数据湖处理数据的类型是ACID。
02
—
数据湖和数据仓库数据处理区别
而数据仓库和数据湖处理数据的方式造成了,数据仓库数据处理类型是BASE,而数据湖处理数据的类型是ACID。数据仓库的数据处理模式是BASE的,大家应该都比较清楚了,那么数据湖的数据处理类型为什么需要是ACID的和事务性数据库一样了?
数据湖处理数据之所以需要ACID(原子性、一致性、隔离性和持久性)的特性,是因为ACID可以确保数据在处理过程中的完整性和可靠性,避免数据出现错误或丢失的情况。 如果数据湖处理数据不具备ACID特性,可能会出现以下问题:
1. 原子性问题:如果处理过程中发生了部分错误,没有原子性的机制进行回滚,数据可能会出现不一致的情况,从而影响后续数据的分析和使用。
2. 一致性问题:多个同时进行的数据处理操作可能会导致数据不一致的情况,例如同时对同一个数据进行写入和更新操作,没有一致性的机制会导致数据被覆盖或者出现冲突。
3. 隔离性问题:多个同时进行的数据处理操作可能会相互干扰,导致数据处理结果错误。如果没有隔离性的机制,可能会导致数据错乱、重复或者丢失。
4. 持久性问题:如果没有持久性的机制,数据处理过程中的中间结果可能会丢失,从而无法进行后续的分析和使用。
综上所述,ACID的特性可以确保数据湖处理过程中的数据完整性和可靠性,避免数据出现错误或丢失的问题,从而提高数据处理的可信度和可用性。
以下是ACID和BASE的区别:
| 特性 | ACID | BASE |
| 数据结构 | 模式Schema必须存在、表结构必须存储、数据的类型是确定的 | 模式Schema是动态的、表结构在运行中调整、存储不同的数据类型 |
| 一致性 | 强一致性可用 | 最终一致性,不追求一致性 |
| 处理焦点 | 事务 | 键值存储 |
| 处理模式 | 行/列 | 宽列存储 |
| 是否事务 | 是 | 不一定 |
03
—
湖仓一体主要的管理引擎分析
前面介绍了数据仓库和数据湖各自的优势和数据处理的区别,为了融合两者的优势而诞生的湖仓一体目前主要的管理引擎主要是:Iceberg、Hudi、Delt Lake。为什么说他们是管理引擎了,不是计算引擎和存储引擎了?因为这些引擎本身不提供分析数据的功能,也不是存储引擎,因为他们不提供存储数据的能力。提供分析能力的计算引擎例如Flink,Spark、Streams等,提供存储引擎的例如S3,OSS、HDFS、Azure、云等存储。
一、Iceberg
1、事务性写入:Iceberg 支持事务性写入,保证数据一致性。当写入操作发生时,数据会先被写入到新的数据文件中,然后再被写入到元数据中,确保数据的一致性和可靠性。
2、原子性更新:Iceberg 支持原子性的更新操作,可以对数据表中的数据进行原子性的更新,保证数据的一致性。
3、快照隔离:Iceberg 提供了快照隔离的能力,不同的读操作可以读取到不同时间点的数据快照,确保读操作之间的隔离性。
4、基于文件的存储和检索:Iceberg 使用文件格式存储数据,可以支持高效的数据存储和检索。Iceberg 使用列式存储和数据压缩等技术来减少存储空间和提高查询性能。
5、版本控制和元数据管理:Iceberg 支持版本控制和元数据管理,可以跟踪表中数据的变化,并提供详细的元数据信息,方便数据的管理和查询。
6、数据分区和分桶:Iceberg 支持数据的分区和分桶,可以按照指定的列对数据进行分区和分桶,以提高查询效率和减少扫描数据的量。
7、模式演化:Iceberg 支持模式的演化,可以在不停机的情况下对表的模式进行更新和修改,方便数据的迭代和演进。
总的来说,Iceberg 提供了一套高效、可靠、可扩展的数据管理能力,使得数据湖更容易使用和管理,降低了数据管理的复杂性。
二、Hudi
1、ACID事务能力,支持实时入湖和批量入湖。Hudi 提供事务支持,确保写入或更新操作的原子性,并保证数据的一致性。在写入期间,Hudi 使用写入顺序日志(Write-Ahead Logs)来记录所有的写操作,并在故障恢复时保证数据的一致性。
2、多种视图能力(读优化视图/增量视图/实时视图),支持快速数据分析。
3、MVCC设计,支持数据版本回溯。
4、自动管理文件大小和布局,以优化查询性能准实时摄取,为查询提供最新数据。
5、支持并发读写,基于snapshot的隔离机制实现写入时可读取。
6、支持原地转表,将存量的历史表转换为Hudi数据集。
7、数据索引:Hudi 内置了灵活且高效的数据索引机制,支持对数据集的列和分区进行索引,以加快数据的查询和过滤。
8、兼容多种数据格式和存储:Hudi 可以与多种数据格式(如Parquet、Avro等)和存储系统(如HDFS、S3等)进行无缝集成,适用于不同的数据湖环境。
三、Delt Lake
1、事务性写入:Delta Lake 支持原子性、一致性、隔离性和持久性 (ACID) 的事务性写入。这意味着写入操作要么全部成功,要么全部失败,可以确保数据的一致性和完整性。
2、数据版本控制:Delta Lake 可以跟踪和管理数据集的变化,支持数据版本控制。每次写入操作都会生成一个新的数据版本,并记录变化的详细信息,方便数据的回溯、比较和管理。
3、时间旅行查询:Delta Lake 支持时间旅行查询,可以查询特定时间点或时间范围的数据版本,方便用户查看历史数据状态和进行数据回滚。
4、 数据一致性保证:Delta Lake 使用写入日志(Write-Ahead Logs)来保证数据的一致性。写入操作会先写入日志,然后再将数据持久化到存储层。在故障发生时,可以根据日志进行数据恢复和重放。
5、快速数据索引:Delta Lake 提供了高效的数据索引机制,支持基于文件的元数据索引和数据索引。这样可以加快数据的查询和过滤操作,提高查询性能。
6、元数据管理:Delta Lake 提供元数据管理功能,可以记录数据集的模式(Schema)、表的统计信息和其他元数据信息。这些元数据信息可以用于数据查询优化和表的管理。
7、兼容性和互操作性:Delta Lake 兼容 Apache Spark 和其他基于 Spark 的工具和服务。它可以与多种数据格式(如 Parquet、Avro 等)和存储系统(如 HDFS、S3 等)进行无缝集成,适用于不同的数据湖环境。
综上所述,Delta Lake 提供了强大的功能和特性,使得数据湖的管理和使用更加可靠、高效和灵活。
三个管理引擎的相同点和区别是什么?
Iceberg、Hudi 和 Delta Lake 是三个不同的数据湖管理引擎,它们有一些相同点和区别:
相同点:
1. 事务性写入:这三个引擎都支持事务性写入,确保数据的原子性和一致性。
2. 支持数据版本控制:Iceberg、Hudi 和 Delta Lake 都支持数据版本控制,可以跟踪和管理数据集的变化,提供时间旅行查询和回滚数据的能力。
3. 与大数据生态系统集成:这三个引擎都与大数据生态系统(如 Apache Spark)紧密集成,可以与各种数据格式和存储系统无缝协作。
4. 元数据管理:Iceberg、Hudi 和 Delta Lake 都提供元数据管理功能,记录数据集的模式和其他元数据信息,方便查询优化和表的管理。
区别:
1. 架构和实现:Iceberg 使用分层文件组织(Hierarchical File Organization)和写前日志(Write Ahead Logs)的方式实现数据管理,Hudi 则通过管理数据的元数据,实现了对数据的管理。而 Delta Lake 是基于 Parquet 和 Hadoop 分布式文件系统的存储引擎实现管理,原理也是基于数据版本控制和元数据管理实现数据管理。
2. 查询性能:Iceberg、Hudi 和 Delta Lake 在查询性能上有所区别。Iceberg 提供了索引功能,可以加速查询和过滤操作。Hudi 着重于增量写入和流处理,并提供快速数据索引。而 Delta Lake 则通过优化存储文件格式和使用元数据索引来提高查询性能。
3. 社区支持和生态系统:Delta Lake 作为开源项目得到了广泛的社区支持,并与 Apache Spark 紧密结合。Iceberg 由 Netflix 发起并得到大量企业支持,Hudi 由 Uber 发起并有活跃的社区生态系统。
4. 成熟度和使用情况:Delta Lake 在数据湖管理领域中比较成熟,并且得到了广泛的应用和采用。Iceberg 和 Hudi 也具有一定的用户和使用量,但相对来说可能相对较新。
注:
Iceberg将数据进行分层管理,主要分为元数据管理层和数据存储层。元数据管理层又可以细分为三层:VersionMetadata、Snapshot、Manifest。VersionMetadata存储当前版本的元数据信息(所有snapshot信息);Snapshot表示当前操作的一个快照,每次commit都会生成一个快照,一个快照中包含多个Manifest,每个Manifest中记录了当前操作生成数据所对应的文件地址,也就是data files的地址。基于snapshot的管理方式,iceberg能够进行time travel(历史版本读取以及增量读取),并且提供了serializable isolation。数据存储层支持不同的文件格式,目前支持Parquet、ORC、AVRO。
欢迎加入【数据行业交流群】社群,长按以下二维码加入专业微信群

往期历史热门文章:
基于DataOps的数据开发治理:实现数据流程的自动化和规范化
原文作者:Ruby的数据漫谈;如有侵权,请联系管理员删除。