将数据从 Databricks 加载到 Azure SQL 时的性能问题

Posted

技术标签:

【中文标题】将数据从 Databricks 加载到 Azure SQL 时的性能问题【英文标题】:Performance issues in loading data from Databricks to Azure SQL 【发布时间】:2021-02-24 22:44:29 【问题描述】:

我正在尝试使用 Microsoft 最近发布的支持 Python API 和 Spark 3.0 的 connector 将 100 万条记录从 Databricks 中的 Delta 表加载到 Azure SQL 数据库。

对我来说,性能看起来并不出色。加载 100 万条记录需要 19 分钟。下面是我正在使用的代码。你认为我在这里遗漏了什么吗?

配置: 8 个 Worker 节点,28GB 内存和 8 个内核。 Azure SQL 数据库是 4 vcore Gen5。

try:
  df.write \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .mode("overwrite") \
    .option("url", url) \
    .option("dbtable", "lending_club_acc_loans") \
    .option("user", username) \
    .option("password", password) \
    .option("tableLock", "true") \
    .option("batchsize", "200000") \
    .option("reliabilityLevel", "BEST_EFFORT") \
    .save()
except ValueError as error :
    print("Connector write failed", error)

我可以做些什么来提高性能吗?

【问题讨论】:

您确定这是在 Databricks 还是 Azure SQL 端?当您运行此程序时,您在 SQL 中看到的等待类型是什么?您可以简单地受到 SQL 端的日志吞吐量的限制 - 在这种情况下,解决方案是在负载期间扩大您的 SQL 数据库,然后再次缩小 我不确定 Martin 问题出在哪里。我不认为扩展数据库会产生任何差异,因为数据库是一个非常强大的数据库。 DB 上的 I/O 非常低且受控制。所以我假设问题出在 Databricks 端。与此处的选项有关。 你确定数据库吗?看看下面的youtube.com/… 从 1:39:00 开始,以获取有关 Log Rate Governance 的信息,即使 CPU 消耗和数据 I/O 看起来很低,它仍然可能发生 好的。你说的也是。有点帮助... CPU 和内存等待时间非常短并且可以接受。但是 Network Io 等待时间相当长。 我刚刚在问题上添加了截图.. 【参考方案1】:

重新分区数据框。早些时候,我在源数据帧上有一个分区,重新分区为 8 有助于提高性能。

【讨论】:

以上是关于将数据从 Databricks 加载到 Azure SQL 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

将数据表从 Databricks dbfs 导出到 azure sql 数据库

使用 /mnt/ 将数据从 Azure Blob 存储读取到 Azure Databricks

从 Azure Databricks 将数据写入 Azure Blob 存储

为啥 Azure Databricks 需要将数据存储在 Azure 的临时存储中

Azure Synapse - 增量数据加载

我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)