在Meltano中运行dbt作业时,如果没有触发的上下文,dbt run作业可能会发生冲突--例如,按需作业与计划作业或基于CI的作业发生冲突。
如果dbt run同时在相同的表上操作,这通常会导致崩溃,如果在单个目标表上执行两次相同的插入,则有时会导致数据质量问题。
是否可以使用Meltano功能或本机dbt功能来防止运行冲突?
发布于 2021-12-16 18:17:57
一种方法是在目标数据库中生成一个锁。下面是MSSQL的一个示例。
我选择了一个快速启动:钩子。此钩子试图获取dbt的锁,该锁将持续到DB会话期间。
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 %}https://stackoverflow.com/questions/70383118
复制相似问题