我遇到了由几个SubDagOperators组成的DAG无限期挂起的问题。
设置: 使用CeleryExecutor。出于这个例子的目的,我们假设我们有一个可以同时运行五个任务的工作者。 DAG我遇到了并行运行多个SubDagOperator的问题。为了便于说明,请考虑下图,其中每个节点都是SubDagOperator:
问题:DAG将停止在DAG的高并行性部分取得进展。根本原因似乎是顶级SubDagOperators占用了可用于运行任务的所有五个插槽,因此这些SubDagOperator中的子任务都无法运行。这些子任务卡在排队状态,没有人进展。
对我来说,SubDagOperator任务会与他们自己的子任务竞争任务运行插槽有点令人惊讶,但现在对我来说很有意义。是否有关于编写我违反的SubDagOperators的最佳做法?
我的计划是通过创建自定义运算符来封装当前封装在SubDagOperators中的任务来解决此问题。我想知道是否有人建议是否建议创建一个由其他运营商组成的运营商?
答案 0 :(得分:0)
似乎应该避免使用SubDagOperator,因为它会导致此死锁问题。我最终发现,对于我的用例,我最好通过编写自己的自定义BaseOperator
子类来完成我在SubDagOperator中执行的任务。编写运算符类比我预期的要容易得多。