如何捕获Airflow中称为DAG的传递的--conf参数

时间:2018-11-16 14:36:32

标签: airflow

我正在尝试从REST API运行DAG并将一些参数传递给它。 DAG应该能够捕获参数并使用它。问题是我能够从REST API触发DAG,但DAG无法捕获传递的参数。有没有办法做到这一点?

我正在从REST API触发DAG,如下所示-它在--conf

中传递参数
http://abcairflow.com:8090/admin/rest_api/api?api=trigger_dag\&dag_id=trigger_test_dag\&conf=%7B%22key%22%3A%2

如何捕获在调用的DAG中的conf值中传递的值。据我所知,conf应该使用URL编码的JSON格式数据。

DAG代码:`

def run_this_func(**kwargs):
print(kwargs)

run_this = PythonOperator(
    task_id='run_this',
    python_callable=run_this_func,
    dag=dag
)`

4 个答案:

答案 0 :(得分:2)

我不知道您可以使用HTTP GET触发DAG,但是我已经使用POST并遵循文档https://airflow.apache.org/api.html

成功地使用conf触发了

例如触发dag“ trigger_test_dag”:

curl -X POST --data '"conf":"{\"key\":\"value\"}"' \
"http://abcairflow.com:8090/api/experimental/dags/trigger_test_dag/dag_runs"

请注意转义撇号,因为conf需要为字符串。我猜您可以对它进行基数64编码,然后在DAG中解码为字符串。

答案 1 :(得分:2)

传递的外部参数是dag_run对象的一部分。可以按以下方式访问它们:

API请求

import requests

headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/json',
}

data = '{"conf":"{\\"Key1\\":\\"Value1\\"}"}'

response = requests.post('http://localhost:8080/api/experimental/dags/<dag_id>/dag_runs', headers=headers, data=data)

DAG

 def run_this_func(**context):
    print("Received {} for key=message".format(context["dag_run"].conf))


run_this = PythonOperator(task_id="run_this", python_callable=run_this_func, provide_context=True, dag=dag)

答案 2 :(得分:0)

不幸的是,这不是一个有据可查的功能,但是有DAG触发了一个conf集并使用它的目标DAG触发另一个DAG的示例。请参见example_trigger_controller_dagexample_trigger_target_dag。由操作员,REST API或CLI触发的DAG应该都以相同的方式传递conf参数。

conf在上下文内部是可访问的,因此您需要确保在使用provide_context=True时传递PythonOperator

def run_this_func(**kwargs):
    print(kwargs['conf'])

run_this = PythonOperator(
    task_id='run_this',
    python_callable=run_this_func,
    dag=dag,
    provide_context=True,
)

答案 3 :(得分:0)

这个需要一些挖掘,因为我想使用 conf 来创建一个动态工作流,而不仅仅是用于其他操作符。在整个 DAG 中使用 conf 参数:

args = {"owner": "me", "depends_on_past": False}

with DAG(
         dag_id="my_dag",
         default_args=args
         schedule_interval="@daily",
         start_date=dats_ago(1)
        ) as dag

conf = dag.get_dagrun(execution_date=dag.get_latest_execution_date()).conf

所以如果你在 conf 中传递的参数是

{"table_names": ["table1", "table2", "table3"]}

您可以通过执行访问表名列表

table_names = conf["tables_names"]