在Airflow DAG中,我有一个任务需要知道它是第一次运行还是重试运行。如果尝试重试,则需要调整任务的逻辑。
我对如何存储任务的重试次数有一些想法,但是我不确定其中是否合法,或者是否有更简单的方法可以在任务中获取此信息。
>我想知道是否可以在每次运行任务时附加的dag中包含一个整数变量。然后,如果任务重新运行,我可以检查变量的值以查看其是否大于1,因此将重试运行。但是我不确定可变的全局变量在Airflow中是否能以这种方式工作,因为可以有多个工作人员来执行不同的任务(不过我不确定)。
将其写入XCOM变量吗?
答案 0 :(得分:7)
重试编号可从任务实例获得,可通过宏{{ task_instance }}
获得。 https://airflow.apache.org/code.html#default-variables
如果您正在使用python运算符,只需将provide_context=True,
添加到您的运算符kwargs中,然后在可调用对象中添加kwargs['task_instance'].try_number
否则,您可以执行以下操作:
t = BashOperator(
task_id='try_number_test',
bash_command='echo "{{ task_instance.try_number }}"',
dag=dag)
编辑:
清除任务实例后,它将把max_retry号设置为当前try_number +重试值。因此,您可以执行以下操作:
ti = # whatever method you do to get the task_instance object
is_first = ti.max_tries - ti.task.retries + 1 == ti.try_number
运行时,气流将try_number递增1,所以我想从配置的重试值中减去max_tries时需要+ 1。但是我没有测试确认
答案 1 :(得分:1)
@cwurtz 的回答恰到好处。我可以这样使用它:
def _get_actual_try_number(self, context):
'''
Returns the real try_number that you also see in task details or logs.
'''
return context['task_instance'].try_number
def _get_relative_try_number(self, context):
'''
When a task is cleared, the try_numbers continue to increment.
This returns the try number relative to the last clearing.
'''
ti = context['task_instance']
actual_try_number = self._get_actual_try_number(context)
# When the task instance is cleared, it will set the max_retry
# number to be the current try_number + retry value.
# From https://stackoverflow.com/a/51757521
relative_first_try = ti.max_tries - ti.task.retries + 1
return actual_try_number - relative_first_try + 1