web-dev-qa-db-ja.com

コマンドライン引数をairflowBashOperatorに渡す

コマンドライン引数を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
    )

前もって感謝します、

5
Shiva

あなたは以下を試すことができます(私のために働いた):

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属性)として読み取るために、私のタスクは適切に記述されています。

3
Andreas Vrangas

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 も参照してください。

2
Bolke de Bruin

os.system("YOUR COMMAND HERE")を試してください

1
wei

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変数として使用できます。

0
user7126545