编译:辰山,阿里巴巴计算平台事业部 EMR 高级开发工程师,目前从事大数据存储方面的开发和优化工作
事务日志(Transaction log)是理解 Delta Lake 的一个关键点,很多 Delta Lake 的重要特性都是基于事务日志实现的,包括 ACID 事务性、可扩展元数据处理、时间回溯等等。本文将探讨什么是事务日志,如何在文件层面实现,以及怎样优雅地解决并发读写的问题。
什么是事务日志?
Delta Lake 的事务日志(简称 DeltaLog)是一种有序记录集,按序记录了 Delta Lake 表从生成伊始的所有事务操作。
事务日志有何作用?
单一信息源
Delta Lake 基于 Apache Spark 构建,用来支持多用户同时读写同一数据表。事务日志作为单一信息源——跟踪记录了用户所有的表操作,从而为用户提供了在任意时刻准确的数据视图。
当用户首次访问 Delta Lake 的表,或者对一张已打开的表提交新的查询但表中的数据在上一次访问之后已发生变化时,Spark 将会检查事务日志来确定该表经历了哪些事务操作,并将更新结果反馈给用户。这样的流程保证了用户所看到的数据版本永远保持与主分支一致,不会对同一个表产生有冲突的修改。
Delta Lake 原子性实现
原子性,作为 ACID 四个特性之一,保证了对数据湖的操作(例如 INSERT 或者 UPDATE)或者全部完成,或者全部不完成。如果没有原子性保证,那么很容易因为硬件或软件的错误导致表中的数据被部分修改,从而导致数据错乱。
事务日志提供了一种机制来保证 Delta Lake 的原子性。任何操作只要没有记录在事务日志中,都会被认为没有发生过。事务操作只有在完全执行成功后才会被记录到事务日志中,并且将事务日志作为单一信息源,这两者保证了数据的可靠性,保证用户可以安心处理 PB 级的数据。
事务日志如何工作?
将事务分解为原子提交
每当用户提交一个修改表的操作时(例如 INSERT, UPDATE 或 DELETE),Delta Lake 将该操作分解为包括如下所示的一系列离散的步骤:
添加文件:添加一个数据文件。
删除文件:删除一个数据文件。
更新元数据:更新表的元数据(例如修改表的名称、schema 或分区)。
设置事务:记录 Spark structured streaming 任务提交的 micro batch 的 ID。
更改协议:将事务日志