如何并行插入Delta表

问题描述

我有一个过程,可以在一个强大的群集中并行运行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(“ ”)

目前该表上没有分区,这可能是一个可能的解决方法,但是在走这条路线之前,在如何并行获取无冲突的插入方面我缺少什么?

解决方法

您必须在表的两种隔离级别之间进行选择,而较弱的是默认级别,因此没有任何隔离级别可以逃脱。 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个文件中),然后批量插入数据结构(例如文件)到目标表。

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