Python 气流调度器是否可以先在前一天完成';在开始下一个循环之前,先进行循环?
现在,我的DAG中的节点在该DAG的其余节点完成之前进入第二天的任务。有没有办法让它等待DAG的其余部分完成,然后再进入第二天的DAG周期 (我确实将dependens_on_past视为true,但在这种情况下不起作用) 我的DAG看起来像这样:Python 气流调度器是否可以先在前一天完成';在开始下一个循环之前,先进行循环?,python,apache,python-3.x,scheduler,airflow,Python,Apache,Python 3.x,Scheduler,Airflow,现在,我的DAG中的节点在该DAG的其余节点完成之前进入第二天的任务。有没有办法让它等待DAG的其余部分完成,然后再进入第二天的DAG周期 (我确实将dependens_on_past视为true,但在这种情况下不起作用) 我的DAG看起来像这样: O l V O -> O -> O -> O -> O dag = DAG(dag_id='TEST_DAG', default_ar
O
l
V
O -> O -> O -> O -> O
dag = DAG(dag_id='TEST_DAG', default_args=default_args, schedule_interval=timedelta(minutes=30))
PREVIOUS = ExternalTaskSensor(
task_id='Previous_Run',
external_dag_id='TEST_DAG',
external_task_id='All_Tasks_Completed',
allowed_states=['success'],
execution_delta=timedelta(minutes=30),
dag=DAG
)
T1 = BashOperator(
task_id='TASK_01',
bash_command='echo "Hello World from Task 1"',
dag=dag
)
COMPLETE = DummyOperator(
task_id='All_Tasks_Completed',
dag=DAG
)
PREVIOUS >> T1 >> COMPLETE
另外,dag的树状图]
如果希望一次只运行一个实例,请尝试设置
max_active_runs=1回答这个问题可能有点晚,但我遇到了同样的问题,我解决这个问题的方法是在每个dag中添加两个额外的任务。开始时为“上一步”,结束时为“完成”。“上一个任务”是监视上一个作业的外部任务传感器。Complete只是一个虚拟操作符。假设它每30分钟运行一次,因此dag将如下所示:
O
l
V
O -> O -> O -> O -> O
dag = DAG(dag_id='TEST_DAG', default_args=default_args, schedule_interval=timedelta(minutes=30))
PREVIOUS = ExternalTaskSensor(
task_id='Previous_Run',
external_dag_id='TEST_DAG',
external_task_id='All_Tasks_Completed',
allowed_states=['success'],
execution_delta=timedelta(minutes=30),
dag=DAG
)
T1 = BashOperator(
task_id='TASK_01',
bash_command='echo "Hello World from Task 1"',
dag=dag
)
COMPLETE = DummyOperator(
task_id='All_Tasks_Completed',
dag=DAG
)
PREVIOUS >> T1 >> COMPLETE
因此,下一个dag即使进入队列,也不会让任务运行,直到上一个任务完成。最终对我有效的是
您可以实现相同的目标,而无需执行任何其他任务。诀窍是
添加从第一个任务到最后一个任务的依赖项,并为第一个任务设置wait_for_down=True
在这种情况下,下一次运行的第一个任务将等待当前运行的最后一个任务完成。因此,未来的竞选将被搁置。然后,您可以将max\u active\u runs=1
设置为限制此类保留计划
这里给出了一个详细的例子
看看依赖关系
with DAG('dag_past_run_sense',
schedule_interval='*/2 * * * *',
default_args=default_args,
max_active_runs=1) as dag:
read_incr_data = BashOperator(
task_id='read_incr_data',
wait_for_downstream=True,
bash_command='date'
)
prepare_scd2 = BashOperator(
task_id='prepare_scd2',
bash_command='date'
)
load_final_table = PythonOperator(
task_id="load_final_table",
python_callable=load_final_table_status
)
read_incr_data >> prepare_scd2 >> load_final_table
read_incr_data >> load_final_table
@不,如果我猜的话(我没有投反对票),那是因为那个答案并没有强制执行命令b@nono我同意乔布的观点。换句话说,通过设置max_active_runs=1,无法保证前一个DAG实例成功完成。事实上,我遇到了一些问题,以防对其他人有所帮助-1)确保您没有使用单线程的
SequentialExecutor
(默认值)。这将导致第二个传感器在第一个实际作业之前运行,并且任务处于排队状态时将处于死锁状态。2) 您可能希望在开始处添加latestonloyoperator
,以跳过回填3)如果这样做,您需要更新允许的状态
,以包括“跳过的”
状态,4)如果不这样做,则需要手动标记第一个任务成功以摆脱初始死锁状态。您可以设置wait\u for\u down=True
“当设置为true时,task X实例将等待task X上一个实例下游的任务成功完成后再运行。如果任务X的不同实例改变了相同的资源,并且该资源由任务X的下游任务使用,则此功能非常有用。请注意,无论在何处使用wait_for_down,depend_on_pass都将强制为True。“这在airflow 1.9中起作用。另一个注释:我必须手动标记“上一次运行”的第一个实例“任务是成功的。如果没有,它将永远等待以前不存在的执行时间。您可以使用sequentialExecutor,只需将max_active_runs=1放在DAG中。从功能上讲,这与@Oleg Yamin下面描述的ExternalTaskSensor
方法有什么不同或更好的地方吗?