如何并行插入 Delta 表

Posted

技术标签:

【中文标题】如何并行插入 Delta 表【英文标题】:How to insert into Delta table in parallel 【发布时间】:2020-09-14 12:34:07 【问题描述】:

我有一个进程,它在一个非常强大的集群上并行运行 100 多个相同的 databricks 笔记本。每个笔记本在其进程结束时都会将大约 100 行数据写入存储在 Azure Gen1 DataLake 中的同一个 Delta Lake 表。我看到 Delta 的插入时间非常长,因为我只能假设 Delta 在插入时会锁定表格,然后在单个笔记本完成后将其释放,这基于阅读 https://docs.databricks.com/delta/concurrency-control.html 暗示不存在插入冲突,跨多个集群的多个写入者可以同时插入数据。

对于 100 多个笔记本,每个笔记本插入 100 行需要 3 个多小时。当前导致瓶颈的代码是:

df.write.format("delta").mode("append").save("")

目前此表上没有分区,这可能是一个可能的修复,但在沿着这条路线走之前,我是否缺少一些关于如何并行获取非冲突插入的内容?

【问题讨论】:

【参考方案1】:

您必须为您的表选择两种隔离级别,而较弱的一种是默认的,因此没有逃避隔离级别。 https://docs.databricks.com/delta/optimizations/isolation-level.html

Delta Lake 具有 OCC(乐观并发控制),这意味着您要写入表的数据会针对其他 99 个进程要写入的所有数据进行验证。这意味着正在进行 100*100=10000 次验证。 https://en.wikipedia.org/wiki/Optimistic_concurrency_control

还请记住,您的数据处理架构将在 100 个笔记本中的最后一个完成后完成。也许这 100 个笔记本中的一个或多个需要 3 小时才能完成,而插入不是罪魁祸首?

如果不是长时间运行的笔记本,我建议您尝试将每个笔记本的结果数据存储在某种数据结构中(例如,将其存储在每个笔记本的 100 个文件中),然后批量插入数据的数据结构(例如文件)到目标表。

数据处理是并行的,插入不是并行的。

【讨论】:

好的,非常感谢您的意见,我可以处理这个。

以上是关于如何并行插入 Delta 表的主要内容,如果未能解决你的问题,请参考以下文章

我们如何避免并行执行存储过程?

使用插入排序对链表进行并行排序

如何从 QlikView 连接到 Databricks Delta 表?

Delta Lake:如何在下一个版本的 delta 表中不携带已删除的记录?

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

如何在 bigquery 中创建 Delta