我有一个被另一个dag触发的匕首。我已经通过DagRunOrder().payload
字典以与official example相同的方式将一些配置变量传递给了这个dag。
现在在这个dag中,我有另一个TriggerDagRunOperator
来启动第二个dag,并希望通过这些相同的配置变量。
我已成功访问PythonOperator
中的有效负载变量,如下所示:
def run_this_func(ds, **kwargs):
print("Remotely received value of {} for message and {} for day".format(
kwargs["dag_run"].conf["message"], kwargs["dag_run"].conf["day"])
)
run_this = PythonOperator(
task_id='run_this',
provide_context=True,
python_callable=run_this_func,
dag=dag
)
但同样的模式在TriggerDagRunOperator
:
def trigger(context, dag_run_obj, **kwargs):
dag_run_obj.payload = {
"message": kwargs["dag_run"].conf["message"],
"day": kwargs["dag_run"].conf["day"]
}
return dag_run_obj
trigger_step = TriggerDagRunOperator(
task_id="trigger_modelling",
trigger_dag_id="Dummy_Modelling",
provide_context=True,
python_callable=trigger,
dag=dag
)
它会产生关于使用provide_context
:
INFO - Subtask: /usr/local/lib/python2.7/dist-packages/airflow/models.py:1927: PendingDeprecationWarning: Invalid arguments were passed to TriggerDagRunOperator. Support for passing such arguments will be dropped in Airflow 2.0. Invalid arguments were:
INFO - Subtask: *args: ()
INFO - Subtask: **kwargs: {'provide_context': True}
INFO - Subtask: category=PendingDeprecationWarning
这个错误表明我还没有通过conf:
INFO - Subtask: Traceback (most recent call last):
INFO - Subtask: File "/usr/local/lib/python2.7/dist-packages/airflow/models.py", line 1374, in run
INFO - Subtask: result = task_copy.execute(context=context)
INFO - Subtask: File "/usr/local/lib/python2.7/dist-packages/airflow/operators/dagrun_operator.py", line 64, in execute
INFO - Subtask: dro = self.python_callable(context, dro)
INFO - Subtask: File "/home/user/airflow/dags/dummy_responses.py", line 28, in trigger
INFO - Subtask: "message": kwargs["dag_run"].conf["message"],
INFO - Subtask: KeyError: 'dag_run'
我尝试过的第二种模式也没有用,就是使用params
这样的参数:
def trigger(context, dag_run_obj):
dag_run_obj.payload = {
"message": context['params']['message'],
"day": context['params']['day']
}
return dag_run_obj
trigger_step = TriggerDagRunOperator(
task_id="trigger_modelling",
trigger_dag_id="Dummy_Modelling",
python_callable=trigger,
params={
"message": "{{ dag_run.conf['message'] }}",
"day": "{{ dag_run.conf['day'] }}"
},
dag=dag
)
此模式不会产生错误,而是将参数作为字符串传递给下一个dag,即它不会评估表达式。
如何访问第二个dag的TriggerDagRunOperator
中的配置变量?
答案 0 :(得分:2)
解决:
dag_run
对象存储在上下文中,因此可以使用以下模式在python_callable
的{{1}}中访问配置变量:
TriggerDagRunOperator
答案 1 :(得分:2)
在Airflow2.0.x
中,相当于@efbbrown
的答案是:
from airflow.operators.trigger_dagrun import TriggerDagRunOperator
trigger_step = TriggerDagRunOperator(
task_id="trigger_modelling",
trigger_dag_id="Dummy_Modelling",
conf={"message": "{{ dag_run.conf['message'] }}", "day":"{{
dag_run.conf['day'] }}"},
dag=dag
)
在 GitHub 上描述了拉取请求。
请参阅 external-triggers 和 trigger_dagrun 的文档。
这是显示正确导入的主题的 YouTube video。
答案 2 :(得分:0)
@efbbrown是的,您可以执行此操作,也可以在访问第一个dags参数时将其推送到xcom并在触发第二个dag时将其拉出