Airflow 如何创建稍微复杂的气流分支操作符?

Airflow 如何创建稍微复杂的气流分支操作符?,airflow,airflow-operator,Airflow,Airflow Operator,我有三个必需的基本节点(PythonOperators),我需要按顺序调用它们。让我们考虑一个场景,我的系统以一个 JPEG文件的形式接收形状。我在文件上运行了三个函数: 第一个函数将更改形状的颜色,成功后: 形状被传递到第二个函数,该函数将形状旋转90度,然后,成功后: 形状被传递到第三个函数,该函数将以某种预定的方式变换形状,然后,成功后,程序完成 所以,我有三件事情需要按顺序进行:更改颜色->旋转->变换。 我希望添加一个BranchingOperator,它将在成功时(由这三个节点中的每

我有三个必需的基本节点(PythonOperators),我需要按顺序调用它们。让我们考虑一个场景,我的系统以一个<代码> JPEG文件的形式接收形状。我在文件上运行了三个函数:

  • 第一个函数将更改形状的颜色,成功后:
  • 形状被传递到第二个函数,该函数将形状旋转90度,然后,成功后:
  • 形状被传递到第三个函数,该函数将以某种预定的方式变换形状,然后,成功后,程序完成
  • 所以,我有三件事情需要按顺序进行:更改颜色->旋转->变换。 我希望添加一个BranchingOperator,它将在成功时(由这三个节点中的每个节点的“成功”返回值确定)移动到列表中的下一个节点,或在程序结束时终止。在失败时(由每个节点的“FAILURE”返回值确定),程序将前进到一个失败节点(我想是另一个PythonOperator),该节点将做一些事情(将错误保存在某个数据库中,提取一些细节和原因,无论什么——都不重要)

    但我在弄清楚如何在气流中这样做时遇到了一些困难。这些文件还没有。。当谈到气流的分支操作符时,它太有用了,我还没有在网上找到那么多的例子。有人能帮忙吗

    谢谢

    编辑: 好的,让事情变得更具体一点,以下是我目前拥有的并认为我需要的:

    def branch_func_from_standardization(**context):
        if context['mode'] == 'FAILURE':
            return 'failure_node'
        return 'rotate_shapes'
    
    
    def branch_func_from_rotate(**context):
        if context['mode'] == 'FAILURE':
            return 'failure_node'
        return 'transform_shapes'
    
    
    def failure_node(**context):
        print("FAILURE")
    
    
    with dag:
        color_task = PythonOperator(
            task_id="color_shapes",
            dag=dag,
            python_callable=color_shape,
            provide_context=True
        )
    
        rotate_task = PythonOperator(
            task_id="rotate_shapes",
            dag=dag,
            python_callable=rotate_shape,
            provide_context=True
        )
    
        transform_task = PythonOperator(
            task_id="transform_shapes",
            dag=dag,
            python_callable=transform_shape,
            provide_context=True
        )
    
        failure_task = PythonOperator(
            task_id="failure_node",
            dag=dag,
            provide_context=True,
            python_callable=failure_node
        )
    
        branching_task_color = BranchPythonOperator(
            task_id='branch_task_color',
            provide_context=True,
            python_callable=branch_func_from_color
        )
    
        branching_task_rotate = BranchPythonOperator(
            task_id='branch_task_rotate',
            provide_context=True,
            python_callable=branch_func_from_rotate
        )
    
    不要担心可调用函数。。。我不100%知道我是否在提供的callable中正确使用了
    上下文
    ,但尽管如此,我只想关注图形。我想要一个图表,在气流中,如下所示:

                                                                                                                                                  |---> END_PROGRAM
                                                                                         |---> transform_shapes ---> branch_task_transform ------- 
                                           |---> rotate_shapes ---> branch_task_rotate---                                                         |
    color_shapes ---> branch_task_color ---                                              |                                                        |
                                           |----------------------------------------------------------------------------------------------------------> failure_node
    
    

    好的,代码中没有分支任务转换,但是你明白了。我他妈的怎么能在空气中这么做?要重申,对于任何故障,我需要转到
    failure_节点
    ;对于成功,我只是继续前进。失败是由python可调用函数的返回值决定的。

    每个任务都应该像一个小脚本(运行几分钟),而不是运行几秒钟的东西。在本例中,单个图像处理任务可能每个仅需1-2秒(在普通硬件上),但调度延迟b/w连续任务将很容易在每个处理的图像上增加约20-30秒(如果您在具有多个DAG的CeleryExecutor部署上执行此操作,则会更大)。我强烈建议将这些操作合并到单个任务中。气流是cron的替代品,而不是优步的Cadence(实时TXN/流媒体管道)。这是一个极好的观察结果,我将与团队分享。在任何情况下,你对如何做我所要求的事情有什么建议吗?你调查过吗?XCOM允许任务交换消息,允许更细微的控制形式和共享状态。该名称是“交叉通信”的缩写。XCom主要由键、值和时间戳定义,但也跟踪创建XCom的task/DAG等属性以及该属性何时可见。任何可以pickle的对象都可以用作XCom值,因此用户应该确保使用适当大小的对象。非常感谢您对Philipp的评论。我会调查的。其他任何人看一看,都会非常感激回答:)谢谢大家!这些意见已在本报告中作了进一步阐述