Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >闲聊Airflow 2.0

闲聊Airflow 2.0

作者头像
哒呵呵
发布于 2021-08-12 03:46:26
发布于 2021-08-12 03:46:26
2.8K00
代码可运行
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记
运行总次数:0
代码可运行

在 2020 年 12 月 17 日 Apache Airflow 团队发布了 Apache Airflow 2.0.0。当时就想写写 Airflow 的新特性,但是粗略的看了下《Apache Airflow 2.0 is here!》这篇文章,发现 Airflow2.0 是一个超级大的版本更新,不仅仅 UI 更新了,最核心的组件 Scheduler 性能也有了极大的提升,分布式环境下的高可用模型也做了改变,同时还有 Airflow 上的 Operator 和 Hook 也做了新的分门别类,对于这个版本在复杂的生产环境下是否能稳定运行,感到一丝怀疑,遂后面没有在关注了。

等了半年后,注意到 Airflow 已经发布版本到 2.1.1 了,而且Airflow 1.0+的版本也即将不再维护,自己也做了小规模测试,基本上可以确定 Airflow2.0 可以作为生产环境下的版本了,遂有了这篇文章,对 Airflow2.0 简单介绍下。

参考:https://github.com/apache/airflow/blob/main/UPDATING.md。目前为止 Airflow 2.0.0 到 2.1.1 的版本更新没有什么大的变化,只是一些小的配置文件和行为逻辑的更新,比如Dummy trigger在2.1.1版本过时了、DAG concurrency 配置更改了。

所以最大的版本更新还是在于 Airflow2.0.0,在这一次版本更新里,包括了:

更新 UI

这块的话,取决于个人审美吧,毕竟只是一个调度系统,长啥样都没有什么影响。具体可以参考下面这个动图:

引入编写 dag(有向无环图)的新方法:TaskFlow API

新的方法对依赖关系的处理更清晰,XCom 也更易于使用。第一次看到这种的调度配置方式,还是在 prefect 调度系统上,感兴趣的话,可以看看:https://listen-lavender.gitbook.io/prefect-docs/gettingstarted/whynotairflow。

我认为这种新的配置调度方式的引入,极大改善了如何调度机器学习模型的配置任务,写过用 Airflow 调度机器学习模型的读者可以比较下,TaskFlow API 会更好用。

TaskFlow API 像下面这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from airflow.decorators import dag, task
from airflow.utils.dates import days_ago

@dag(default_args={'owner': 'airflow'}, schedule_interval=None, start_date=days_ago(2))
def tutorial_taskflow_api_etl():
   @task
   def extract():
       return {"1001": 301.27, "1002": 433.21, "1003": 502.22}

   @task
   def transform(order_data_dict: dict) -> dict:
       total_order_value = 0

       for value in order_data_dict.values():
           total_order_value += value

       return {"total_order_value": total_order_value}

   @task()
   def load(total_order_value: float):

       print("Total order value is: %.2f" % total_order_value)

   order_data = extract()
   order_summary = transform(order_data)
   load(order_summary["total_order_value"])

tutorial_etl_dag = tutorial_taskflow_api_etl()
Fully specified REST API (AIP-32)
提升 Scheduler 性能

对于 Scheduler 性能优化的想法从 2019 年 03 月 02 日就开始了,到 2.0.0 终于实现了突破,这部分的历程可以看看 AIP-15(https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=103092651)。

之前 Scheduler 的分布式执行是使用主从模型,但是在 Airflow 2.0 改成了主主模型,我的理解是就是基于元数据库,所有的 Scheduler 都是对等的。带来的优势就是:

  • 之前崩溃的调度程序的恢复时间主要依赖于外部健康检查第一时间发现识别故障,但是现在停机时间为零且没有恢复时间,因为其他主动调度程序会不断运行并接管操作。
  • 支持读单个调度程序进行更改,而不会影响其他调度程序。

对于某个单 Scheduler 来说,1.7 就引入了 DAG 序列化,通过使 Web 服务器无需解析 DAG 文件而允许它读取序列化的DAG,大大提高了 DAG 文件的读取性能。Airflow 2.0 Scheduler 通过使用来自数据库的序列化后 DAG 进行任务调度和调用,扩展了 DAG 序列化的使用。这减少了重复解析 DAG 文件以进行调度所需的时间。

当然最后有一份性能对比,可以看看:

简化 KubernetesExecutor

这块用的不多,就直接摘抄了。

