使用 dbt 和 Meltano,如何防止多个 dbt 作业运行相互冲突?

Using dbt and Meltano, how can I prevent multiple dbt job runs from conflicting with each other?

当在 Meltano 中 运行ning dbt 作业时,如果 运行 超出触发上下文,dbt run 作业可能会相互冲突 - 例如,当按需作业发生冲突时有计划的工作或基于 CI 的工作。

如果 dbt run 同时在相同的 table 上操作,这通常会导致崩溃,如果在单个目标上执行两次相同的插入操作,有时还会导致数据质量问题 table.

有什么方法可以防止 运行 碰撞,使用 Meltano 功能或本机 dbt 功能?

一种方法是在目标数据库中生成锁。这是 MSSQL 的示例。

我选择了一个 on-运行-start: 钩子。此挂钩尝试为 dbt 获取锁,该锁在数据库会话期间持续。

dbt_project.yml

on-run-start: 
  - "{{ application_lock() }}" #Be sure only one dbt project runs at a time

宏:application_lock.sql

{% macro application_lock() %}
    
DECLARE 
    @result int,
    @msg varchar(max);

EXEC @result = sp_getapplock @resource = 'dbt', @lockMode = 'Exclusive', @locktimeout = '1200000', @lockowner = 'Session';
IF @result not in (0, 1)
    BEGIN
    SET @msg = 'Result from sp_getapplock:'+ CAST(@result as varchar(max))+'. Lock could not be taken after waiting 20 minutes. Another DBT process probably has the applock, try again later.';
    THROW 51000, @msg, 1
    END

{% endmacro %}