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': ['airflow@example.com'],# 出问题时,发送报警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