目录
- 本地调试
- 本地启动SingleServer模式
- 本地启动分开配置模式
- 定时任务调度使用场景
- 场景
- 使用
- 总架构图
- 原始架构图
- 处理后架构图
- 源码
- web server
- exec server
- elasticjob-lite对比azkaban
- 参考文章
本地调试
- 注意本文是win10系统方案
- github地址azkaban
本地启动SingleServer模式
- azkaban有几种启动模式,一种是web server和exec server分开部署的一般用于线上,一种是SingleServer模式部署,一般用于调试,数据库用的H2
- gradle build -x test
-
AzkabanSingleServer里面设置工作目录, 就是下载的idea目录
idea edit.png - 在源码目录下新建个conf目录,放置azkaban conf文件,可以复制***\azkaban-web-server\src\main\resources\conf\这里面conf文件到新建的conf目录里,log配置可以改成
log4j.rootLogger=INFO,C
log4j.appender.C=org.apache.log4j.ConsoleAppender
log4j.appender.C.Target=System.err
log4j.appender.C.layout=org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
conf目录.png
- conf/azkaban.properties里面的数据库连接记得修改成你自己的mysql数据库连接
- azkaban.properties文件里面 记得配置下web路径
web.resource.dir=D:\idea_repo\azkaban-master\azkaban-web-server\build\install\azkaban-web-server\web
本地启动分开配置模式
- 先按照本地启动SingleServer模式来一波,然后数据库执行doc底下那个all
- AzkabanExecutorServer配置
-conf D:\idea_repo\azkaban-master\conf
-Dlog4j.configuration=file:D:\idea_repo\azkaban-master\conf\log4j.properties -Dserverpath=D:\idea_repo\azkaban-master\azkaban-exec-server\build\install\azkaban-exec-server
AzkabanExecutorServer.png
- AzkabanWebServer配置
-conf D:\idea_repo\azkaban-master\conf
-Dlog4j.configuration=file:D:\idea_repo\azkaban-master\conf\log4j.properties -Dserverpath=file:D:\idea_repo\azkaban-master\azkaban-web-server\build\install\azkaban-web-server
AzkabanWebServer.png
- 第一次执行失败,要创建目录,再执行就好了
定时任务调度使用场景
场景
- Azkaban开源的工作流管理器,轻量级调度框架, 支持执行Shell, python等脚本任务,python脚本做数据清洗,比java传统的crud, dao映射更快捷,python第三方依赖包更强大。一些有依赖的任务,Azkaban支持的很好
- 前面分析过elastic-job系列分布式定时任务elastic-job(一), ElasticJob是分布式无作业中心化调度,支持分片,失败重试,错过重新支持,高可用分片执行,无单点问题,适合C端B端复杂业务需要定时执行,保障性能和可用性的任务
使用
-
使用UI界面创建项目,上传项目
UI界面之创建项目.png
上传项目.png -
项目结构打成zip包然后上传
test项目.png - test.job, 里面***要替换成自己用户名,这个是python安装地址
type=command
command=C:\\Users\\***\\AppData\\Local\\Programs\\Python\\Python311\\python.exe test.py
- test.py, win10 Python安装自行百度
if __name__ == '__main__':
print("test12138")
-
点执行
执行.png -
立即执行或者定时执行
立即执行或者定时执行.png
总架构图
原始架构图
- 可以看到ui界面点执行或者定时执行是到web server服务这边,web server服务是单点的
- 大部分线上场景是定时执行,azkaban定时任务默认是自己起线程扫描,当然也可以配置quartz(功能更强大些,有错过重新执行等,但开启之后还要配置一些东西)。但这两者在web server分布式环境都会有重复执行任务的问题。所以azkaban这边设置成单点的
- web server选择exec server具体执行任务时,如果处于web server分布式环境也需要做分布式一致性处理
- 当初设计时,由于azkaban的任务不会太重,web server也相对轻量,所以,web server设计成单点的,本身azkaban使用场景也不是那种重业务的C端场景,可以作为数据清洗,数据分析之类的
-
exec server是分布式的集群部署,web server通过一定的机制比如轮训等选择exec server, 主要是从数据库获取exec server状态,当然这边执行任务时候也可以指定选择某台exec server
原始架构图.png
处理后架构图
- 这边做个拓展,并不是说业务一定要二开进行改造,只是讨论说可以进去分布式处理的方案
- web server分布式集群部署,需要保持集群状态决定谁是主避免定时任务重复执行,可以使用zk决定谁是主,如果集群机器下线,zk listen可以动态感知变化重新选主,这个在elasticjob-lite文章有分析过,zk脑裂问题也可以解决
-
在决定出谁是主之后,定时任务执行时判断不是主则不执行,是主则执行分配到exec server。为避免故障发生,建议这里的任务做成幂等的合适些
处理后架构图.png
源码
web server
- web server之默认定时调度是自己实现的起线程,一个项目一个项目轮训,如果符合core条件则执行,这就是为什么我们定的某个时间点执行,但是好像都会稍微晚一点点时间。如果开启quartz,那quartz定时和默认轮训会并存,代码使用sync锁加数据库状态避免重复
- 默认使用轮训线程轮训,启动时启动TriggerManager.TriggerScannerThread
- TriggerManager.TriggerScannerThread不断执行run方法,run方法中checkAllTriggers方法for循环所有project,一个个判断是否满足corn条件,满足执行条件则去ExecuteFlowAction.doAction
- 再去ExecutorManagerAdapter.submitExecutableFlow, 这边适配器模式把几个功能做适配
-
具体执行ExecutorManager.submitExecutableFlow放入队列,这边是做一个轻量的生产者消费者模式,如果宕机了就会丢失,这次任务执行不了
web server之默认定时调度.png - 启动时启动了消费者线程ExecutorManager.QueueProcessorThread
-
ExecutorManager.QueueProcessorThread中run轻量级的生产消费模式,wait避免浪费空转,notifyAll是在dispatch到exec server后,线程select一个合适之后,http远程调用exec server
web server之默认定时调1.png
exec server
- 通过实现servlet提供http服务,servlet到FlowRunnerManager.submitFlowRunner提交到线程池
-
FlowRunner.run线程池执行任务,观察者模式发送开始事件,执行任务封装JobRunner,提交到全局线程池,所以如果依赖任务多可以考虑设置大一点线程数。然后如果有失败的任务会重新执行,最后会关闭这个局部线程池。两个线程池目的是解耦
exec server.png -
全局线程池JobRunner执行到AbstractProcessJob根据你配置的common选择实现类python是ProcessJob。执行脚本,多个依赖脚本for循环本exec server执行
exec server 1.png
elasticjob-lite对比azkaban
- elastic-job系列分析分布式定时任务elastic-job(一)。这边elasticjob-lite就是使用在分布式场景
- App1就是项目的应用,elastic-job就是通过jar引入,依赖zookeeper,分布式部署的,具体细节可以看析分布式定时任务elastic-job(一)
对比.png
网友评论