对于Apache Airflow,如何通过CLI手动触发DAG时如何传递参数?

时间:2018-12-07 05:00:50

标签: airflow

我使用Airflow来管理ETL任务的执行和计划。已创建DAG,并且工作正常。但是通过cli手动触发dag时可以传递参数。

例如: 我的DAG每天在01:30运行,并处理昨天的数据(时间范围为昨天01:30到今天01:30)。数据源可能存在一些问题。我需要重新处理这些数据(手动指定时间范围)。

因此,我可以在计划时创建这样的气流DAG,使其默认时间范围为昨天的01:30到今天的01:30。然后,如果数据源有任何问题,我需要手动触发DAG并手动将时间范围作为参数传递。

据我所知airflow test具有-tp可以将参数传递给任务。但这仅用于测试特定任务。并且airflow trigger_dag没有-tp选项。那么有什么办法可以将tigger_dag传递给DAG,然后操作员可以读取这些参数?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用--conf '{"key":"value"}'从CLI传递参数,然后在DAG文件中将其用作模板字段中的"{{ dag_run.conf["key"] }}"

CLI

airflow trigger_dag 'example_dag_conf' -r 'run_id' --conf '{"message":"value"}'

DAG文件

args = {
    'start_date': datetime.utcnow(),
    'owner': 'airflow',
}

dag = DAG(
    dag_id='example_dag_conf',
    default_args=args,
    schedule_interval=None,
)

def run_this_func(ds, **kwargs):
    print("Remotely received value of {} for key=message".
          format(kwargs['dag_run'].conf['message']))


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

# You can also access the DagRun object in templates
bash_task = BashOperator(
    task_id="bash_task",
    bash_command='echo "Here is the message: '
                 '{{ dag_run.conf["message"] if dag_run else "" }}" ',
    dag=dag,
)

答案 1 :(得分:0)

这应该按照气流文档进行操作:https://airflow.apache.org/cli.html#trigger_dag

airflow trigger_dag -c '{"key1":1, "key2":2}' dag_id

请确保-c的值是有效的json字符串,因此此处必须用双引号将键括起来。

答案 2 :(得分:0)

key: ['param1=somevalue1', 'param2=somevalue2']

第一种方式:

"{{ dag_run.conf["key"] }}"

这会将传递的值呈现为字符串 "['param1=somevalue1', 'param2=somevalue2']"

第二种方式:

def get_parameters(self, **kwargs):
    dag_run = kwargs.get('dag_run')
    parameters = dag_run.conf['key']
    return parameters

在这种情况下,将传递一个字符串列表并将呈现为列表 ['param1=somevalue1', 'param2=somevalue2']