Airflow 如何重试完成DAG?
我知道可以重试单个任务,但是可以重试完成DAG吗Airflow 如何重试完成DAG?,airflow,Airflow,我知道可以重试单个任务,但是可以重试完成DAG吗 我动态创建任务,这就是为什么我需要重试的不是特定的任务,而是完成DAG。如果气流不支持,可能有一些解决方法。如果您可以访问气流UI,请转到图表视图 在图形视图中,单个任务标记为方框,DAG运行作为一个整体用圆圈表示。单击一个圆圈,然后单击清除选项。这将重新启动整个运行 或者,您可以转到树状视图,清除DAG中的第一个任务。转到气流界面,单击DAG的第一个任务,在“清除”按钮右侧选择“下游”和“递归”,然后按“清除”。这会将DAG标记为“尚未运行”,
我动态创建任务,这就是为什么我需要重试的不是特定的任务,而是完成DAG。如果气流不支持,可能有一些解决方法。如果您可以访问气流UI,请转到图表视图 在图形视图中,单个任务标记为方框,DAG运行作为一个整体用圆圈表示。单击一个圆圈,然后单击
清除
选项。这将重新启动整个运行
或者,您可以转到树状视图,清除DAG中的第一个任务。转到气流界面,单击DAG的第一个任务,在“清除”按钮右侧选择“下游”和“递归”,然后按“清除”。这会将DAG标记为“尚未运行”,并在DAG计划允许的情况下重新运行它我编写了下面的脚本,并在airflow master上计划它,以便为“DAG ID到监视器”数组中提到的DAG重新运行失败的DAG运行
import subprocess
import re
from datetime import datetime
dag_ids_to_monitor = ['dag1','dag2','dag2']
def runBash(cmd):
print ("running bash command {}".format(cmd))
output = subprocess.check_output(cmd.split())
return output
def datetime_valid(dt_str):
try:
datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S')
print(dt_str)
print(datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S'))
except:
return False
return True
def get_schedules_to_rerun(dag_id):
bashCommand = "airflow list_dag_runs --state failed {dag_id}".format(dag_id=dag_id)
output = runBash(bashCommand)
schedules_to_rerun = []
for line in output.split('\n'):
parts = re.split("\s*\|\s*", line)
if len(parts) > 4 and datetime_valid(parts[3][:-6]):
schedules_to_rerun.append(parts[3])
return schedules_to_rerun
def trigger_runs(dag_id, re_run_start_times):
for start_time in re_run_start_times:
runBash("airflow clear --no_confirm --start_date {sd} --end_date {sd} {dag_id}".format(sd=start_time, dag_id=dag_id))
def rerun_failed_dag_runs(dag_id):
re_run_start_times = get_schedules_to_rerun(dag_id)
trigger_runs(dag_id,re_run_start_times)
for dag_id in dag_ids_to_monitor:
rerun_failed_dag_runs(dag_id)