如何并行插入Delta table

How to insert into Delta table in parallel

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

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

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

目前此 table 上没有分区,这可能是一个可能的修复方法,但在沿着这条路线走之前,我是否缺少关于如何并行获得无冲突插入的东西?

您必须为 table 在两种类型的隔离级别之间进行选择,较弱的一种是默认设置,因此没有 运行 远离隔离级别。 https://docs.databricks.com/delta/optimizations/isolation-level.html

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

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

如果 long 运行 notebooks 不是这种情况,我建议您尝试将每个笔记本的结果数据存储在某种数据结构中(例如,将其存储在每个笔记本的 100 个文件中),然后进行批处理将数据结构的数据(例如文件)插入目标 table.

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