个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客
私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。
博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频
上文说到使用Airflow进行任务调度大体步骤如下:
以上python文件就是Airflow python脚本,使用代码方式指定DAG的结构。
下面我们以调度执行shell命令为例,来讲解Airflow使用。
1. 首先我们需要创建一个python文件,导入需要的类库
# 导入 DAG 对象,后面需要实例化DAG对象
from airflow import DAG
# 导入BashOperator Operators,我们需要利用这个对象去执行流程
from airflow.operators.bash import BashOperator
注意:以上代码可以在开发工具中创建,但是需要在使用的python3.7环境中导入安装Airflow包。
D:\ProgramData\Anaconda3\envs\python37\Scripts>pip install apache-airflow==2.1.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 实例化DAG
from datetime import datetime, timedelta
# default_args中定义一些参数,在实例化DAG时可以使用,使用python dic 格式定义
default_args = {
'owner': 'airflow', # 拥有者名称
'start_date': datetime(2021, 9, 4), # 第一次开始执行的时间,为 UTC 时间
'retries': 1, # 失败重试次数
'retry_delay': timedelta(minutes=5), # 失败重试间隔
}
dag = DAG(
dag_id = 'myairflow_execute_bash', #DAG id ,必须完全由字母、数字、下划线组成
default_args = default_args, #外部定义的 dic 格式的参数
schedule_interval = timedelta(days=1) # 定义DAG运行的频率,可以配置天、周、小时、分钟、秒、毫秒
)
注意:
第一种方式:
with DAG("my_dag_name") as dag:
op=XXOperator(task_id="task")
第二种方式(以上采用这种方式):
my_dag = DAG("my_dag_name")
op = XXOperator(task_id="task", dag=my_dag)
第三种方式:
@dag(start_date=days_ago(2))
def generate_dag():
op = XXOperator(task_id="task")
dag = generate_dag()
可以参照:
http://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/baseoperator/index.html#module-airflow.models.baseoperator查看baseopartor中更多参数。
可以参照:
http://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/dag/index.html 查看DAG参数说明,也可以直接在开发工具点击DAG进入源码看下对应参数有哪些。
3. 定义Task
当实例化Operator时会生成Task任务,从一个Operator中实例化出来对象的过程被称为一个构造方法,每个构造方法中都有“task_id”充当任务的唯一标识符。
下面我们定义三个Operator,也就是三个Task,每个task_id 不能重复。
# operator 支持多种类型, 这里使用 BashOperator
first = BashOperator(
task_id='first',
bash_command='echo "run first task"',
dag=dag
)
middle = BashOperator(
task_id='middle',
bash_command='echo "run middle task"',
dag=dag
)
last = BashOperator(
task_id='last',
bash_command='echo "run last task"',
dag=dag,
retries=3
)
注意:
4. 设置task依赖关系
#使用 set_upstream、set_downstream 设置依赖关系,不能出现环形链路,否则报错
# middle.set_upstream(first) # middle会在first执行完成之后执行
# last.set_upstream(middle) # last 会在 middle执行完成之后执行
#也可以使用位移符来设置依赖关系
first >> middle >>last # first 首先执行,middle次之,last最后
# first >> [middle,last] # first首先执行,middle ,last并行执行
注意:当执行脚本时,如果在DAG中找到一条环形链路(例如:A->B->C-A)会引发异常。更多DAG task依赖关系可参照官网:http://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#task-dependencies
5. 上传python配置脚本
到目前为止,python配置如下:
# 导入 DAG 对象,后面需要实例化DAG对象
from airflow import DAG
# 导入BashOperator Operators,我们需要利用这个对象去执行流程
from airflow.example_dags.example_bash_operator import dag
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta
# default_args中定义一些参数,在实例化DAG时可以使用,使用python dic 格式定义
default_args = {
'owner': 'airflow', # 拥有者名称
'start_date': datetime(2021, 9, 4), # 第一次开始执行的时间,为 UTC 时间
'retries': 1, # 失败重试次数
'retry_delay': timedelta(minutes=5), # 失败重试间隔
}
dag = DAG(
dag_id = 'myairflow_execute_bash', #DAG id ,必须完全由字母、数字、下划线组成
default_args = default_args, #外部定义的 dic 格式的参数
schedule_interval = timedelta(days=1) # 定义DAG运行的频率,可以配置天、周、小时、分钟、秒、毫秒
)
# operator 支持多种类型, 这里使用 BashOperator
first = BashOperator(
task_id='first',
bash_command='echo "run first task"',
dag=dag
)
middle = BashOperator(
task_id='middle',
bash_command='echo "run middle task"',
dag=dag
)
last = BashOperator(
task_id='last',
bash_command='echo "run last task"',
dag=dag,
retries=3
)
#使用 set_upstream、set_downstream 设置依赖关系,不能出现环形链路,否则报错
# middle.set_upstream(first) # middle会在first执行完成之后执行
# last.set_upstream(middle) # last 会在 middle执行完成之后执行
#也可以使用位移符来设置依赖关系
first >> middle >>last # first 首先执行,middle次之,last最后
# first >> [middle,last] # first首先执行,middle ,last并行执行
将以上python配置文件上传到$AIRFLOW_HOME/dags目录下,默认$AIRFLOW_HOME为安装节点的“/root/airflow”目录,当前目录下的dags目录需要手动创建。
6. 重启Airflow
“ps aux|grep webserver”和“ps aux|grep scheduler”找到对应的airflow进程杀掉,重新启动Airflow。重启之后,可以在airflow webui看到对应的DAG ID ”myairflow_execute_bash”。
7. 执行airflow
按照如下步骤执行DAG,首先打开工作流,然后“Trigger DAG”执行,随后可以看到任务执行成功。
查看task执行日志: