Airflow中KubernetesPodOperator使用Variable.get()获取run_id报错求助
嗨,我来帮你捋清楚这个问题的原因~
首先得明确Airflow里这两种写法的本质区别:
Jinja模板语法
{{ run_id }}:这是Airflow的动态模板渲染机制,run_id是Airflow内置的模板变量,在任务执行阶段会被自动替换成当前DAG运行的实际run_id值。所以你的第一段代码能正常工作,因为KubernetesPodOperator支持模板化env_vars参数,Airflow会在任务运行时帮你把模板变量替换成真实值。Variable.get("run_id")写法:Airflow的Variable是用来存储全局静态变量的,比如你预先在Airflow UI的「Admin -> Variables」里创建的键值对。这个方法是在DAG解析阶段就执行的——也就是Airflow加载DAG文件的时候,这时候还没有启动任何DAG运行实例,自然不存在run_id这个变量,而且你也没手动创建过名为run_id的Airflow Variable,所以必然会抛出KeyError。
解决方案
如果你的需求就是获取当前DAG运行的run_id,那第一种用Jinja模板的写法就是正确的选择。
要是你确实想用Variable.get(),那得先去Airflow UI的「Admin -> Variables」页面,手动添加一个键为run_id的变量并设置对应值,但这样取到的是静态值,不是当前DAG运行的动态run_id,这应该不是你想要的效果。
简单说就是:动态运行时变量用Jinja模板,静态全局变量用Variable.get(),别搞混啦~
备注:内容来源于stack exchange,提问作者Hui

