Airflow 从入门到入土 一:初识任务调度与 Airflow

众所周知,大数据领域内有数不清的组件。大数据领域中的组件甚至多到有人做了个小游戏,提问某串英文单词是宝可梦还是大数据领域里的组件。
游戏
结果

但组件多没关系,其实更重要的是看这个组件所扮演了什么角色。例如 IDEA 和 eclipse 都是 Java 的 IDE,掌握其一即可对 IDE 有一定了解了。

大数据技术架构图

从上图我们能看到 Oozie 是作业流调度的系统,但是本文要讲述的 Airflow 是比 Oozie 社区更火的调度系统。
AIrflow Github 热度

Oozie Github 热度

本系列文章总共有三篇,此为第一篇,目前规划如下:

  • 入门到入土 一:初识任务调度与 Airflow

    1. 什么是 Airflow?
    2. Airflow 能干什么?
  • 入门到入土 二:概念、组件与使用

    1. Airflow 有哪些概念?
    2. Airflow 有哪些组件?
    3. 如何在 docker 中部署 airflow?
  • 入门到入土 三:升级、插件与监控

    1. 关于版本:Airflow v1.x vs v2.x
    2. 更丰富和功能:Airflow 插件,如何开发插件?
    3. 监控:如何使用 statsD 监控 Airflow 的运行状况?

AIrflow 是什么?

Airflow 是大数据领域中一款用 Python 开发的任务调度工具,用于 data pipeline 的调度和监控。

划重点:

  1. AIrflow 是用 Python 开发的,这意味着 Airflow 的运行效率可能不会很高,但代码更易懂且开发速度快。
  2. AIrflow 是一个任务调度工具,用于对 data pipline 进行调度和监控,这意味这不是一个用来存储或者计算的大数据组件。

Airflow 能干什么?

作为一个任务调度工具,Airflow 当然是用来做任务调度的。
那什么是任务调度呢?

我们以洗衣服为例,简单科普下任务调度的概念。

洗衣服有什么流程?

  1. 拿衣服
  2. 洗衣服
  3. 晾衣服

其实这三个流程就是数据仓库里常见的ETL,也即 Extract(数据抽取,就是线上数据库抽取到数据仓库中), Transform(数据转换,即将数据通过一定的流程处理一遍) 和 Load(数据加载,也就是将清洗后的数据再次加载到数据库中)

我们将洗衣服这个流程抽象下,可以画出一个这样的图:
图片

洗衣服的流程是相对固定的,而且每天要洗,我开始想着如何偷懒。
于是,作为懒狗,我决定每天厚着脸皮让室友A下楼顺便帮我拿我的脏衣服丢进洗衣机,又下血本,用五毛钱的辣条收买了室友B,让他帮我晾衣服。

于是这个流程变成了:
在这里插入图片描述

经过这样一番绝妙的布局,洗衣服这件事情对我来就非常轻松了。
我所需要做的,只有三件事情:

  • 选择合适的时机求室友A去拿衣服
  • 开动洗衣机(根据衣服脏的程度,设置合理的清洗时间)
  • 选择合适的时机求室友B去晾衣服(衣服洗完了才能让室友B去拿)

这个阶段可以看做是为 E 和 L 过程编写了脚本,定时执行数据提取和数据载入的操作。

这个时候的我,只需要在合适的时机调度室友 A和室友 B,并简单操作下洗衣机,就能完成洗衣服的流程。

但是,这个流程,也可能会有一些情况需要处理。
例如当室友A在王者上分的时候,得等他打完了再喊他。(合理计划任务的执行时间)
例如洗衣机洗到一半停电了,那么就算时间到了也不需要叫室友B帮我晾衣服了。
(监控任务的执行转态,并根据任务的执行循序去执行,前面的任务完成了再去做后面的任务)

而 Airflow 就相当于这个阶段的我。

官方文档中是这样介绍的:Airflow 是一个以编程方式编写、计划和监视工作流的平台。

就像这个时候的我,想办法如何指示室友拿衣服晾衣服,计划室友什么时候有空,指使他们去哪拿什么衣服,以及看室友是不是好好在执行这个任务。

Airflow 则会定时启动 Extract 脚本,将线上数据库中的数据搬到数据库中,定时启动 Spark 程序进行数据处理和数据建模,然后在将得到的数据导入到某个数据库中。


