近年来,随着大数据利用用例的多样化,需要为分布式存储添加更多功能。这几年诞生了几款OSS存储层SW,可以原样使用HDFS等分布式存储和Apache Spark等分布式处理框架,为分布式存储添加新功能。其中,Delta Lake通过将ACID事务的功能赋予分布式存储来提高数据集的可靠性,本文将进行介绍。我们将探索 Delta Lake 的 ACID 事务,从 Delta Lake 的概述到深入的内容,例如在源代码级别检查实现。
什么是Delta Lake?
Delta Lake 是 Databricks 在 2019 年宣布为 OSS 的存储层软件。Delta Lake 允许您通过在分布式存储(如 HDFS 和 Amazon S3)上启用 ACID 事务来保持数据集的可靠性。
部署 Delta Lake 很简单,只需在实现 Spark 应用程序时使用 Maven 或 SBT 安装包。(以下以Maven为例)
<dependency> |
如果您只想读写简单的数据,只需对您的 Spark SQL 应用程序进行一些更改。
// Write |
它与 Spark SQL Read/Write 相同,只是格式已更改为"delta"。仅此一项就可以确保您仍然可以以 Parquet 的数据格式读取和写入数据,以及读取和写入 ACID 事务。
此外,Delta Lake 可以更轻松地为以前难以用分布式存储处理的数据实施 Upsert(在 SQL 术语中也称为 Merge)。
对于HDFS等存储,通过规范划分,实现了高扩展性。结果,如果我想更新数据,我必须做这样的事情:1. 读取所有要更新的数据集2. 向读取的数据集添加/更新/删除数据3. 写入新数据集4.删除旧数据集
使用 Delta Lake,这些现在可以通过一次操作完成。
分布式存储的 ACID 事务
首先,让我们看看每个 ACID 事务是什么。
- 原子性:对于事务中包含的操作,要么保证“所有结果都反映”,要么“什么都不反映”。
- 一致性:保证事务前后的数据一致性。
- 隔离:每个事务的处理不影响其他事务。
- 持久性:已完成事务的数据不应在系统故障时丢失。
其余三个通常不受分布式存储的保护。
关于原子性,我们会在更早的Upsert过程中考虑。(转贴)
- 读取所有要更新的数据集
- 对读取的数据集添加/更新/删除数据
- 写一个新的数据集
- 擦除旧数据集
关于一致性,可能是数据集的模式有问题。在HDFS中,写入的数据的内容是没有经过审查的,所以有可能,比如写Parquet有更多的列,json有更多的层次等等。如果模式不一致的地方很多,数据集可能无法建立,数据处理和分析也可能无法进行。
让我们在与原子性相同的情况下考虑隔离。(转贴)
- 读取所有要更新的数据集
- 对读取的数据集添加/更新/删除数据
- 写一个新的数据集
- 擦除旧数据集
关于 Delta Lake 事务
Delta Lake 假设您将使用 HDFS 和其他 Durability 分布式存储作为数据存储。因此,Durability 是由分布式存储来保证的。此外,通过使用 Delta Lake 来确保原子性、一致性和隔离性。
让我更详细地解释一下这个故事。通过将格式更改为"delta",Write 将按如下方式执行
- 将数据的实体Parquet文件写入分布式存储
- 将即1个数据的元数据写入分布式存储“Delta Log”(=提交)
- 通过阅读之前的“Delta Log”确定所需的 Parquet 文件
- 读取指定的 Parquet 文件
{"protocol":{"minReaderVersion":1,"minWriterVersion":2}} |
这个Delta Log的存在实际上保证了原子性、一致性和隔离性。
- 首先是原子性,
- 接下来是一致性:
- 最后,隔离性: