For Apache Airflow, How can I pass the parameters when manually trigger DAG via CLI?
Asked Answered
W

3

58

I use Airflow to manage ETL tasks execution and schedule. A DAG has been created and it works fine. But is it possible to pass parameters when manually trigger the dag via cli.

For example: My DAG runs every day at 01:30, and processes data for yesterday(time range from 01:30 yesterday to 01:30 today). There might be some issues with the data source. I need to re-process those data (manually specify the time range).

So can I create such an airflow DAG, when it's scheduled, that the default time range is from 01:30 yesterday to 01:30 today. Then if anything wrong with the data source, I need to manually trigger the DAG and manually pass the time range as parameters.

As I know airflow test has -tp that can pass params to the task. But this is only for testing a specific task. and airflow trigger_dag doesn't have -tp option. So is there any way to tigger_dag and pass parameters to the DAG, and then the Operator can read these parameters?

Thanks!

Welltimed answered 7/12, 2018 at 5:0 Comment(0)
B
94

You can pass parameters from the CLI using --conf '{"key":"value"}' and then use it in the DAG file as "{{ dag_run.conf["key"] }}" in templated field.

CLI:

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

DAG File:

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,
)

PSA for new airflow users: it's worth making the switch to --conf. Params are a nice pattern, but they are an architectural dead end because they don't appear widely supported for programmatic use. Meanwhile, --conf is exposed in services like google Cloud Composer's trigger dag run.

Bandy answered 8/12, 2018 at 19:32 Comment(7)
Is there any way to pass the parameters in a non-templated field?Malena
@Malena When you set the provide_context=True, the run parameters it will be at kwargs['dag_run'].conf as the code example showsEighteenmo
I need access to that parameter value too becauseI need to loop to that value and create the task. How can I access that parameter value outside of non templated field?Velvety
You can't do that, you will need to use Airflow Variables :)Bandy
The updated command for version 2.2.2 is airflow dags trigger 'manual_dag' -r 'dummy_id' --conf '{"message":"value"}'Leftwards
The more common variable name is **context now, not kwargs. More documentation: docs.astronomer.io/learn/airflow-contextToor
is there size limit to the input?Discolor
T
2
key: ['param1=somevalue1', 'param2=somevalue2']

First way:

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

This will render the passed value as String "['param1=somevalue1', 'param2=somevalue2']"

Second way:

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

In this scenario, a list of strings is being passed and will be rendered as a list ['param1=somevalue1', 'param2=somevalue2']

Turrell answered 30/6, 2021 at 15:38 Comment(1)
The more common variable name is **context now, not kwargs. More documentation: docs.astronomer.io/learn/airflow-contextToor
T
1

This should work, as per the airflow documentation: https://airflow.apache.org/cli.html#trigger_dag

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

Make sure the value of -c is a valid json string, so the double quotes wrapping the keys are necessary here.

Trihydric answered 7/12, 2018 at 15:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.