Airflow 如果上一个任务执行需要更多时间,将跳过气流计划

Airflow 如果上一个任务执行需要更多时间,将跳过气流计划,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我的气流DAG中有两个任务。一个触发API调用(Http操作符),另一个使用另一个API(Http传感器)不断检查其状态。该DAG计划每小时&10分钟运行一次。但有时一次执行可能需要很长时间才能完成,例如20小时。在这种情况下,前一个任务运行时的所有计划都不会执行 例如,如果我在01:10完成这项工作需要10个小时。附表02:10,03:10,04:10。。。应运行的11:10 etc将被跳过,仅执行12:10的etc 我用的是当地的遗嘱执行人。我正在使用下面的脚本运行airflow serve

我的气流DAG中有两个任务。一个触发API调用(Http操作符),另一个使用另一个API(Http传感器)不断检查其状态。该DAG计划每小时&10分钟运行一次。但有时一次执行可能需要很长时间才能完成,例如20小时。在这种情况下,前一个任务运行时的所有计划都不会执行

例如,如果我在01:10完成这项工作需要10个小时。附表02:10,03:10,04:10。。。应运行的11:10 etc将被跳过,仅执行12:10的etc

我用的是当地的遗嘱执行人。我正在使用下面的脚本运行airflow server&scheduler。
start\u server.sh

export AIRFLOW_HOME=./airflow_home;
export AIRFLOW_GPL_UNIDECODE=yes;
export AIRFLOW_CONN_REST_API=http://localhost:5000;
export AIRFLOW_CONN_MANAGEMENT_API=http://localhost:8001;
airflow initdb;
airflow webserver -p 7200;
export AIRFLOW_HOME=./airflow_home;
# Connection string for connecting to REST interface server
export AIRFLOW_CONN_REST_API=http://localhost:5000;
export AIRFLOW_CONN_MANAGEMENT_API=http://localhost:8001;
#export AIRFLOW__SMTP__SMTP_PASSWORD=**********;
airflow scheduler;
start\u scheduler.sh

export AIRFLOW_HOME=./airflow_home;
export AIRFLOW_GPL_UNIDECODE=yes;
export AIRFLOW_CONN_REST_API=http://localhost:5000;
export AIRFLOW_CONN_MANAGEMENT_API=http://localhost:8001;
airflow initdb;
airflow webserver -p 7200;
export AIRFLOW_HOME=./airflow_home;
# Connection string for connecting to REST interface server
export AIRFLOW_CONN_REST_API=http://localhost:5000;
export AIRFLOW_CONN_MANAGEMENT_API=http://localhost:8001;
#export AIRFLOW__SMTP__SMTP_PASSWORD=**********;
airflow scheduler;
my\u dag\u file.py

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': airflow.utils.dates.days_ago(2),
    'email': admin_email_ids,
    'email_on_failure': False,
    'email_on_retry': False

}

DAG_ID = 'reconciliation_job_pipeline'

MANAGEMENT_RES_API_CONNECTION_CONFIG = 'management_api'
DA_REST_API_CONNECTION_CONFIG = 'rest_api'

recon_schedule = Variable.get('recon_cron_expression',"10 * * * *")
dag = DAG(DAG_ID, max_active_runs=1, default_args=default_args,
          schedule_interval=recon_schedule,
          catchup=False)
dag.doc_md = __doc__

spark_job_end_point = conf['sip_da']['spark_job_end_point']
fetch_index_record_count_config_key = conf['reconciliation'][
    'fetch_index_record_count']


fetch_index_record_count = SparkJobOperator(
    job_id_key='fetch_index_record_count_job',
    config_key=fetch_index_record_count_config_key,
    exec_id_req=False,
    dag=dag,
    http_conn_id=DA_REST_API_CONNECTION_CONFIG,
    task_id='fetch_index_record_count_job',
    data={},
    method='POST',
    endpoint=spark_job_end_point,
    headers={
        "Content-Type": "application/json"}
)

job_endpoint = conf['sip_da']['job_resource_endpoint']

fetch_index_record_count_status_job = JobStatusSensor(
    job_id_key='fetch_index_record_count_job',
    http_conn_id=DA_REST_API_CONNECTION_CONFIG,
    task_id='fetch_index_record_count_status_job',
    endpoint=job_endpoint,
    method='GET',
    request_params={'required': 'status'},
    headers={"Content-Type": "application/json"},
    dag=dag,
    poke_interval=15
)

fetch_index_record_count>>fetch_index_record_count_status_job

SparkJobOperator
JobStatusSensor
我的自定义类扩展
simplehttppoperator
HttpSensor


如果我设置
依赖于过去
它会按预期工作吗?。此选项的另一个问题是,状态检查作业有时会失败。但下一个时间表应该会触发。如何实现此行为?

我认为这里的主要讨论点是您设置的是
catchup=False
,可以找到更多详细信息。因此,airflow scheduler将跳过这些任务执行,您将看到您提到的行为

如果前一个过程花费的时间比预期的要长,那么听起来您需要执行catchup。您可以尝试更改它
catchup=True