Airflow Operators + Dag

airflow Operators

20190927


一、 Dag 編寫步驟

  1. import DAG類和若干operater類以及必要的Python模塊
  2. 設定默認參數,創建DAG對象
  3. 提供必要的參數(比如task_id和dag),創建Task(即Operator對象)
  4. 設定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_upstreamset_downstream來設置上下游依賴
  • 另一種是使用運算符,比如下面的 task_1 << task_2,表示task_1task_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

參考

airflow operators-CSDN
airflow DAG

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章