Airflow 2.0 重新建立了 KubernetesExecutor 架构,为 Airflow 用户提供更快、更容易理解和更灵活的使用方式。用户现在可以访问完整的 Kubernetes API 来创建一个 .yaml pod_template_file,而不是在 airflow.cfg 中指定参数。 此外还用pod_override参数替换了executor_config词典,此项变化从 KubernetesExecutor 删除了三千多行代码,使其运行速度更快,并减少潜在错误。

Airflow 核心和提供者(providers)

Airflow 终于将 operator,sensor或hook 拆分为 60 多个 packages,而不是都放在一起了。最简单的例子就是:让 airflow.contrib 变得非常大,以至于依赖管理以及下一版本的计划和测试都变得充满挑战。

在Airflow 2.0中,已根据可与Airflow一起使用的外部系统对模块进行了重组。这意味着,如果您想使用与AWS相关的operators,而不是与GCP和Kubernetes相关的operators,则只能使用Amazon提供程序子软件包安装Airflow:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install apache-airflow[amazon]

这项更改意义重大,因为它可以使关注点分离,更快的特定组件发布周期以及更干净的组织结构,使您可以在其中找到与特定外部系统相关的代码。从早期版本迁移工作流时,请确保使用正确的导入。例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from airflow.providers.amazon.aws.operators.athena import AWSAthenaOperator
更智能的传感器 (sensors)

传感器(sensors)非常棘手,因为它们一直在寻找状态,并且可能会消耗大量资源。在新版本中,Airflow引入了对传感器逻辑的更改,以使其更加节省资源和更智能。就个人而言,我倾向于使用事件驱动的AWS Lambda函数处理用例,这些用例通常在Airflow中通过传感器使用(例如,当特定文件到达S3后立即触发管道)。但是,此功能对于许多希望将所有工作流程保持在一个地方而不是依赖于FaaS进行事件驱动的人来说非常有用。

TaskGroup 功能

SubDAG 通常用于在 UI 中对任务进行分组,但它们的执行行为有许多缺点(主要是它们只能并行执行单个任务!)为了改善这种体验,我们引入了“TaskGroup”:一种用于组织任务提供与 subdag 相同的分组行为,而没有任何执行时间缺陷。

总结

可惜的是,Airflow 的调度时间问题依然没有得到解决。2.0 最大的更新我认为是 Scheduler 性能的提升,这真的是让我惊讶了,毕竟之前老版本 Scheduler 对 DAG 文本文件的解析是真的慢,现在改造成了序列化的方式,快了不止一点。其它的话,TaskFlow API的引入,会帮助 Airflow 更好的兼容机器学习模型的部署和调度。

参考链接:

  1. https://github.com/apache/airflow/blob/main/UPDATING.md
  2. https://www.oschina.net/news/125503/airflow-2-0-released
  3. https://blog.csdn.net/weixin_42731853/article/details/116226461
  4. https://www.infoq.cn/article/q837wbetfsatfithbbi9
  5. https://medium.com/apache-airflow/apache-airflow-2-0-tutorial-41329bbf7211
  6. https://airflow.apache.org/blog/airflow-two-point-oh-is-here/
  7. https://www.astronomer.io/blog/airflow-2-scheduler
  8. https://www.astronomer.io/blog/introducing-airflow-2-0
  9. https://www.nextlytics.com/blog/apache-airflow-2.0-new-features
  10. https://databand.ai/blog/airflow-2-0-and-why-we-are-excited-at-databand/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 使用Logback日志框架
