|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

 

 

posted on   yanqi_vip  阅读(40)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示