使用 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 %}
当在 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 %}