目前数据湖的管理引擎中常见的三种管理引擎是Delta、Hudi和Iceberg,是。它们的定位如下:
- Delta:Delta是由Databricks开发的数据管理引擎,专门用于数据湖的快速、可靠和可扩展的数据操作。Delta提供了高性能的事务性写入和查询,以及支持实时流式数据和批处理数据的统一处理能力。Delta还提供了数据版本控制和一致性快照,以及数据湖中的Schema演化和更新功能。
- Hudi:Hudi(Hadoop Upserts Deletes and Incrementals)是由Uber开发的数据引擎,旨在提供数据湖中的增量和更新操作支持。Hudi支持数据的写入、更新和删除操作,并提供基于时间和快照的数据版本控制。Hudi还支持流式和批处理数据的快速查询和分析。
- Iceberg:Iceberg是由Netflix开发的数据表格格式和管理层,用于数据湖的高效数据操作和管理。Iceberg提供了对数据的写入、更新和删除操作的支持,并支持版本控制和快照。Iceberg还提供了高性能的查询和分析能力,以及支持数据湖中的Schema演化和更新。
Delta、Hudi和Iceberg都是数据湖的管理引擎,三者均为数据湖的数据存储中间层,它们提供了类似于数据库中的catalog/wal的功能,用于管理数据湖中的数据。这些引擎使用meta文件来管理数据的schema、事务和数据操作。与传统数据库不同的是,这些meta文件与数据文件一起存储在引擎内部,并且用户可以直接访问这些文件。这种设计遵循了大数据分析中数据对用户可见的传统,但也增加了数据被意外破坏的风险。例如,如果一个用户错误地删除了meta目录,相应的表就会被破坏,恢复起来非常困难。
这些meta文件包含了表的schema信息,因此系统可以自动监测schema的变动,提供schema演化的支持。此外,meta文件还具有事务日志功能(需要底层文件系统具有原子性和一致性),这使得这些引擎支持ACID事务和多版本功能,并能够提供访问历史数据的能力。
总体而言,Delta、Hudi和Iceberg都是为了解决数据湖中数据管理和操作的挑战而开发的引擎,它们提供了类似的功能,但在实现细节和性能方面可能存在一些差异。Hudi 为了 incremental 的 upserts,Iceberg 定位于高性能的分析与可靠的数据管理,Delta 定位于流批一体的数据处理。
数据的管理的schema说明
Schema管理是指在数据湖环境中对数据的结构和类型进行管理和维护的过程。在大规模数据集中,数据的结构可能会发生变化,包括添加、删除、修改列等操作。Schema管理的目标是确保数据的一致性和可用性,使得数据能够被正确解释和使用。在传统数据仓库中,通常会使用关系型数据库来管理数据的结构和元数据。但在数据湖中,由于数据源的多样性和灵活性,数据的结构可能会更加动态和多变。因此,传统的关系型数据库管理方法可能不适用。在数据湖环境中,通常会使用一种称为“Schema-on-Read”的方法来管理数据的结构。Schema-on-Read是指在数据读取时对数据的结构进行解析和解释,而不是在数据写入时进行强制约束。这种方法允许数据湖能够容纳各种不同结构的数据,而不需要提前定义固定的模式。但是,Schema管理仍然是非常重要的,它可以确保数据被正确地解释和使用。在数据湖中进行Schema管理的方式可以包括:
- 使用文件格式(如Parquet或Avro)来存储数据,这些格式可以包含数据的结构信息。
- 使用元数据服务来记录数据集的结构信息,并进行查询和检索。
- 使用架构演化工具来管理数据结构的变化,并提供版本控制和回滚功能。
-
使用数据质量工具来验证数据的结构和类型,并进行一致性检查。
通过有效的Schema管理,可以提高数据湖的可靠性、可查询性和数据质量,使得数据湖能够更好地支持数据分析和决策。2、写入型schema 和读取型schema的区别是什么?写入型Schema和读取型Schema是在数据湖中用于管理和解析数据的两种不同的Schema类型。写入型Schema是在数据写入时定义和应用的Schema。它描述了将要写入数据的结构和类型。写入型Schema通常在数据被加载到数据湖中之前使用,确保数据以一致的结构和类型被存储。实际应用中在数据仓库中应用比较多,数据仓库的数据结构都是在写入前定义了数据结构,因此是写入型Schema。读取型Schema是在数据读取时定义和应用的Schema。它描述了用于读取和解析数据的结构和类型。读取型Schema通常在数据被查询和分析之前使用,以确保正确地解析数据。一般应用于数据湖,在数据存储的时候不定义数据结构,以文件的形成存储数据,当分析引擎在读区文件的数据的时候,才解析数据的Schema.这两种Schema的区别在于它们的应用时机和目的。写入型Schema主要用于数据的写入和存储操作,确保数据按照一致的结构和类型进行存储。读取型Schema主要用于数据的查询和分析操作,确保正确解析和使用数据。在数据湖环境中,写入型Schema通常由数据质量工具、ETL工具或数据管道工具自动定义和应用。而读取型Schema通常由查询和分析工具(如SQL引擎或数据分析工具)根据查询需求自动创建和应用。在湖仓一体中即有数据湖的数据,又包含数据仓库的数据,因此湖仓一体的Schema 即包含读取型Schema,又包含写入型Schema。
管理引擎如何实现数据湖的ACID特性
数据湖的湖仓一体的ACID 事务性一般是通过管理引擎实现的,那么管理引擎如何实现湖仓一体的事务性了?在数据湖中实现湖仓一体的ACID事务性一般通过以下几种管理引擎来实现:
- Delta Lake:Delta Lake是一个开源的数据湖引擎,它在数据湖中提供了ACID事务的支持。Delta Lake通过将数据存储在Apache Parquet格式的文件中,并在写入时使用写日志来记录每个操作,实现了数据的事务性。在读取数据时,Delta Lake还可以保证读取事务的隔离性。
- Apache Hudi:Hudi(Hadoop Upserts Deletes and Incrementals)是一个开源的数据湖引擎,它提供了对大规模数据的增量更新和删除操作的支持,并保证了ACID事务的一致性。Hudi通过在数据湖中使用可重入的写入和冲突检测机制,实现了湖仓一体的事务性。
- Apache Iceberg:Iceberg是一个开源的数据湖表格引擎,它通过提供点-in-time查询、数据版本控制和事务性写入等功能,实现了湖仓一体的ACID事务性。Iceberg将数据湖中的数据组织成表格,并使用写入日志和写入锁机制来实现事务性。
这些管理引擎通过在数据湖中添加额外的元数据、写入日志和锁机制等机制,来实现数据湖的ACID事务性。它们能够保证数据的一致性、隔离性和持久性,使得数据湖能够支持复杂的数据操作和管理需求。Delta Lake 提供了以下机制来实现ACID事务性:
原子性(Atomicity):Delta Lake 使用日志和元数据来记录每个写操作,通过写操作的原子提交,保证了写操作的原子性。即使出现故障或中断,Delta Lake 可以恢复到连续的、一致的状态。
一致性(Consistency):Delta Lake 使用写时复制(Write-Ahead Log,WAL)来确保数据的一致性。在写操作之前,Delta Lake 会将数据写入日志,然后再写入文件。这样即使出现故障或中断,可以根据日志进行恢复,保证数据的一致性。
隔离性(Isolation):Delta Lake 使用多版本并发控制(Multi-Version Concurrency Control,MVCC)来实现隔离性。MVCC 能够支持并发访问并确保事务之间相互隔离,从而避免读取到未提交的数据。
持久性(Durability):Delta Lake 将数据和元数据写入分布式存储系统,如HDFS、AWS S3等,确保数据的持久性。即使发生故障,Delta Lake 可以从持久化存储中恢复数据。
例如 Hudi
Hudi通过以下方式实现ACID特性:
Atomicity(原子性):Hudi使用Write Ahead Logs(WALs)来记录数据操作的日志,包括插入、更新和删除操作。在数据写入过程中,Hudi会先将数据写入WALs,并将写入操作编写到Hudi表中。如果写入操作成功,Hudi会将数据提交并应用到实际的数据文件中,否则会进行回滚,保证写入操作的原子性。
Consistency(一致性):Hudi使用了MVCC(多版本并发控制)的方式来实现一致性。它使用时间戳标记数据的不同版本,并支持读取指定时间戳之前的数据版本。这样就可以避免在读取数据时对写入操作的影响,保证读取的数据是一致的。
Isolation(隔离性):Hudi通过使用分区事务来实现隔离性。Hudi将每个写入操作看作是一个事务,并为每个写入操作分配一个唯一的事务ID。在多个写入操作同时进行时,Hudi使用锁来保证每个操作在执行时的隔离性,避免数据冲突和数据不一致性。
Durability(持久性):Hudi使用可靠的存储系统来保证数据的持久性。它支持将数据存储在各种文件系统或云存储中,如HDFS、S3等。Hudi还提供了数据一致性检查和修复的机制,以确保数据的完整性和持久性。
例如 Iceberg
Iceberg通过以下方式实现ACID事务性。它借鉴了Delta Lake的一些概念,并采用了一种称为"Snapshot Isolation"的技术来实现ACID特性。
具体而言,Iceberg使用的是MVCC(多版本并发控制)来实现事务性。在写操作之前,Iceberg会创建一个新的写入任务,并将该任务的元数据(包括数据变更信息和写入操作的快照信息)存储在Iceberg的元数据表中。这样可以保持原数据的不可变性。
在读取操作时,Iceberg通过检查元数据表来确定可见的数据版本。它会通过快照信息确定哪些数据是事务开始之前的(旧版本数据)和哪些是事务开始之后的(新版本数据)。这样可以确保不会读取到正在进行中的事务的修改。
在提交事务时,Iceberg会将写入任务标记为已完成,并且将事务的元数据持久化存储。这样可以确保事务的原子性和持久性。如果在提交事务过程中失败,Iceberg可以使用这些持久化的元数据信息来回滚操作,以确保数据的一致性。
Iceberg还支持分区事务,这意味着可以在具有多个分区的表上并行执行不同的写入任务,同时保持表的一致性。
欢迎加入【数据行业交流群】社群,长按以下二维码加入专业微信群,了解最新的数据行业资讯

往期历史热门文章:
基于DataOps的数据开发治理:实现数据流程的自动化和规范化
数据平台:湖仓一体、流批一体、存算分离的核心问题及原因解析
数据治理体系该怎么建设?
实时数仓&流批一体技术发展趋势
数据仓库、数据中台、大数据平台的关系?
数字化转型如何促进业务的发展
数据中台中的核心概念解析
数据治理中的数据标准的作用?
全面数字化转型:打造全新营销模式