来自气流文档:
SubDAGs must have a schedule and be enabled. If the SubDAG’s schedule is set to None or @once, the SubDAG will succeed without having done anything
我理解subagoperator实际上是作为BackfillJob实现的,因此我们必须向运营商提供schedule_interval
。但是,是否有办法为子标记获得schedule_interval="@once"
的语义等价物?我担心如果我使用set schedule_interval="@daily"
作为子标记,如果子标记运行的时间超过一天,则子标记可能会运行多次。
def subdag_factory(parent_dag_name, child_dag_name, args):
subdag = DAG(
dag_id="{parent_dag_name}.{child_dag_name}".format(
parent_dag_name=parent_dag_name, child_dag_name=child_dag_name
),
schedule_interval="@daily", # <--- this bit here
default_args=args
)
... do more stuff to the subdag here
return subdag
TLDR:如何伪造“每次触发父dag只运行一次这个子标记”
答案 0 :(得分:5)
我找到了
schedule=@once
适用于我的子标签。也许我的版本已经过时,但即使所有任务都成功(或被跳过),我的子标记失败也会出现更多问题。
现在我的机器上运行的实际示例代码非常开心:
subdag_name = ".".join((parent_name,child_name))
logging.info(parent_name)
logging.info(subdag_name)
dag_subdag = DAG(
dag_id=subdag_name,
default_args=dargs,
schedule_interval="@once",
)
事实上,我最初构建了几乎所有的dags作为我的子标记的美化cfg文件。不确定经过一些试验和错误后的想法有多好,但是计划间隔对我来说绝不是一个阻碍者。
我运行的是一个相对较新的1.8版本,几乎没有自定义。我一直在遵循示例dag的建议,即将我的子标记保存在dags文件夹中的文件夹中,这样它们就不会显示在DagBag中。
答案 1 :(得分:2)
尝试使用带有 schedule = None 的外部触发模式作为子标记。在这种情况下,它将仅在父dag触发时运行