如何以不同的时间表间隔运行subdag?

时间:2019-07-09 08:39:02

标签: python airflow directed-acyclic-graphs

我有包含以下任务的Airflow的DAG:

  1. 将csv添加到登台表(t1)
  2. 从主表(t2)中删除旧记录
  3. 将最新数据添加到表(t3)

和一个子分类,每天一天结束时运行(11.59 PM或23.59 24小时制)。前三个任务必须首先工作,然后子调试将随后运行

t1 >> t2 >> t3 >> subdag

问题在于,前三个任务运行良好,但subdag却无法运行。我先重启,然后给出错误标志。我也无法检查哪里以及为什么会出错。

我尝试从子查询中重新定义schedule_interval,以遵循预期的结果,从12 * * * *59 12 * * *。我也尝试过此博客文章https://medium.com/handy-tech/airflow-tips-tricks-and-pitfalls-9ba53fba14eb

这是dag default_dag_args代码:

DAG_NAME = 'order_bid'

...
default_dag_args = {
    'start_date': start_date,
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    'project_id': models.Variable.get('XXXXXXXXXXX')
}

这是任务声明的示例:

task_add_order_bid = bigquery_operator.BigQueryOperator(
    task_id='add_order_bid',
    bql=order_bid.sql_itop_order_bid.format(
        table_order_bid_stg=table_order_bid_stg,
        date_from=date_from.strftime("%Y-%m-%d")
        ),
    use_legacy_sql=False,
    write_disposition='WRITE_APPEND',
    destination_dataset_table=table_order_bid,
    dag=dag,

)

这是我尝试声明的子目录:

subdag_daily_bid = SubDagOperator(
    subdag=daily.dailyBidding(
        DAG_NAME,
        "daily_order_bid",
        start_date,
        dt_wib),
    task_id="daily_order_bid",
dag = dag)

但是,当我想更改时间表时,我这样声明subdag:

def dailyBidding(parent_dag, child_dag, start_date, task_date):
    dag = models.DAG(
        '%s.%s' % (parent_dag, child_dag),
        schedule_interval='59 12 * * *',
        start_date=start_date
        )

    date_from = task_date - timedelta(days=1)

    task_del_taxi_order_bid_daily = bigquery_operator.BigQueryOperator(
    task_id='del_daily_order_bid',
    bql=sql_del_partition_order_bid_daily.format(
        table_order_bid=table_order_bid_master,
        date_from=date_from.strftime("%Y-%m-%d")),
    use_legacy_sql=False,
    dag=subdag)

task_add_daily_order_bid = bigquery_operator.BigQueryOperator(
    task_id='add_daily_order_bid',
    bql=daily.sql_add_daily.format(
        source = table_order_bid_master,
        yesterday = date_from.strftime("%Y-%m-%d"),
        monthly = a_month_ago.strftime("%Y-%m-%d")),
    use_legacy_sql=False,
    write_disposition='WRITE_APPEND',
    create_disposition='CREATE_IF_NEEDED',
    destination_dataset_table=table_daily_order_bid,
    dag=subdag)


task_del_taxi_order_bid_daily >> task_add_daily_order_bid

    return dag

我希望我的孩子在12.59上班,但它仍然在等待运行并遵循父母的时间表。

1 个答案:

答案 0 :(得分:0)

根据此astronomer.io https://vuetifyjs.com/en/customization/theme,子类别必须与其父DAG具有相同的时间表。

通常,如果您需要让DAG的一部分与其他部分的运行时间表不同,则可以通过以下几种方法来实现:

  • 仅当日期戳(例如ds)与您想要的频率匹配时,您才可以使用post继续子标记。因此您的DAG可以每天运行,但仅在星期一执行subdag步骤
  • 您可以将subdag分解为完全不同的DAG,将DAG设置为每周计划,然后使用short circuit operator来检查并等待数据,或者使用普通的PythonOperator进行检查,如果数据不是'在那里。

我发现了第二种方法。如果没有所需的数据,则失败的消息会向我发出一个有用的信号,表明存在更大的错误。