簡體   English   中英

將命令行參數傳遞給氣流 BashOperator

[英]Passing a command line argument to airflow BashOperator

有沒有辦法將命令行參數傳遞給 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
    )

提前致謝,

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以獲得更廣泛的示例。

您可以嘗試以下操作(對我有用):

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 屬性)讀取。

BashOperator 是 Jinja 模板化的,因此參數可以作為字典傳遞。

Airflow 將安排任務並且不會提示您輸入參數,因此當您說“需要將特定日期作為命令行參數傳遞”時,這是不可能的。 雖然 Airflow 有一個 EXECUTION DATE 的概念,它是 dag 計划運行的日期,並且可以使用宏 {{ ds }} 或 {{ ds_nodash }} ( https://airflow.incubator.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 變量

試試os.system("YOUR COMMAND HERE")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM