Delta Live Table - DLT 管道在初始化状态下受到攻击

问题描述 投票:0回答:2

我有一个 DLT 管道,它通过从 sql server 读取数据来创建 Delta 表,然后我们调用几个 api 来更新 cosmos 中的元数据。每当我们启动它时,它就会进入初始化状态。 但是,当我们在独立笔记本中使用交互式集群运行相同的代码时,它工作得很好。 有人可以帮助我理解这个问题吗?

DLT Pipeline 不应在初始化状态下受到攻击

databricks azure-databricks delta-live-tables
2个回答
1
投票

问题在于您的 DLT 程序结构不正确。为 DLT 编写的程序在设计上应该是声明性的,但在您的情况下,您是在顶层执行操作,而不是在标记为

@dlt.table
的函数内执行操作。当 DLT 管道启动时,它会通过评估所有代码并识别标有
@dlt
注释的执行图顶点来构建执行图(您可以看到您的函数被调用了多次,如此处所述)。而且由于您的代码具有使用
spark.read.jdbc
读取所有数据、与 Cosmos 交互等的副作用,因此初始化步骤非常慢。

为了说明问题,让我们看看您的代码结构。现在您有以下内容:

def read(...):
  1. Perform read via `spark.read.jdbc` into `df`
  2. Perform operations with Cosmos DB
  3. Return annotated function that will just return captured `df`

因此,第 1 项和第 2 项是在初始化阶段执行的,而不是在执行实际管道时执行的。

为了缓解这个问题,您需要将结构更改为以下:

def read(...):
  1. Return annotated function that will:
    1. Perform read via `spark.read.jdbc` into `df`
    2. Perform operations with Cosmos DB

0
投票

我知道这已经很老了,但在这篇文章中,有一件事让我突然想到,那就是关于使用线程同时调用函数的评论。我认为这就是初始化需要这么长时间的原因。

DLT 不使用多线程/池或其他任何东西,而是通过基于配置的方法做出更好的响应。您可以循环遍历包含实体的配置,DLT 将更好地解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.