コマンドライン引数をAirflowBashOperatorに渡す方法はありますか?現在、日付引数を受け入れ、指定された日付より古い特定のフォルダーのクリーンアップなどの特定のアクティビティを実行するpythonスクリプトがあります。
タスクが1つしかない単純化されたコードで、私がやりたいのは
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' : ['[email protected]']
,'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
)
前もって感謝します、
あなたは以下を試すことができます(私のために働いた):
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)
そうすると、変数がレンダリングされ、うまく機能しました。私はそれがすべての変数で機能すると信じています(.pyスクリプトを実行したいので、コマンドの先頭にWord'python 'を置いたことに注意してください。
これらの変数をコマンドライン引数(sys.argv属性)として読み取るために、私のタスクは適切に記述されています。
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 も参照してください。
os.system("YOUR COMMAND HERE")
を試してください
BashOperatorはJinjaテンプレートであるため、paramsを辞書として渡すことができます。
Airflowはタスクをスケジュールし、paramの入力を求めないため、「コマンドラインパラメータとして特定の日付を渡す必要がある」と言った場合は不可能です。 AirflowにはEXECUTIONDATEの概念がありますが、これはdagの実行がスケジュールされている日付であり、マクロ{{ds}}または{{ds_nodash}}を使用してBashOperatorパラメーターで渡すことができます( https:// airflow.incubator.Apache.org/code.html#macros )
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」パラメータはbashスクリプトに渡され、$ DATEを持つ他のbash変数として使用できます。