归志宁无五亩园,读书本意在元元。这篇文章主要讲述OPPO大数据离线任务调度系统OFLOW相关的知识,希望能为你提供帮助。
1 离线调度系统
在整个大数据体系中,在原始数据被采集之后,需要使用各种逻辑进行整合和计算之后才能输出实际有效的数据,才能最终用于商业目的,实现大数据的价值。在整个处理流程中,无论是抽取、转换、装载(ETL)的这些过程,还是数据用户分析处理过程,都是需要包含众多的处理任务,而且这些任务都不是孤立的,而是存在相互依赖和约束关系的。如何高效的调度和管理这些任务是非常关键的,影响到各个流程中的数据的及时性和准确性。在这个过程中任务的高效管理和调度是非常关键的,会影响到各个流程中的数据的及时性和准确性。
图1:数据ETL过程
一个最简单的任务调度系统莫过于Linux系统自带的crontab,使用简单,运行稳定。
?
图2:linux的cron定时任务
在项目刚起步时使用crontab无可厚非,随着调度任务的增多,相互之间又有着依赖,crontab就远远满足不了开发的需求了。这些任务的形态各种各样,任务之间也存在多种多样的依赖关系。一个任务的执行需要一系列的前置任务的完成。比如一个上游任务A完成特定逻辑之后,而下游的任务B则依赖任务A输出的数据结果才能产生自己的数据和结果。因此为了保证数据的准确性和可靠性,就必须根据这些任务之间的依赖关系从上游到下游有序的执行。怎么样让大量的任务准确的完成调度而不出现问题,甚至在任务调度执行中出现错误的情况下,任务能够完成自我恢复甚至执行错误告警与完整的日志查询。大数据离线任务调度系统就是要发挥这样的作用。
?
图3:一个简单的任务依赖图
调度系统的核心功能主要就是如下三点:
组织和管理任务流程,定时调度和执行任务,处理任务间依赖关系。
对于一个完善的离线调度系统,需要有以下核心功能:
我们的OFLOW系统就是为了实现以上需求的。
2 OFLOW系统在OPPO的应用
OFLOW目前提供的核心功能主要以下几点:
【OPPO大数据离线任务调度系统OFLOW】目前OFLOW在我司已经承担了非常多的任务的调度。
OFLOW现有国内,新加坡,印度,欧盟和北美5大集群,欧盟和北美集群最近不久上线的,任务暂时还没上量。目前主力集群是国内,新加坡和印度。
目前用户可以通过以下几种方式接入到OFLOW:
3 OFLOW系统的设计和演进
根据前面的信息,可以看到整个离线调度系统最核心的是两个组件,一个的调度引擎,一个是执行引擎。
调度引擎根据任务属性(周期,延迟,依赖关系等)调度任务,根据任务优先级,队列和资源情况分发到不同的执行节点;
执行引擎获取满足执行条件的任务,执行任务,同时输出任务执行过程中的日志,并监控任务执行过程。
在目前市面上常见的离线调度系统中,airflow可以说是其中的佼佼者,经过了多年的发展,功能已经非常完善,在开源社区也非常活跃。
Airflow于2014年10月由Airbnb的Maxime Beauchemin开始;
2015年6月宣布正式加入Airbnb Github;
2016年3月加入了Apache Software Foundation的孵化计划;
目前的更新迭代版本已经到了1-10版本;2-1版本。
我们oppo的离线调度系统是在airflow 1.8版本上引入进来的。
下面是几个在airflow系统中的概念,在其它的离线调度系统中也有类似的概念。
在airflow中,定义dag和dag中的任务是通过一个python文件实现的,这就是一个例子。
这个py文件是来定义dag的,虽然它也开源直接运行,但单独运行并没有什么效果,只是检测python语法是否正确。他也不执行具体的工作,只是描述任务之间的依赖关系,以及调度的时间间隔等要求。
这个需要在任务调度和执行时进行解析,才能按照设定逻辑调度,按照用户设定的执行步骤运行。
图5&
图6:原生airflow定义task和dag的方式
这样一个python文件就对数据开发人员提出了比较高的要求,需要平台的用户对python编码很熟练才行。
下图是airflow的整体架构设计,其中airflow home dags用于存储定义dag和task的python文件,webserver用于提供web服务,展示dag视图,实例,日志等非常多的信息,airflow的web页面也是很完善的。scheduler是调度节点,执行dag解析,任务调度的工作;worker节点是执行节点,可以有很多组,可以监听不同的队列,作用是执行scheduler调度起来的任务。
图7:airflow架构
我们oppo的离线调度系统oflow就是在开源airflow的基础上开发的。
开发中解决的几个比较核心的问题是:
如下是我们OFLOW平台的整个架构:
图8:oflow架构设计
如下这个图显示了整个任务调度和执行的整个流程:
图9:oflow中的任务实例状态流转
目前OFLOW也有了比较全面的监控:
图10:oflow的监控告警
以上就是OFLOW的整体架构,任务调度和执行整个流程。
目前OFLOW的整个服务也存在一些问题:
4 全新的离线调度系统OFLOW 2.0
下面再向大家介绍一下,近期已经上线试用的OFLOW 2.0的产品特殊和架构设计。
我们oflow 2.0平台想解决的问题有以下几点:
oflow 2.0系统就通过以和1.0差别很大的设计实现这些需求:
oflow 2.0的整体架构设计如下:
oflow 2.0当前是没有供用户使用的前端页面,是通过南天门2.0的离线模块调用oflwo 1.0的api server。所以你们在使用oflow 2.0的离线模块时,后端的数据存储,任务触发,调度,执行等一系列流程都是在oflow 2.0的平台上实现的。
图11:oflow 2.0的架构设计
其中还有两个消息队列,
除了这些开发的组件之外,oflow 2.0也用到了一些通用的产品,包括MySQL, Redis,以及对象存储存在,云监控系统,以及调用了公司IT系统的一些api。
这张图展示了OFLOW的任务调度和执行的整个流程:
图12:oflow 2.0任务实例的调度和执行流程
其中调度开始入口有两个,一个是trigger, 一个是webserver。
trigger负责提前5分钟扫描即将要执行的任务,扫描出来之后放入到schedule mq中;
webserver负责多个触发逻辑,一方面是用户手动触发的任务重跑和补录操作,另一个是上游某个任务完成后,将其直接下游获取出来,放入到schedule mq;
这些消息在schedule mq中会被scheduler消费,schedule会分析任务实例的所有依赖关系,包括时间依赖,上下游依赖,自身依赖等信息。如果任务的各种依赖条件都满足,则会被放到task mq中被worker消费;不满足时间依赖的任务会被放入到时间轮中,等达到相应时间刻度后会自动触发;不满足执行条件的任务的所有依赖信息保存在redis中,等后续时间到达,或者依赖的上游任务完成,会不断更新该实例的依赖信息,直到所有依赖条件满足。满足依赖条件的任务,schedule也会分析任务所属的项目以及任务优先级等配置信息,将任务放入到task mq中的不同的消息队列中;
worker会从task mq中消费任务。拿到任务后,通过获取的任务的详细信息,然后执行。判断任务执行结果,如果执行成功,则会通知到api server, api server除了更新实例状态等信息外,还会同时查询该任务的直接下游,将其直接下游放入到schedule mq中;如果任务失败,则会根据是否还有重试次数决定是否要重试,如果没有重试次数则会认定任务失败,通知到api server, api serer更新实例状态。
目前OFLOW 2.0已经完成了所有的设计,开发和测试环境,应经过了一段时间的内测和压力测试等环节。最近也已经开放试用了。欢迎大家试用2.0系统,并在试用过程中给与反馈和建议。
目前用户如果想使用我们的OFLOW 2.0系统的话,可以登录南天门2.0平台上试用。
5 结语
以上就是我跟大家分享的OFLOW的一些信息。
在此我也展望一下我们后续OFLOW平台的发展:
1)OFLOW 1.0的调度性能问题。由于2.0和1.0系统的变化较大,后续OFLOW 1.0和2.0平台会在一段较长的时间内共存,因此对1.0系统的调度性能我们也需要不断去优化,以应对高速增长的任务量;
一方面是想办法缩短任务间的调度间隔,以提升任务执行效率;
另一方面是希望能探索更便捷有效的扩展方式,应对调度任务量的增加。
图13:oflow的任务增长趋势
2)交互体验上
页面交互的友好性上进行完善;添加一系列的批量任务操作和运维方面的功能;同时还希望以dag或者task等维度展示历史统计信息,以供用户参考;另外就是针对任务操作审计,任务的监控系统进行优化;
3)成本优化
另外一个就是前面提到的成本优化,下图反映的是一天中24个小时的任务并发执行情况,任务存在非常明显的高峰和低谷。
图14:oflow每日各时间段内的实例数量
后续考虑想办法对任务错峰执行,比如在计费模式上去鼓励用户将时效性要求不高的任务放在任务低谷进行执行;另外一个就是希望探索一下资源的动态扩缩容来实现成本优化。
4)另外还希望后续OFLOW不单单起到一个任务调度的作用,希望后续能和后端的大数据集群有更多的交互;
5)还有一点就是希望对监控进行进一步的完善。其中比较关键的一个是核心任务的链路的识别和监控。
就是不但要能监控到核心任务,还能将该核心任务的所有上游逻辑监控到,链路中的某个环节一旦异常,能够很快的告警出来;另外一点是用户收到告警时的处理,很多用户收到任务告警后不清楚如何处理,后续oflow会想办法引导用户处理。
作者简介
Chengwei OPPO高级后端工程师
主要负责OPPO的大数据离线任务调度系统的开发工作,对大数据离线调度系统有比较丰富的开发经验。
获取更多精彩内容,请扫码关注[OPPO数智技术]公众号
?
推荐阅读
- Maven实战与原理分析(maven超全使用指南总结)
- #yyds干货盘点#老王读Spring AOP-1Pointcut如何匹配到 join point
- #星光计划2.0#HarmonyOS开发,从listContainer谈容器类控件的使用
- Java编程后端开发小书架!毛遂自荐
- #yyds干货盘点# linux iscsi 简单实现windows文件互通和实现多路径访问,并实现负载均衡高可用超详细配置方法和原理的个人理解
- Bitlocker磁盘加密策略Without TPM---Intune终结点管理
- JVM调优指南-工具篇(jps)
- Win10 LTSC封装教程
- 学习Java必备的基础知识打卡12.23,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#