有没有办法将命令行参数传递给Airflow BashOperator。目前,我有一个python脚本,它接受一个日期参数并执行一些特定的活动,比如清理早于给定日期的特定文件夹。
在只有一个任务的简化代码中,我想做的是
from __future__ import print_function
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta
default_args = {
'owner' : 'airflow'
,'depends_on_past' : False
,'start_date' : datetime(2017, 01, 18)
,'email' : ['abc@xyz.com']
,'retries' : 1
,'retry_delay' : timedelta(minutes=5)
}
dag = DAG(
dag_id='data_dir_cleanup'
,default_args=default_args
,schedule_interval='0 13 * * *'
,dagrun_timeout=timedelta(minutes=10)
)
cleanup_task = BashOperator(
task_id='task_1_data_file_cleanup'
,bash_command='python cleanup.py --date $DATE 2>&1 >> /tmp/airflow/data_dir_cleanup.log'
#--------------------------------------^^^^^^-- (DATE variable which would have been given on command line)
#,env=env
,dag=dag
)
提前致谢,
答案 0 :(得分:4)
BashOperator使用Jinja2进行模板化,这意味着您可以传递任意值。在你的情况下,它将是这样的:
cleanup_task = BashOperator(
task_id='task_1_data_file_cleanup'
,bash_command="python cleanup.py --date {{ DATE }} 2>&1 >> /tmp/airflow/data_dir_cleanup.log"
,params = {'DATE' : 'this-should-be-a-date'}
,dag=dag
)
另见:https://airflow.incubator.apache.org/tutorial.html#templating-with-jinja更广泛的例子。
答案 1 :(得分:3)
您可以尝试以下方式(为我工作):
cmd_command = "python path_to_task/[task_name.py] '{{ execution_date }}' '{{ prev_execution_date }}'"
t = BashOperator(
task_id = 'some_id',
bash_command = cmd_command,
dag = your_dag_object_name)
当我这样做时,它渲染了变量,并且效果很好。我相信它适用于所有变量(请注意,我已经在命令的开头添加了' python'因为我想运行.py脚本。
我的任务写得正确,以便将这些变量作为命令行参数(sys.argv属性)读取。
答案 2 :(得分:1)
尝试:
os.system("你在这里命令")
答案 3 :(得分:0)
BashOperator是Jinja的模板,因此params可以作为字典传递。
Airflow将安排任务并且不会提示您输入参数,所以当您说"需要将特定日期作为命令行参数传递时#34;这是不可能的。虽然Airflow有一个执行日期的概念,这是dag计划运行的日期,可以使用宏{{ds}}或{{ds_nodash}}(https://airflow.incubator.apache.org/code.html#macros)在BashOperator参数中传递
env = {}
env['DATE'] = '{{ ds }}'
cleanup_task = BashOperator(
task_id='task_1_data_file_cleanup'
,bash_command='python cleanup.py --date $DATE 2>&1 >> /tmp/airflow/data_dir_cleanup.log'
,params=env
,dag=dag
)
那" DATE" param将传递给bash脚本,可以用作$ DATE
的任何其他bash变量