因为我刚刚开始使用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 。
答案 0 :(得分:5)
如果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变量,{{}}表示法用于访问变量部分