簡體   English   中英

如何自動化整個 Python 腳本以通過 Airflow 運行?

[英]How to automate a whole Python script to run via Airflow?

我有一個 Python 腳本,它指向一個 elasticsearch 集群,對數據執行聚合和計算,然后將見解存儲在本地 PostgreSQL 中。 該腳本可以根據用戶偏好每天或每周運行,如下所示:

python script.py --approach daily 
python script.py --approach weekly

我想通過 Airflow 自動運行此數據流工作流程,每 10 分鍾運行一次。

My guess is to go for the bashoperator as to create a task t1 = bashoperator that executes the bash command python script.py --approach daily as a DAG1, and t2 = bashoperator that executes the bash command python script.py --approach weekly

該代碼似乎沒有給出適當的結果,因為 Airflow 的 webUI 似乎將所有作業都安排到了計划中。

誰能告訴我我做錯了什么?


#imports 
    from airflow.models import DAG
    from airflow.operators.bash_operator import BashOperator
    from  airflow.operators.python_operator import PythonOperator
    from  airflow.operators.email_operator import EmailOperator

    from datetime import datetime, timedelta

    seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
                                        datetime.min.time())

    default_args = {
        
        'owner': 'me',
        'depends_on_past': False,
        'start_date': seven_days_ago,
        'email': ['me@gmail.com'],
        'email_on_failure': True,
        'email_on_retry': False
        'retries': 3,
        'max_tries' : 3 , 
        'retry_delay': timedelta(minutes=10) 

        }

    etl_dag = DAG('tester',default_args=default_args,schedule_interval= '@once')

    #the bashoperator to execute the bash command as to automate the task execution every 5 min 
    weekly_task = BashOperator(
    task_id='testing',
    bash_command='python  my_script.py --approach weekly',
    dag=etl_dag)

您在這里有幾種方法:

  1. 寫兩個 DAG。 每天一份,每周一份。
  2. 使用DayOfWeekBranchOpeator編寫一個 DAG,該 DAG 將根據特定日期分支您的工作流。 例如:在星期一,它將--approach weekly ,而在所有其他日子,它將每天執行--approach

如果您正在運行Airflow>= 2.1.0 (尚未發布):

from airflow.operators.weekday import BranchDayOfWeekOperator
from airflow.operators.bash import BashOperator

with DAG(
    dag_id='tester',
    default_args=default_args,
    schedule_interval='@daily'
) as dag:

    branch_op = BranchDayOfWeekOperator(
        task_id="branch_task",
        follow_task_ids_if_true="weekly_task",
        follow_task_ids_if_false="daily_task",
        week_day="MONDAY", # Replace with the day you want to execute the approch weekly
        use_task_execution_day=False, # Set true if you want the day to be checked against execution_date
    )
    weekly_op = BashOperator(
        task_id='weekly_task',
        bash_command='python  my_script.py --approach weekly',
    )
    daily_op = BashOperator(
        task_id='daily_task',
        bash_command='python  my_script.py --approach daily',
    )

    branch_op >> [weekly_op, daily_op]

如果您正在運行Airflow< 2.1.0

DayOfWeekBranchOpeator代碼復制到您的項目中,將其導入本地並使用與上述相同的代碼。 DayOfWeekBranchOpeator是 Airflow 2.1 版本中的新功能。 請注意,您可能需要更改運算符中的一些導入,這取決於您正在運行的 Airflow 版本。

根據您的語法,我假設您正在運行 Airflow 1.10.14。

我認為您正在嘗試完成以下任務:

  • 每天運行 my_script.py
  • 每周運行 my_script.py

您將需要更改您的腳本以執行一個工作流程周期。 這是因為 Airflow 將在每個計划間隔執行您的腳本。 如果您的腳本已運行並且具有內部調度過程(假設這是--approach確定的內容),它將與 Airflow 的核心目的相沖突,即管理您的工作流程。 每次 Airflow 運行腳本時,它都會啟動另一個每周運行的進程(對於--approach weekly ),從而使工作流程相乘。

您希望 Airflow 安排您的工作流程,而不是腳本。


具有單獨 schedule_interval 的兩個 DAG 將在這里工作。

daily_dag.py

from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator

from datetime import datetime

dag = DAG(
    dag_id='daily_dag',
    start_date=datetime(2021, 1, 1),
    schedule_interval='0 7 * * *'
)
with dag:
    run_script = BashOperator(
        task_id='run_script',
        bash_command='python my_script.py',
    )

該 DAG 將在每天 7 點 UTC 運行工作流。

每周運行.py

from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator

from datetime import datetime

dag = DAG(
    dag_id='weekly_dag',
    start_date=datetime(2021, 1, 1),
    schedule_interval='0 7 * * Mon'
)
with dag:
    run_script = BashOperator(
        task_id='run_script',
        bash_command='python my_script.py',
    )

此 DAG 將在每周一 7 UTC 運行工作流。

將它們分開可以讓您擁有更清晰的管道以及更清晰地定義每個管道在自己的頻率下所做的事情。

我還將考慮通過直接執行 python 代碼而不是通過 shell 將這些 BashOperator 轉換為PythonOperators以刪除抽象層。

暫無
暫無

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

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