You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MWAA Airflow工作流中设置训练任务按月执行,其余步骤每周执行?

解决方案:在MWAA Airflow中实现按周期跳过训练任务

针对你的需求,这里提供两种实用的Airflow配置方案,让训练任务仅每月执行一次,同时保证数据处理和批量推理每周正常运行:

方法1:使用ShortCircuitOperator控制训练任务执行

ShortCircuitOperator会根据判断结果决定是否触发后续任务。如果判断为False,训练任务会被标记为"skipped",且不影响后续批量推理任务的执行。

代码示例

from airflow import DAG
from airflow.operators.python import ShortCircuitOperator, PythonOperator
from datetime import datetime, timedelta

def data_processing_func():
    # 数据处理业务逻辑
    print("执行数据处理任务")

def train_func():
    # 模型训练业务逻辑
    print("执行训练任务")

def batch_inference_func():
    # 批量推理业务逻辑
    print("执行批量推理任务")

def should_run_training(**context):
    # 判断当前执行日期是否为每月1号(可根据需求调整日期规则)
    execution_date = context['execution_date']
    return execution_date.day == 1

default_args = {
    'owner': 'ml-team',
    'depends_on_past': False,
    'start_date': datetime(2024, 1, 1),
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

with DAG(
    'ml_workflow',
    default_args=default_args,
    description='机器学习训练工作流',
    schedule_interval='@weekly',  # 每周调度一次
    catchup=False,
) as dag:

    data_processing = PythonOperator(
        task_id='data_processing',
        python_callable=data_processing_func
    )

    check_training = ShortCircuitOperator(
        task_id='check_training',
        python_callable=should_run_training,
        provide_context=True
    )

    train = PythonOperator(
        task_id='train',
        python_callable=train_func
    )

    batch_inference = PythonOperator(
        task_id='batch_inference',
        python_callable=batch_inference_func
    )

    # 任务依赖设置:数据处理后检查是否需要训练;训练完成后执行推理,同时数据处理直接触发推理(确保每周必跑)
    data_processing >> check_training >> train >> batch_inference
    data_processing >> batch_inference

逻辑说明

  • 工作流按每周频率调度,满足数据处理和批量推理的周期需求
  • should_run_training函数通过执行日期判断是否触发训练,灵活适配每月一次的要求
  • 批量推理任务同时关联数据处理和训练任务,确保无论训练是否执行,每周都会正常运行

方法2:使用BranchPythonOperator实现分支逻辑

通过分支操作符,让工作流在每月指定日期走"数据处理→训练→批量推理"流程,非指定日期直接走"数据处理→批量推理"流程,完全跳过训练任务。

代码示例

from airflow import DAG
from airflow.operators.python import PythonOperator, BranchPythonOperator
from datetime import datetime, timedelta

# 数据处理、训练、批量推理函数同方法1

def choose_branch(**context):
    execution_date = context['execution_date']
    # 如果是每月1号,进入训练分支;否则直接跳转到批量推理
    if execution_date.day == 1:
        return 'train'
    else:
        return 'batch_inference'

with DAG(
    'ml_workflow_branch',
    default_args=default_args,
    description='机器学习训练工作流(分支版本)',
    schedule_interval='@weekly',
    catchup=False,
) as dag:

    data_processing = PythonOperator(
        task_id='data_processing',
        python_callable=data_processing_func
    )

    branch = BranchPythonOperator(
        task_id='branch',
        python_callable=choose_branch,
        provide_context=True
    )

    train = PythonOperator(
        task_id='train',
        python_callable=train_func
    )

    batch_inference = PythonOperator(
        task_id='batch_inference',
        python_callable=batch_inference_func,
        trigger_rule='none_failed_min_one_success'  # 确保任一上游分支成功都能触发推理
    )

    # 任务依赖设置
    data_processing >> branch >> [train, batch_inference]
    train >> batch_inference

逻辑说明

  • choose_branch函数根据执行日期动态选择任务路径
  • batch_inference任务设置trigger_rule='none_failed_min_one_success',避免因分支路径未执行导致推理任务被阻塞
  • 保持每周调度频率,每月仅一次会触发训练分支

注意事项

  • 可根据实际需求调整日期判断逻辑,比如改为每月第一个周一、指定工作日等
  • 上述代码完全兼容MWAA环境,无需额外配置
  • 开启catchup=False可避免历史任务重复执行,符合生产环境需求

内容的提问来源于stack exchange,提问作者dewdrops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:40:19