我的气流中的SubDAG具有长时间运行的步骤(通常约2小时,但根据运行的单位而变化)。在1.7.1.3下,当步骤中的所有步骤都成功时,此步骤将始终导致AIRFLOW-736并且SubDAG将停止在“运行”状态。我们可以通过手动将SubDagOperator标记为在数据库中成功(而不是运行)来在SubDAG之后没有步骤来解决这个问题。
我们现在正在测试Airflow 1.8.1,通过执行以下操作进行升级:
在系统不受影响的情况下,相同的DAG现在在长时间运行的任务达到1小时标记后大致失败100%(尽管很奇怪,不是3600秒之后 - 它可以是30到90之间的任何地方小时滴答后的几秒钟,并显示消息“执行程序报告任务实例已完成(失败),尽管该任务表明其正在运行。该任务是否被外部杀死?”。但是,任务本身继续在工作者身上继续运行。不知何故,尽管实际任务运行良好,但是在调度任务失败的情况下(见jobs.py的this line),尽管实际任务运行良好,但调度程序之间存在分歧。
我已经确认,不知何故,气流数据库的task_instance表中的状态是“失败”。因此,我想知道在任务本身仍在运行时可能将任务状态设置为失败的原因。
这是一个触发问题的示例dag:
from datetime import datetime
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.subdag_operator import SubDagOperator
DEFAULT_ARGS = {'owner': 'jdoe', 'start_date': datetime(2017, 05, 30)}
def define_sub(dag, step_name, sleeptime):
op = BashOperator(
task_id=step_name, bash_command='sleep %i' % sleeptime,queue="model", dag=dag
)
return dag
def gen_sub_dag(parent_name, step_name, sleeptime):
sub = DAG(dag_id='%s.%s' % (parent_name, step_name), default_args=DEFAULT_ARGS)
define_sub(sub, step_name, sleeptime)
return sub
long_runner_parent = DAG(dag_id='long_runner', default_args=DEFAULT_ARGS, schedule_interval=None)
long_sub_dag = SubDagOperator(
subdag=gen_sub_dag('long_runner', 'long_runner_sub', 7500), task_id='long_runner_sub', dag=long_runner_parent
)
答案 0 :(得分:1)
如果您确实在Celery上运行,Redis会查看Celery的visibility timeout setting并将其增加到预期的任务结束时间之外。
虽然我们将Celery配置为任务-ack-late,但仍然存在任务消失的问题。我们在Celery中考虑这个a bug。