如有帮助,欢迎点赞/转载~
(听说给文章点赞的人代码bug特别少👀)
联系邮箱:mrjingcheng@foxmail.com
个人公众号:禅与电脑维修艺术
欢迎关注公众号,也欢迎通过邮箱交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一段示例代码,展示了如何在 Airflow 中调度任务。 ```python from airflow import DAG from airflow.operators.bash_operator import BashOperator from datetime import datetime, timedelta default_args = { 'owner': 'me', 'start_date': datetime(2022, 1, 1), 'depends_on_past': False, 'retries': 1, 'retry_delay': timedelta(minutes=5), } dag = DAG( 'my_dag_id', default_args=default_args, schedule_interval=timedelta(hours=1), ) task = BashOperator( task_id='my_task_id', bash_command='echo "Hello World"', dag=dag, ) ``` 在这段代码中,我们首先定义了一个 DAG 对象,并指定了它的 ID、默认参数、以及调度频率。然后,我们创建了一个 BashOperator 对象,用于执行 bash 命令。在这个例子中,我们指定的任务是在控制台输出 "Hello World"。最后,我们把这个任务添加到 DAG 中。 希望这段代码能帮到你。如果你有更多问题,欢迎继续提问。 ### 回答2: 当我们在Airflow中进行任务调度时,可以使用以下代码来定义和调度任务: ```python from airflow import DAG from airflow.operators import PythonOperator from datetime import datetime # 定义默认参数 default_args = { 'owner': 'your_name', 'start_date': datetime(2022, 1, 1), 'retries': 2, 'retry_delay': timedelta(minutes=5) } # 定义DAG dag = DAG( 'my_dag', default_args=default_args, schedule_interval='0 0 * * *' # 每天的午夜执行任务 ) # 定义任务函数 def my_task(): # 任务逻辑 print("Hello, Airflow!") # 定义任务操作符 task = PythonOperator( task_id='my_task', python_callable=my_task, dag=dag ) # 设置任务依赖关系 task.set_upstream(previous_task) # 设置任务之间的依赖关系 # 可选的,定义并发控制 max_concurrent = 3 # 同时执行的任务数 parallel_task = ParallelismMixin().configure({'max_active_runs': max_concurrent}) ``` 上述代码中,我们首先导入需要的模块和类,并定义了默认参数`default_args`,指定了任务调度的起始日期、重试次数和重试间隔。然后创建了一个DAG(有向无环图)`dag`,指定了DAG的名称、默认参数和调度间隔。 接下来,我们定义了一个任务函数`my_task`,其中包含任务的逻辑。然后通过`PythonOperator`类创建了一个任务操作符`task`,指定了任务的ID、要执行的Python函数和所属的DAG。 如果有任务之间的依赖关系,可以通过`set_upstream`方法设置。最后,我们可以选择性地使用`configure`方法来设置并发控制,限制同时执行的任务数。 需要注意的是,上述代码仅为示例,实际应用中根据具体的任务逻辑和调度需求进行相应的调整。 ### 回答3: 当使用Airflow来调度任务时,需要编写一段代码来定义任务和任务之间的依赖关系。以下是一个简单的示例代码: ```python from airflow import DAG from airflow.operators.python_operator import PythonOperator from datetime import datetime # 定义默认参数 default_args = { 'owner': 'airflow', 'start_date': datetime(2022, 1, 1), } # 实例化DAG对象 dag = DAG( 'example_dag', description='一个简单的示例DAG', default_args=default_args, schedule_interval='@daily', # 设置调度频率为每天执行一次 ) # 定义任务中的操作函数 def task1(): print('Task 1执行中...') def task2(): print('Task 2执行中...') def task3(): print('Task 3执行中...') # 定义三个任务 with dag: # 任务1 t1 = PythonOperator( task_id='task1', python_callable=task1, dag=dag, ) # 任务2 t2 = PythonOperator( task_id='task2', python_callable=task2, dag=dag, ) # 任务3 t3 = PythonOperator( task_id='task3', python_callable=task3, dag=dag, ) # 定义任务之间的依赖关系 t1 >> t2 >> t3 ``` 上述代码定义了一个名为"example_dag"的DAG,其中包含了三个任务(task1、task2和task3),这些任务将按照指定的调度频率(每天一次)执行。任务之间的依赖关系定义为t1依赖于t2,t2依赖于t3。当DAG被执行时,Airflow将按照依赖关系和调度频率依次执行这些任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值