[英]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)
您在這里有幾種方法:
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。
我認為您正在嘗試完成以下任務:
您將需要更改您的腳本以執行一個工作流程周期。 這是因為 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.