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

aar*_*ers 7 dbt meltano

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

如果dbt run同时对同一个表进行操作,如果对单个目标表执行两次相同的插入,通常会导致崩溃,有时还会导致数据质量问题。

有什么方法可以使用 Meltano 功能或本机 dbt 功能来防止运行冲突?

vis*_*sch 8

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

我选择了一个 on-run-start: 钩子。此挂钩尝试获取持续数据库会话期间的 dbt 锁。

dbt_project.yml

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

宏: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 %}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案!谢谢你! (2认同)