繁体   English   中英

如何并行插入Delta表

[英]How to insert into Delta table in parallel

我有一个进程可以在一个非常强大的集群上并行运行 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("<path_>")

目前这张表上没有分区,这可能是一个可能的修复,但在沿着这条路线走之前,我在如何并行获得无冲突的插入方面有什么遗漏吗?

您必须为您的表选择两种类型的隔离级别,较弱的一种是默认值,因此不会逃避隔离级别。 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 个文件中),然后批量插入数据结构的数据(例如files) 到目标表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM