DBT模型挂

Posted

技术标签:

【中文标题】DBT模型挂【英文标题】:DBT Model hanging 【发布时间】:2020-11-03 22:04:01 【问题描述】:

我使用 macOS,但在大桌子上完全刷新时遇到问题。在运行期间,它看起来好像挂起并且在 redshift 中没有运行查询。较小的表不会发生这种情况,如果我运行增量表也不会发生。这个表曾经更小,只要我指定了表,我就可以运行完全刷新。现在它更大了,我似乎遇到了这个问题。该模型依赖于 6 个表。几乎就像没有发送命令一样。有什么建议么? 没有错误,因为它只是没有运行。在 windows 和 macos 上运行它的其他团队成员预计它会在 10 分钟内完成。目前是 30 分钟,但我让它坐的时间比这长得多。 我的命令是 dbt run --models +fct_mymodel --full-refresh --vars "run_date_start: 2020-06-01"

谢谢

【问题讨论】:

【参考方案1】:

Redhift UI 通常只显示长时间运行的查询。我遇到了类似的问题,它们是由某些表上的锁定引起的——在我们的例子中是由未提交的显式事务引起的(BEGIN 没有 COMMITROLLBACK)。

运行此查询以查看当前事务及其锁:

select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a 
left join (select pid,relation,granted from pg_locks group by 1,2,3) b 
on a.relation=b.relation and a.granted='f' and b.granted='t' 
left join (select * from stv_tbl_perm where slice=0) c 
on a.relation=c.id 
left join pg_class d on a.relation=d.oid
where  a.relation is not null;

阅读 AWS 知识库条目了解更多详情https://aws.amazon.com/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

【讨论】:

感谢您的回复。我确实找到了一些独占锁但没有阻塞 pid。我认为它仍然可能朝着正确的方向发展。有 3 个登台表在同一个分区表上工作。那是锁。这些将在大约 20 分钟内完成。然后有一个由这三个表构建的事实表。那永远不会开始。如果我只运行它,它就会完成。我刚刚注意到事实表逻辑正在使用物化视图并进行排序,所以接下来就去那里。 你查logs/dbt.log查询是否是dbt发出的?似乎不确定 Redshift 查询或 dbt 进程是否挂起。 抱歉耽搁了……我确实浏览了它们,但没有看到任何有用的东西,但我不得不继续前进一段时间。将在星期一再次尝试解决,因为我实际上需要它来工作!谢谢!

以上是关于DBT模型挂的主要内容,如果未能解决你的问题,请参考以下文章

在 dbt 模型中使用 if 块

DBT构建和部署机器学习模型预测订单退货

DBT 模型:如何从查询中创建变量并在 If 语句中使用它

dbt 无法创建具有相同数据库表示的两个资源

为啥在 dbt 中运行模型时出现“关系 <y> 的列 <x> 不存在”错误,但在 SQL 客户端中运行时却没有?

dbt post hook 关系“my_table”不存在