我无法通过BashOperator xcom_push一个参数

时间:2019-02-11 20:06:23

标签: airflow apache-airflow-xcom

我是Airflow的xcom功能的新手。我使用PythonOperator进行了尝试,并且运行良好(即,我可以将值推入和拉出上下文),但是当我在BashOperator上进行尝试时,它不起作用。但是,通过在任务创建过程中添加xcom_push = True属性,我只能拉出最终的stdout语句。那是一回事。 2)但我也希望像我们在PythonOp中那样,基于它们的键(与BashOp之间的键)推和拉值。这将非常有帮助,因为我需要将大量变量从一个脚本传递给另一个。

2 个答案:

答案 0 :(得分:2)

这是您想要的吗?

from datetime import datetime
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator

dag = DAG(
    dag_id="example_bash_operator_1",
    schedule_interval=None,
    start_date=datetime(2018, 12, 31),
)

t1 = BashOperator(
    task_id="t1",
    bash_command='echo "{{ ti.xcom_push(key="k1", value="v1") }}" "{{ti.xcom_push(key="k2", value="v2") }}"',
    dag=dag,
)

t2 = BashOperator(
    task_id="t2",
    bash_command='echo "{{ ti.xcom_pull(key="k1") }}" "{{ ti.xcom_pull(key="k2") }}"',
    dag=dag,
)

t1 >> t2

答案 1 :(得分:0)

@SpaceyBot和Lucas回答了您的第一个问题。 关于提出的第二个问题

Blockquote

2)但我也希望像在PythonOp中一样,根据它们的键(与BashOp进行键值)来推和拉值。这将非常有帮助,因为我需要从一个脚本复制到另一个脚本。

Blockquote

  • 这是不可取的。所有XCom的拉/推动作都将转换为气流数据库中的插入/选择语句。 这将由于时间的原因而降低调度程序的性能,并降低整个处理的速度,这可能是因为存在大量的pull(queries)运行,或者是由于要通过全表扫描而不是基于索引的扫描来检索的行数很大。

因此,最好在这里考虑一种不同的机制-将信息存储在外部json / csv / txt文件/ ..等中。

底线-XCom设计为仅传输少量数据,主要是计数器和状态变量。