美文网首页js css html
大数据定时调用azkaban

大数据定时调用azkaban

作者: 后来丶_a24d | 来源:发表于2022-12-13 11:48 被阅读0次

    目录

    • 本地调试
      • 本地启动SingleServer模式
      • 本地启动分开配置模式
    • 定时任务调度使用场景
      • 场景
      • 使用
    • 总架构图
      • 原始架构图
      • 处理后架构图
    • 源码
      • web server
      • exec server
    • elasticjob-lite对比azkaban
    • 参考文章

    本地调试

    • 注意本文是win10系统方案
    • github地址azkaban

    本地启动SingleServer模式

    • azkaban有几种启动模式,一种是web server和exec server分开部署的一般用于线上,一种是SingleServer模式部署,一般用于调试,数据库用的H2
    1. gradle build -x test
    2. AzkabanSingleServer里面设置工作目录, 就是下载的idea目录


      idea edit.png
    3. 在源码目录下新建个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
    1. conf/azkaban.properties里面的数据库连接记得修改成你自己的mysql数据库连接
    2. 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


    参考文章

    相关文章

      网友评论

        本文标题:大数据定时调用azkaban

        本文链接:https://www.haomeiwen.com/subject/gcsnxdtx.html