气流:用于运行气流子标记的模式

时间:2017-04-19 19:09:02

标签: python etl directed-acyclic-graphs airflow apache-airflow

来自气流文档:

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只运行一次这个子标记”

2 个答案:

答案 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触发时运行