自定义操作员XCom在Airflow运行期间

时间:2019-12-13 15:34:43

标签: airflow apache-airflow-xcom

我了解PythonOperator/BashOperator,我们可以使用Xcom进行通信。

例如

def func(**context):
    context['task_instance'].xcom_pull()

但是,我想知道如何在运行时访问自定义运算符的xcom

我的接线员看起来像这样:

class ECHOXOperator(BaseOperator):
    @apply_defaults
    def __init__(self, x, *args, **kwargs):
        self.x = x
        super(ECHOXOperator, self).__init__(*args, **kwargs)

    def execute(self, context):
        print(self.x)

所以在我的DAG中:

我可以做到

task2 = ECHOXOperator(x = 'Hello")

而且效果很好。但是如何从上游任务访问x?

类似的东西:

def task1(**context):
    task_instance = context['task_instance']
    task_instance.xcom_push(key="x", value="Hello")

generate_data = PythonOperator(
    task_id="task1",
    python_callable=task1,
    dag=dag,
)

task2 = ECHOXOperator(x = task_instance.xcom_pull('task1', 'x'), provide_context=True)

task1 >> task2

此操作无效,因为未定义task_instance中的ECHOXOperator

谢谢

1 个答案:

答案 0 :(得分:0)

您应该在自定义运算符中将x作为 templated_fields 传递。

class ECHOXOperator(BaseOperator):
    template_fields = ('x')

    @apply_defaults
    def __init__(self, x, *args, **kwargs):
        self.x = x
        super(ECHOXOperator, self).__init__(*args, **kwargs)

    def execute(self, context):
        print(self.x)

现在您可以执行以下操作来获取在上一个任务中传递的Xcom的值:

def task1(**context):
    task_instance = context['task_instance']
    task_instance.xcom_push(key="x", value="Hello")

generate_data = PythonOperator(
    task_id="task1",
    python_callable=task1,
    dag=dag,
)

task2 = ECHOXOperator(x = "{{ ti.xcom_pull('task1', 'x') }}")

task1 >> task2

有关 templated_fields 和Jinja模板的更多信息:https://airflow.readthedocs.io/en/latest/concepts.html#id1