|NO.Z.00064|——————————|BigDataEnd|——|Hadoop&PB级数仓.V06|——|PB数仓.v06|调度系统Airflow|入门案例HelloWorld|
一、Airflow核心概念
### --- Airflow核心概念
~~~ DAGs:有向无环图(Directed Acyclic Graph),将所有需要运行的tasks按照依赖关系组织起来,
~~~ 描述的是所有tasks执行的顺序;
### --- Operators:Airflow内置了很多operators
~~~ BashOperator 执行一个bash 命令
~~~ PythonOperator 调用任意的 Python 函数
~~~ EmailOperator 用于发送邮件
~~~ HTTPOperator 用于发送HTTP请求
~~~ SqlOperator 用于执行SQL命令
### --- 自定义Operator
~~~ Tasks:Task 是 Operator的一个实例;
~~~ Task Instance:由于Task会被重复调度,每次task的运行就是不同的 Taskinstance。
~~~ Task instance 有自己的状态,
~~~ 包括success running failed 、skipped 、up_for_reschedule 、up_for_retry 、queued 、no_status 等;
~~~ Task Relationships:DAGs中的不同Tasks之间可以有依赖关系;
### --- 执行器(Executor)。Airflow支持的执行器就有四种:
~~~ SequentialExecutor:单进程顺序执行任务,默认执行器,通常只用于测试
~~~ LocalExecutor:多进程本地执行任务
~~~ CeleryExecutor:分布式调度,生产常用。
~~~ Celery是一个分布式调度框架,其本身无队列功能,需要使用第三方组件,如RabbitMQ
~~~ DaskExecutor :动态任务调度,主要用于数据分析
~~~ 执行器的修改。修改 $AIRFLOW_HOME/airflow.cfg 第 70行: executor =LocalExecutor 。
~~~ 修改后启动服务
二、修改Airflow配置文件
### --- 停止Airflow服务
~~~ # 关闭 airflow webserver 对应的服务
(env) [root@hadoop02 ~]# ps -ef | grep 'airflow-webserver' | grep -v 'grep' | awk '{print $2}' | xargs -i kill -9 {}
~~~ # 关闭 airflow scheduler 对应的服务
(env) [root@hadoop02 ~]# ps -ef | grep 'airflow' | grep 'scheduler' | awk '{print $2}' | xargs -i kill -9 {}
~~~ # 删除对应的pid文件
(env) [root@hadoop02 ~]# cd $AIRFLOW_HOME
(env) [root@hadoop02 airflow]# rm -rf *.pid
### --- 修改配置文件
(env) [root@hadoop02 ~]# vim /opt/yanqi/servers/airflow/airflow.cfg
# 修改配置参数
# executor = SequentialExecutor # 在配置文件的第70行
executor = LocalExecutor
### --- 启动Airflow服务
~~~ # 重启服务
(env) [root@hadoop02 ~]# airflow scheduler -D
(env) [root@hadoop02 ~]# airflow webserver -D
三、Airflow入门案例
### --- 创建helloworld.py文件
~~~ # 创建案例目录
(env) [root@hadoop02 ~]# mkdir /opt/yanqi/servers/airflow/dags
~~~ # 创建案例文件:放置在 $AIRFLOW_HOME/dags 目录下
(env) [root@hadoop02 ~]# vim /opt/yanqi/servers/airflow/dags/helloworld.py
from datetime import datetime, timedelta
from airflow import DAG
from airflow.utils import dates
from airflow.utils.helpers import chain
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
def default_options():
default_args = {
'owner':'airflow', # 拥有者名称
'start_date': dates.days_ago(1), # 第一次开始执行的时间
'retries': 1, # 失败重试次数
'retry_delay': timedelta(seconds=5) # 失败重试间隔
}
return default_args
# 定义DAG
def task1(dag):
t = "pwd"
# operator支持多种类型,这里使用 BashOperator
task = BashOperator(
task_id='MyTask1', # task_id
bash_command=t, # 指定要执行的命令
dag=dag # 指定归属的dag
)
return task
def hello_world():
current_time = str(datetime.today())
print('hello world at {}'.format(current_time))
def task2(dag):
# Python Operator
task = PythonOperator(
task_id='MyTask2',
python_callable=hello_world, # 指定要执行的函数
dag=dag)
return task
def task3(dag):
t = "date"
task = BashOperator(
task_id='MyTask3',
bash_command=t,
dag=dag)
return task
with DAG(
'HelloWorldDag', # dag_id
default_args=default_options(), # 指定默认参数
schedule_interval="*/2 * * * *" # 执行周期,每分钟2次
) as d:
task1 = task1(d)
task2 = task2(d)
task3 = task3(d)
chain(task1, task2, task3) # 指定执行顺序
### --- 执行helloworld.py案例文件
~~~ # 执行命令检查脚本是否有错误。如果命令行没有报错,就表示没问题
(env) [root@hadoop02 ~]# python $AIRFLOW_HOME/dags/helloworld.py
~~~ # 查看生效的 dags
(env) [root@hadoop02 ~]# airflow list_dags -sd $AIRFLOW_HOME/dags
~~~输出参数
-------------------------------------------------------------------
DAGS
-------------------------------------------------------------------
HelloWorldDag
~~~ # 查看指定dag中的task
(env) [root@hadoop02 ~]# airflow list_tasks HelloWorldDag
~~~输出参数
MyTask1
MyTask2
MyTask3
~~~ # 测试dag中的task
(env) [root@hadoop02 ~]# airflow test HelloWorldDag MyTask2 20211010
~~~输出参数
--------------------------------------------------------------------------------
[2021-10-10 20:22:53,198] {taskinstance.py:881} INFO - Starting attempt 1 of 2
[2021-10-10 20:22:53,198] {taskinstance.py:882} INFO -
--------------------------------------------------------------------------------
[2021-10-10 20:22:53,199] {taskinstance.py:901} INFO - Executing <Task(PythonOperator): MyTask2> on 2021-10-10T00:00:00+08:00
hello world at 2021-10-10 20:22:53.288643
[2021-10-10 20:22:53,288] {python_operator.py:114} INFO - Done. Returned value was: None
[2021-10-10 20:22:53,296] {taskinstance.py:1070} INFO - Marking task as SUCCESS.dag_id=HelloWorldDag, task_id=MyTask2, execution_date=20211010T000000, start_date=20211010T202253, end_date=20211010T202253
四、通过airflow.UI查看新建的DAGS任务

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv014-PB离线数仓
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」