气流 - SubDag中长时间运行的任务在一小时后标记为失败

时间:2017-05-31 01:49:01

标签: python airflow

我的气流中的SubDAG具有长时间运行的步骤(通常约2小时,但根据运行的单位而变化)。在1.7.1.3下,当步骤中的所有步骤都成功时,此步骤将始终导致AIRFLOW-736并且SubDAG将停止在“运行”状态。我们可以通过手动将SubDagOperator标记为在数据库中成功(而不是运行)来在SubDAG之后没有步骤来解决这个问题。

我们现在正在测试Airflow 1.8.1,通过执行以下操作进行升级:

  1. 打倒我们的日程安排人员和工作人员
  2. 通过pip,卸载气流并安装apache-airflow(版本1.8.1)
  3. Runing airflow updatedb
  4. 运行气流调度程序和工作人员
  5. 在系统不受影响的情况下,相同的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
    )
    

1 个答案:

答案 0 :(得分:1)

如果您确实在Celery上运行,Redis会查看Celery的visibility timeout setting并将其增加到预期的任务结束时间之外。

虽然我们将Celery配置为任务-ack-late,但仍然存在任务消失的问题。我们在Celery中考虑这个a bug