Airflow 如何创建稍微复杂的气流分支操作符?
我有三个必需的基本节点(PythonOperators),我需要按顺序调用它们。让我们考虑一个场景,我的系统以一个<代码> JPEG文件的形式接收形状。我在文件上运行了三个函数:Airflow 如何创建稍微复杂的气流分支操作符?,airflow,airflow-operator,Airflow,Airflow Operator,我有三个必需的基本节点(PythonOperators),我需要按顺序调用它们。让我们考虑一个场景,我的系统以一个 JPEG文件的形式接收形状。我在文件上运行了三个函数: 第一个函数将更改形状的颜色,成功后: 形状被传递到第二个函数,该函数将形状旋转90度,然后,成功后: 形状被传递到第三个函数,该函数将以某种预定的方式变换形状,然后,成功后,程序完成 所以,我有三件事情需要按顺序进行:更改颜色->旋转->变换。 我希望添加一个BranchingOperator,它将在成功时(由这三个节点中的每
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的评论。我会调查的。其他任何人看一看,都会非常感激回答:)谢谢大家!这些意见已在本报告中作了进一步阐述