airflow Operators
20190927
一、 Dag 編寫步驟
import DAG
類和若干operater類以及必要的Python模塊- 設定默認參數,創建
DAG
對象 - 提供必要的參數(比如task_id和dag),創建
Task
(即Operator對象) - 設定
Task
的上下游依賴關係
1. import DAG類
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import timedelta
2. 設置一些默認參數
- 所有的 Operator 都是從
BaseOperator
派生而來,並通過繼承獲得更多功能 - 參考【airflow operators-CSDN】
default_args
設置的是DAG的通用參數,這些通用參數會直接傳遞給DAG下屬的所有Task,這些參數也可以在創建Task時傳入
default_args = {
# 常用
'owner': 'airflow', # 這個DAG的所有者,會在Web UI上顯示,主要用於方便管理
'depends_on_past': False, # 是否依賴於過去。如果爲True,那麼必須要昨天的DAG執行成功了,今天的DAG才能執行
'start_date': datetime(2015, 6, 1),
# DAG的開始時間,比如這裏就是從2015年6月1日開始執行第一個DAG。這個參數會影響到部署上線時回填DAG的數
#量。一般建議寫成上線時間的前一天(因爲這裏的start_date指的是execute_date,而Airflow執行的邏輯是,
#今天的同一時間執行昨天的任務,比如execute_date=2018-03-01,每天凌晨3點執行,則會在2018-03-02
#03:00:00啓動這個DAG。特別地,這個參數必須一個datetime對象,不可以用字符串
'email': ['[email protected]'],# 出問題時,發送報警Email的地址,可以填多個,用逗號隔開
'email_on_failure': False, # 任務失敗且重試次數用完時是否發送Email,推薦填True
'email_on_retry': False, # 任務重試時是否發送Email
'retries': 1, # 任務失敗後的重試次數
'retry_delay': timedelta(minutes=5), # 重試間隔,必須是timedelta對象
# 不常用
'queue': 'bash_queue', # 隊列,默認是default,決定實際執行任務會發送到哪個worker
'pool': 'backfill', # pool是一個分類限制併發量的設計,目前來說可以忽略,默認所有的Task都在一個pool裏。
'priority_weight': 10, # 優先級權重,在任務需要排隊時而你需要優先執行某些任務時會有用
'end_date': datetime(2016, 1, 1), # 結束時間,一般線上任務都會一直跑下去,所以沒必要設置
}
3. 創建DAG對象
dag = DAG('tutorial', default_args=default_args,schedule_interval="0 3 * * *")
# 第一個參數固定爲dag的名字(即這個.py腳本的名稱)
# schedule_interval爲執行時間間隔,同crontab的語法
# 在這個例子中表示每天凌晨3點執行
4. 創建Task
# 這是一個SSHOperator的task示例
task_1 = SSHOperator(
ssh_conn_id='ssh_24', # 指定conn_id
task_id='task_shopping',
command='/bin/bash path/my.sh $(date -d "yesterday" +%Y%m%d) ', # 遠程機器上的腳本文件
dag=dag
)
5. 設定Task依賴關係
- 設定依賴有兩種方式,一種是使用對象的方法
set_upstream
和set_downstream
來設置上下游依賴- 另一種是使用運算符,比如下面的
task_1 << task_2
,表示task_1
是task_2
的下游對象
task_1 << task_2
二、完整的例子
import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.contrib.operators.ssh_operator import SSHOperator
from datetime import datetime, timedelta
import pendulum
local_tz = pendulum.timezone("Asia/Shanghai")
dt = local_tz.convert(datetime(2019, 9, 27))
default_args = {
'owner': 'lion',
'depend_on_past': False,
'email': ['my@email','other@email'],
'email_on_failure': False,
'email_on_retry': False,
'start_date':dt,
'retries': 0,
'retry_delay': timedelta(minutes=1)
}
dag = DAG(dag_id="ssh_myssh", default_args=default_args, schedule_interval='0 6 * * *')
task_1 = SSHOperator(
ssh_conn_id='ssh_24',,
task_id='task_shopping',
command='/bin/bash path/my_1.sh $(date -d "yesterday" +%Y%m%d) ',
dag=dag
)
task_2 = SSHOperator(
ssh_conn_id='ssh_24',
task_id='task_dimming',
command='/bin/bash path/my_2.sh $(date -d "yesterday" +%Y%m%d) ',
dag=dag
)
task_1 >> task_2