gpt4 book ai didi

pyspark - PySpark - 使用 Databricks Spark 在 Synapse 中执行合并

转载 作者:行者123 更新时间:2023-12-05 06:11:51 25 4
gpt4 key购买 nike

我们在使用 Databricks Spark 执行 ACID 操作时遇到了棘手的情况。我们想使用 PySpark 通过 JDBC 连接在 Azure Synapse 表上执行 UPSERT。我们知道 Spark 仅提供 2 种写入数据的模式。 APPENDOVERWRITE(在我们的例子中只有这两个使用 full)。因此,基于这两种模式,我们想到了以下选项:

  1. 我们会将整个数据帧写入阶段表。我们将使用这个阶段表对最终表执行 MERGE 操作(~UPSERT)。之后阶段表将被截断/删除。

  2. 我们也会将目标表数据导入 Spark。在 Spark 中,我们将使用 Delta lake 执行 MERGE,并将生成最终的 Dataframe。该 Dataframe 将以 OVERWRITE 模式写回 Target 表。

考虑到缺点。边..

在方案1中,我们必须使用两个表来写入最终数据。如果 Stage 和目标表都很大,那么在 Synapse 内执行 MERGE 操作是另一项艰巨的任务,可能需要时间。

在选项 2 中,我们必须将 Target 表放入 Spark 内存中。尽管网络 IO 不是我们关注的重点,因为 Databricks 和 Synpse 都在同一个 Azure AZ 中,但它可能会导致 Spark 端出现内存问题。

还有其他可行的选择吗??或者有什么推荐吗??

最佳答案

答案取决于您的问题中未列出的许多因素。这是一个非常开放的问题。

(考虑到您问题的措辞方式,我假设您使用的是专用 SQL 池而不是按需 Synapse)

以下是一些想法:

  • 您将在选项 1 中使用 spark 集群的计算,在选项 2 中使用 Synapse 的计算。比较成本。
    • 选择较低的费用。
  • 使用 Datalake 作为阶段,使用他们的驱动程序在 Spark 和 Synapse 之间读写。 IE。在将 Synapse 中的表读入 Spark 中的数据帧时,驱动程序将首先使 Synapse 将数据导出到 Datalake(作为 parquet IIRC),然后读取 Datalake 中的文件以创建 Dataframe。如果您谈论的是 10 或数百万或数十亿行,这可以很好地扩展。但是如果行数很低(10-100 万),开销可能会成为性能开销。
    • 测试并选择速度更快的一个。
  • 请记住,Synapse 不同于传统的 MySQL 或 SQL-Server。这是一个 MPP 数据库。
    • “在 Synapse 内执行 MERGE 操作是另一项艰巨的任务,可能需要时间” 是一个错误的陈述。它可以像 Spark 集群一样扩展。
    • 它可能会导致 Spark 端出现内存问题,是也不是。一方面,所有数据都不会加载到单个工作节点中。 OTOH 是的,每个节点确实需要足够的内存来完成它自己的部分。
  • 虽然 Synapse 可以动态放大和缩小,但我发现它最多需要 40 分钟才能完成放大。另一方面,Databricks 是完全按需提供的,您可能可以通过打开集群、执行更新插入、关闭集群来摆脱困境。使用 Synapse,您可能会有其他客户端使用它,因此可能无法将其关闭。
    • 因此,对于 Synapse,您将不得不忍受 40-80 分钟的每次更新插入(放大、更新插入、缩小)停机时间,或者
    • 一直为高 DWU 统一费率付费,虽然只有当您更新时您的使用率很高,否则它非常低。
  • 最后,请记住 MERGE 在撰写本文时处于预览状态。意味着如果您的产品因使用 MERGE 而出现问题,则没有 Sev-A 支持案例/立即支持。
    • 您始终可以改用DELETE + INSERT。假设您收到的增量包含目标表中的所有列,而不仅仅是更新的列。

关于pyspark - PySpark - 使用 Databricks Spark 在 Synapse 中执行合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63788611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com