Airflow BashOperator收集返回代码

时间:2017-02-17 07:53:20

标签: python airflow

因为我刚刚开始使用Airflow而忍受我,而我正在尝试做的是从BashOperator任务收集返回代码并将其保存到局部变量,然后基于该返回代码分支出来另一项任务。我的问题是弄清楚如何让BashOperator返回一些东西。以下是我的代码段:

dag = DAG(dag_id='dag_1',
      default_args=default_args,
      schedule_interval='0 2 * * *',
      user_defined_macros=user_def_macros,
      dagrun_timeout=timedelta(minutes=60)
      )
oodas = BashOperator(task_id='oodas', xcom_push=True, bash_command="hive -hiveconf SCHEMA={{ schema }} -hiveconf DAY={{ yesterday_ds }} -f {{ script_path }}", dag=dag)
t2 = BashOperator(task_id='t2', bash_command='echo "{{ ti.xcom_pull("oodas") }}"', dag=dag)
t2.set_upstream(oodas)

我正在尝试xcom_push,但老实说不知道它是如何工作的..这是收集结果的正确方法吗?在日志中,最后一行是:命令退出,返回码为0

2 个答案:

答案 0 :(得分:5)

根据BashOperator doc

  

如果xcom_push为True,当bash命令完成时,写入stdout的最后一行也将被推送到XCom

知道这一点,您只需要让bash脚本最后打印错误代码,然后将以下内容添加到bash_command

<your code> ; echo $?

在你的情况下,它是:

oodas = BashOperator(task_id='oodas', xcom_push=True, bash_command="hive -hiveconf SCHEMA={{ schema }} -hiveconf DAY={{ yesterday_ds }} -f {{ script_path }}; echo $?", dag=dag)

答案 1 :(得分:1)

您可以发布整个DAG吗?我认为你在解释Airflow如何工作方面存在问题

从Task1(如果是bash运算符),你可以这样做:

t1 = BashOperator(task_id='t1', bash_command='echo "{{ ti.xcom_push("t1") }}"', dag=dag)

在Task2中:

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

其中ti是task_instance变量,{{}}表示法用于访问变量部分