在 Meltano 中运行 dbt 作业时,dbt run
如果超出触发上下文,作业可能会相互冲突 - 例如,当按需作业与计划作业或基于 CI 的作业发生冲突时。
如果dbt run
同时对同一个表进行操作,如果对单个目标表执行两次相同的插入,通常会导致崩溃,有时还会导致数据质量问题。
有什么方法可以使用 Meltano 功能或本机 dbt 功能来防止运行冲突?
一种方法是在目标数据库中生成锁。这是 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)
归档时间: |
|
查看次数: |
1537 次 |
最近记录: |