Delta Lake介绍

Apache Spark没有提供数据处理系统最基本的特性,比如ACID事务和其他数据管理和数据治理功能。为了克服这个不足,Databricks(由Apache Spark的第一批工程师建立的组织)发布了Delta Lake,这是一个开放格式的数据管理和治理层,它结合了数据湖和数据仓库的优点,可为数据湖提供可靠性、安全性和性能—可用于流和批处理操作。

在Delta Lake中,将所有数据置于一个公共存储层,即数据湖。然后Delta Lake会让不同的引擎使用这些数据,如下图所示。

可以将Delta Lake理解为一个数据管理框架,它为数据湖带来了可靠性,安全性和性能。本质上,Delta Lake是一个文件系统,它在对象存储上存储批和流数据,以及用于表结构和模式实施的增量元数据将数据放入湖中是使用Delta ACID API完成的,而将数据从湖中取出是使用Delta JDBC连接器完成的。Delta数据不能被其他SQL查询引擎查询。如下图所示。

用户的程序不直接与存储层交互,而是通过使用Delta Lake API与数据湖通信来读写数据。Delta Lake提供了一个统一的平台,在单一平台上支持批处理和流处理工作负载。它充当计算和存储层之间的中间服务,如下图所示。

Delta Lake提供了ACID事务、快照隔离、数据版本控制和回滚,以及模式强制,以更好地处理模式变更和数据类型变量。具体来说,Delta Lake提供了以下特性:

  • (1) Spark上的ACID事务:Serializable隔离级别确保读取器永远不会看到不一致的数据。在Delta Lake表上进行的所有事务都直接存储到磁盘。
  • (2) 可扩展的元数据处理:利用Spark分布式处理能力,轻松处理具有数十亿个文件的的PB级规模表的所有元数据。
  • (3) 流和批处理的统一:Delta Lake中的表既是批处理表,又是流源和流汇。流式数据摄取,批量历史回填,交互式查询都是开箱即用的。
  • (4) 模式演变:自动处理模式变化,以防止在摄取期间插入错误记录。通过模式强制,以确保上传到表中的数据与它的模式相匹配。
  • (5) 时间旅行:数据版本化控制支持回滚、完整的历史审计跟踪和可复制的机器学习实验。
  • (6) upsert和delete:支持合并(merge)、更新(update)和删除(delete)操作,以支持复杂的用例,如变更数据捕获(CDC,change-data-capture)、渐变维度(SCD,slowly-changing-dimension)操作、流式upsert,等等。

Delta Lake支持两个隔离级别:Serializable和WriteSerializable。WriteSerializable比快照隔离更强大,它提供了可用性和性能的最佳组合,并且是默认设置。最强级别的Serializable隔离确保串行序列与表的历史记录完全匹配。

Delta Lake通过管理提交的并发性来负责并发的读写访问。这是通过使用乐观锁实现的。这意味着:

  • (1) 当一个提交执行开始时,线程快照当前DeltaLog。
  • (2) 提交actions完成后,线程会检查DeltaLog是否被另一个线程同时更新。如果没有,它将在DeltaLog中记录提交。否则,它更新其DeltaTable视图,并在重新处理步骤之后(如果需要)再次尝试注册提交。

这确保了隔离属性。

在Delta Lake表上进行的所有事务都直接存储到磁盘上。这个过程满足ACID持久性的特性,这意味着即使在系统出现故障时,它也将持续存在。


《Flink原理深入与编程实战》