假设我们有两个DAG,dag1和dag2,它们满足不同的业务需求。它们是完全无关的。但是dag1更重要的是尽早完成它。
为简单起见,它们都只有一项任务,并且每天运行。
在dag1落后计划2天或3天的情况下,我想确保dag1首先运行并完成其dag_runs,即dag1在dag2能够继续运行之后是最新的。
我尝试了priority_weight,但在不同的dag中无法使用。
我需要一种将来自两个dag的任务放在同一队列中并实现DAG级别优先级的方法。
答案 0 :(得分:2)
摘自External Task Sensor的官方文档:
Waits for a different DAG or a task in a different DAG to complete for
a specific execution_date.
:param external_dag_id: The dag_id that contains the task you want to
wait for
:type external_dag_id: str
:param external_task_id: The task_id that contains the task you want to
wait for. If ``None`` the sensor waits for the DAG
:type external_task_id: str
:param allowed_states: list of allowed states, default is ``['success']``
:type allowed_states: list
:param execution_delta: time difference with the previous execution to
look at, the default is the same execution_date as the current task or DAG.
For yesterday, use [positive!] datetime.timedelta(days=1). Either
execution_delta or execution_date_fn can be passed to
ExternalTaskSensor, but not both.
:type execution_delta: datetime.timedelta
:param execution_date_fn: function that receives the current execution date
and returns the desired execution dates to query. Either execution_delta
or execution_date_fn can be passed to ExternalTaskSensor, but not both.
:type execution_date_fn: callable
:param check_existence: Set to `True` to check if the external task exists (when
external_task_id is not None) or check if the DAG to wait for exists (when
external_task_id is None), and immediately cease waiting if the external task
or DAG does not exist (default value: False).
:type check_existence: bool
两个DAG都应将depends_on_past
Trigger Rule设置为True
,以便只有在先前的计划运行成功完成后,才会执行较新的计划的DAG运行。
然后将外部任务传感器添加到Dag 2的开头(稍后执行)。
或者,您可以创建自己的自定义传感器,并通过Airflow Plugins使用它,以便检查元数据库中Dag Run的状态。
您还可以构建利用Airflow XCOMs或Airflow Variables来将执行运行时间或任何其他Airflow Macro传递给DAG 2中的Sensor的客户传感器。
答案 1 :(得分:0)
我找到了一个临时解决方案,可以将两个dag都包裹在锁定层中。
我的意思是,我们在开始时添加了一个简单的任务来锁定数据库中的特定行,然后在dag的末尾添加了一个简单的任务来解锁锁定的行。
因此,当两个dag中的一个当前正在执行而另一个则要开始时,由于无法锁定两个dag都知道的特定行,因此它只会被阻塞。
下面是对锁定层的简单描述
dag1 :lock_operator,task1,unlock_operator。
dag2 :lock_operator,task1,unlock_operator。
当然,如果lock_operator无法锁定行,我们可以让它失败,然后将retries_count设置为很高,以便我们保证它仍将重试锁定,直到可以。