Airflow 2.0.2 DAG模板渲染异常 BashOperator无法正确读取XCom推送值
问题根因
- Airflow的Operator仅会对预先声明的
template_fields字段做Jinja模板渲染。BashOperator默认的模板渲染字段只有bash_command和env,你写在params里的Jinja语句不会被解析,只会被当作普通字符串处理,遍历该字符串时自然会逐字符拆分输出,触发bash语法错误。 - 你编写的xcom_pull语法存在错误,
key参数被放到了xcom_pull的括号外部,正确写法为ti.xcom_pull(task_ids='get_query_id', key='return_value')。
修复方案
直接将XCom拉取逻辑写到bash_command的Jinja模板中即可,不需要通过params传递参数,修改后的相关代码如下:
templated_command = dedent( """ {% set query_ids = ti.xcom_pull(task_ids='get_query_id', key='return_value') %} {% for item in query_ids %} echo {{ item[0] }}; {% endfor %} """ ) t2 = BashOperator( task_id='templated', depends_on_past=False, bash_command=templated_command, )
如果确实需要通过params传递参数,可以自定义BashOperator,将params加入模板渲染字段:
class TemplatedParamsBashOperator(BashOperator): template_fields = (*BashOperator.template_fields, 'params') # 后续使用该自定义算子定义t2即可
内容的提问来源于stack exchange,提问作者pm1359
相关产品推荐
相关产品推荐

