Airflow 以编程方式将任务实例状态设置为已跳过

Airflow 以编程方式将任务实例状态设置为已跳过,airflow,Airflow,我有一个循环创建任务的列表。列表的大小是静态的 for counter, account_id in enumerate(ACCOUNT_LIST): task_id = f"bash_task_{counter}" if account_id: trigger_task = BashOperator( task_id=task_id,

我有一个循环创建任务的列表。列表的大小是静态的

        for counter, account_id in enumerate(ACCOUNT_LIST):
            task_id = f"bash_task_{counter}"
            if account_id:
                trigger_task = BashOperator(
                    task_id=task_id,
                    bash_command="echo hello there",
                    dag=dag)
            else:
                trigger_task = BashOperator(
                    task_id=task_id,
                    bash_command="echo hello there",
                    dag=dag)
                trigger_task.status = SKIPPED # is there way to somehow set status of this to skipped instead of having a branch operator?
            trigger_task

我手动尝试了此操作,但无法跳过此任务:

        start = DummyOperator(task_id='start')
        task1 = DummyOperator(task_id='task_1')
        task2 = DummyOperator(task_id='task_2')
        task3 = DummyOperator(task_id='task_3')
        task4 = DummyOperator(task_id='task_4')

        start >> task1
        start >> task2

        try:
            start >> task3
            raise AirflowSkipException
        except AirflowSkipException as ase:
            log.error('Task Skipped for task3')
            
        try:
            start >> task4
            raise AirflowSkipException
        except AirflowSkipException as ase:
            log.error('Task Skipped for task4')

是,您需要
提出气流SkipException

从airflow.exceptions导入airflowskipeexception
上升气流速度异常

有关更多信息,请参见是,您需要
提出气流SkipException

从airflow.exceptions导入airflowskipeexception
上升气流速度异常

有关更多信息,请参见“每个DAG有固定数量的任务要执行”。这真的很好,而且还计划了在不降低下游系统性能的情况下,您的系统应该处理多少最大并行任务。此外,拥有固定数量的任务使其在web UI中可见,并指示它们是执行还是跳过

在下面的代码中,我用
None
项初始化了列表,然后根据数据库返回的数据用值更新列表。在
python\u callable
函数中,检查
account\u id
是否为
None
,然后引发
airflowskipeexception
,否则执行该函数。在UI中,任务是可见的,并指示是执行还是跳过(意味着没有
帐户\u id


每个DAG有固定数量的任务要执行。这真的很好,而且还计划了在不降低下游系统性能的情况下,您的系统应该处理多少最大并行任务。此外,拥有固定数量的任务使其在web UI中可见,并指示它们是执行还是跳过

在下面的代码中,我用
None
项初始化了列表,然后根据数据库返回的数据用值更新列表。在
python\u callable
函数中,检查
account\u id
是否为
None
,然后引发
airflowskipeexception
,否则执行该函数。在UI中,任务是可见的,并指示是执行还是跳过(意味着没有
帐户\u id


这不起作用。请参阅手动添加任务的更新问题Shi alltej。。。当您将所使用的代码置于DAG级别时,它不会被气流执行。在执行的
task_实例
期间,需要内联
raise AirflowSkipException
或执行代码的一部分。因此,它应该在您打算跳过的任务的操作员执行方法中。这不起作用。请参阅手动添加任务的更新问题Shi alltej。。。当您将所使用的代码置于DAG级别时,它不会被气流执行。在执行的
task_实例
期间,需要内联
raise AirflowSkipException
或执行代码的一部分。因此,它应该在您要跳过的任务的操作员执行方法中。@alltej您混淆了它<代码>气流SkipeException必须在操作员代码中提出(而不是在您的
DAG
定义代码中提出)。你想在这里做什么还不清楚;但也不可能(在DAG定义期间不能标记任务的状态,因为它尚未运行)。要以预定义的方式跳过任务,您可以[1](更容易)创建并有条件地将它们连接在一起[2],或者使用
BranchPythonOperator
/
ShortCircuitOperator
您有代码示例吗?我正试图避免使用BranchOperator,因为它看起来太像了overkill@alltej你把它弄糊涂了<代码>气流SkipeException必须在操作员代码中提出(而不是在您的
DAG
定义代码中提出)。你想在这里做什么还不清楚;但也不可能(在DAG定义期间不能标记任务的状态,因为它尚未运行)。要以预定义的方式跳过任务,您可以[1](更容易)创建并有条件地将它们连接在一起[2],或者使用
BranchPythonOperator
/
ShortCircuitOperator
您有代码示例吗?我试图避免使用BranchOperator,因为它看起来太过复杂了
    def execute(account_id):
        if account_id:
            print(f'************Executing task for account_id:{account_id}')
        else:
            raise AirflowSkipException

    def create_task(task_id, account_id):
        return PythonOperator(task_id=task_id,
                              python_callable=execute,
                              op_args=[account_id])


    list_from_dbhook = [1, 2, 3] # dummy list. Get records using DB Hook

    # Need to have some fix size. Need to allocate fix resources or # of tasks.
    # Having this fixed number of tasks will make this tasks to be visible in UI instead of being purely dynamic
    record_size_limit = 5 
    
    ACCOUNT_LIST = [None] * record_size_limit
    for index, account_id_val in enumerate(list_from_dbhook):
        ACCOUNT_LIST[index] = account_id_val

    for idx, acct_id in enumerate(ACCOUNT_LIST):
        task = create_task(f"task_{idx}", acct_id)
        task