项目中日志系统是必不可少的,目前比较流行的日志框架有log4j、logback等,可能大家还不知道,这两个框架的作者是同一个人,Logback旨在作为流行的log4j项目的后续版本,从而恢复log4j离开的位置。另外 slf4j(Simple Logging Facade for Java) 则是一个日志门面框架,提供了日志系统中常用的接口,logback 和 log4j 则对slf4j 进行了实现。我们本文将讲述如何在spring boot 中应用 logback+slf4j实现日志的记录。
鱼找水需要时间
2023/02/16
6430
SpringBoot整合Logback日志框架配置全解析
SpringBoot使用 Commons Logging 进行所有内部日志的记录,但默认配置也提供了对常用日志的支持,如 Java Util Logging,Log4J2,和Logback. 每种logger都可以通过配置使用控制台或文件输出日志内容。
烂猪皮
2023/09/04
4.9K0
SpringBoot整合Logback日志框架配置全解析
Logback 日志框架 尚未完结
在resources下添加配置文件 logback.xml 不过有人建议更名为 logback-spring.xml,我也建议更名为 logback-spring.xml
收心
2022/05/05
2210
Spring Boot 日志配置
SLF4J 只是一个门面程序,并不做具体的日志打印功能,需要整合LogBack 、Log4j 等第三方模块。
LCyee
2020/08/05
9800
SpringBoot框架日志详解
市场上存在非常多的日志框架,分为日志门面(日志的抽象层)和日志实现。 可以这样理解:日志门面相当于是接口,日志实现相当于是接口的实现类。
科技新语
2024/10/15
1460
SpringBoot框架日志详解
SpringBoot基础(三):Logback日志
适配器作用:以后想要换其他日志框架,只要排除掉logback日志实现,导入log4j2或jul的日志实现即可,代码中API还是slf4j不需要修改,只修改maven依赖就改变了日志的底层实现。
Java微观世界
2025/01/21
3430
SpringBoot基础(三):Logback日志
项目统一日志设计
删除application.yml日志配置 # set log level logging: level: root: info mybatis-plus: mapper-locations: com/ssm/eduservice/mapper/xml/*.xml # mybatis 日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 在resources中创建logbac
shaoshaossm
2023/02/03
3620
Logback使用问题汇总
SpringBoot中logback.xml使用application.yml中属性
编程随笔
2024/09/24
960
Springboot日志管理——logback
当我们启动springboot的时候,控制台的默认输出就是由logback完成的。
Tom2Code
2022/11/21
7710
Springboot日志管理——logback
springboot超级详细的日志配置(基于logback)
  java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用)。其中性能最高的应该使 logback 了,而且 springboot 默认使用的也是 logback 日志,所以本篇将会详细的讲解 logback 的日志配置方案。
用户2038589
2019/06/13
26.2K0
SpringBoot——配置logback日志
介绍: 在项目运行中,我们需要对项目的出错或运行有了解,可以通过日志文件的查看来实现。因此,项目日志的打印就至关重要。本文给出一种logback日志的配置。改配置会在每天进行整理,同时区分不同的日志级别进行记录。
凡人飞
2020/09/21
2.4K0
SpringBoot——配置logback日志
Logback简介与配置详解
在开发和维护Spring Boot应用程序时,一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback,一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。
修己xj
2023/12/20
8480
Logback简介与配置详解
SpringBoot日志功能
根据官方文档,我们初步体验一下。新建项目,name —> spring-boot-logger
乐心湖
2020/07/31
5110
SpringBoot+logback实现日志打印
logback是一款开源的日志框架,内核重写了,是基于log4j基础进行改良的。其官网为logback.qos.ch。logback在性能上有很大提升,拥有更多特性。
SmileNicky
2019/03/04
4.2K0
轻量级日志平台
常用的日志管理平台如efk,elk等都太过臃肿,推荐一个轻量级的日志平台zincsearch
用户1599145
2024/03/25
3220
Logback配置详解
1、Java日志体系(目前常用) slf4j:由log4j的作者开发,本身不替供日志具体实现,只对外提供接口或门面。 logback:slf4j的作者开发的的slf4j的实现,优于log4j。 log4j2:由Apache开发,参考了logback,并做了一些优化。 jdk自带的JUL(java.util.logging)和Apache的JCL(Jakarta Commons Logging)好像不太常用了。 2、slf4j和常用日志实现组件的适配 slf4j + logback:slf4j-api.jar
Libertyyyyy
2022/10/25
6950
Logback配置详解
一文带你搞懂日志如何配置?
日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节。但是,这丝毫不影响它在任何一个系统中的重要的地位。
爱撒谎的男孩
2023/08/25
5910
SpringBoot 的 logback 日志配置
1. 在 resources 目录下创建日志的配置文件 logback-spring.xml , 这是 SpringBoot 官方约定的名称
北漂的我
2020/07/03
7920
如何在Spring项目使用SLF4J框架?
在Spring项目中使用SLF4J框架非常简单。SLF4J(Simple Logging Facade for Java)是一个日志框架的抽象层,它允许你在项目中使用统一的日志接口,而不用关心具体使用哪个日志实现。
收心
2024/03/04
7650
如何在Spring项目使用SLF4J框架?
Spring学习笔记(十八)——spring日志框架的配置和使用
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
不愿意做鱼的小鲸鱼
2022/09/26
1.9K0
相关推荐
SpringBoot 使用Logback日志框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验