【问题标题】:Load data from synapse spark pool to dedicated sql pool - multiple jobs for a single write action将数据从突触火花池加载到专用 sql 池 - 单个写入操作的多个作业
【发布时间】:2022-01-27 02:23:55
【问题描述】:

我有一个在 Synapse 火花池上执行的火花代码,如下所示。它从专用的 SQL 池表中读取数据,执行映射操作并将数据写回专用的 SQL 池表中。

一个写入操作会生成两个作业

在作业 0 中,数据被写入 ADLS

在作业1中,相同的输入数据被重新读取重新处理并写入目标SQL池表

当 Job 0(第一个作业)已经准备好输出数据时,为什么还需要 Job 1(第二个作业)和相关的重新处理?

驱动程序日志捕获以下步骤的执行:

第 1 步 - 在 Gen2 上创建已处理数据(火花输出)的暂存目录

第 2 步 - 在 Gen2 上提取输入表

第 3 步 - 作业 0 执行(在第 1 步的暂存目录中创建输出)

第 4 步 - 从输入表中重新提取数据(这在第 2 步中已经可用)

第 5 步 - 将 Job 0 输出加载到 SQL 池表中

第 6 步 - 执行作业 1(重新执行与作业 0 相同的操作)

第 4 步和第 6 步本质上是多余的

【问题讨论】:

    标签: apache-spark azure-synapse


    【解决方案1】:

    在后端为一个写入操作生成两个作业,因为它是在内部以这种方式设计的。

    详细了解当您尝试从 synapse spark 池读取数据并将数据写入专用 sql 池时会发生什么。这是一个两步过程:

    1. 您正在读取或写入的数据作为中间状态保存在 Azure 存储(Blob 存储或 Gen2)中。
    2. 现在 spark 读取保存在 Azure 存储中的数据并对其进行转换。如果您正在写入数据,它会使用 polybase 或 Copy 来传输数据。

    我附上了官方文档中的图片,它将向您展示早期方法是什么以及新方法是什么。

    以下是一些官方文档参考,可让您更详细地了解这一点。

    https://docs.microsoft.com/en-us/azure/synapse-analytics/spark/synapse-spark-sql-pool-import-export

    https://docs.microsoft.com/en-us/azure/databricks/data/data-sources/azure/synapse-analytics

    【讨论】:

    • 我已使用从驱动程序日志中捕获的高级执行步骤更新了问题。输入数据似乎被提取了两次(步骤 2 和步骤 4)。此外,目标表在第 5 步之后可用,并且不需要作业 1(第 6 步)
    • 您如何检查输入数据是否被提取了两次以及您在哪里看到的?
    • 它出现在 Spark 驱动程序日志中。在 Job 0 之前,有一个 CETAS 语句用于从 parquet (snappy) 中的输入表中提取数据。在 Job 0 之后和 Job 1
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2021-11-09
    • 2021-06-06
    • 2021-10-11
    • 2021-11-15
    • 2022-01-07
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多