azkaban web-server源码解析

来源:互联网 发布:数控机床螺纹编程实例 编辑:程序博客网 时间:2024/05/19 14:37

注:请先看azkaban官方文档,然后安装好azkaban-web-server并熟悉使用流程后,再往下看

一、概述

azkaban主要用于hadoop相关job任务的调度,但也可以应用任何需要调度管理的任务,可以完全代替crontab。azkaban主要分为web-server(任务上传,管理,调度),executor-server(接受web-server的调度指令,进行任务执行)。


二、源码分析


1.数据表:
projects:工程
project_versions:工程版本信息已经上传文件的信息(MD5,chunk数等),每次上传都会覆盖上一个flow,并且版本号+1,但是数据表里不会做旧数据物理删除
project_permissions:工程权限配置信息
project_flows:工程下包含的flow信息
project_files:工程包含的上传文件内容,分成多个chunk存储
project_events:操作日志
project_properties:每个job的配置信息
triggers:调度配置,例如执行周期等。一个调度对应一个trigger,webServer启动的时候会加载所有的trigger到内存。
active_executing_flows:执行中的flow,执行完后会delete
executors:执行节点(服务器的ip端口号以及是否active)
execution_flows:可执行flow,包含了flow的一些信息以及执行配置信息(对应数据结构ExecutableFlow),其中executor_id是executors表的id

2.数据结构:
node的内部属性:
        level: 距离起始节点的距离(多条路径的话取最大值),起始节点level为0

Edge的内部属性:
        id:getSourceId() + ">>" + getTargetId()

flow的内部属性:
        inEdges:key为jobName,value为节点的入边集合
        outEdges:key为jobName,value为节点的出边集合
        startNodes:起始Node集合,没有入边的谓之起始节点
        endNodes:结束Node结合,没有出边的谓之结束节点
        每个flow里能配置报警等信息

nodeDependencies:Map<String, Map<String, Edge>>,例如
            {jobB_B: 
                    {jobB_A: 
                        {sourceId: jobB_A, targetId: jobB_B}
                    }
             }

flowMap:key为root节点的jobName,value为flow

flowDependencies: key为jobName,value为jobName的集合(依赖的节点属于另一个flow)

schedule:

ExecutableFlow:可执行的flow,执行的单元,用户传递给executorManager,包含了执行信息,以及执行配置信息ExecutionOptions(成功失败邮件、并发控制等)


2.上传job:
(1)把压缩包存到/temp下
(2)解压压缩包到azkaban/temp下
(3)DirectoryFlowLoader加载azkaban/temp下的properties文件以及job文件
    3-1:加载解析properties文件,properties有继承覆盖关系,子目录的properties里会继承覆盖父目录里的properties
    3-2:加载解析job文件,对每个job文件新建一个Node,设置type(例如command),设置id(为jobName),设置
            jobSource(为job文件相对路径,相对于azkaban/temp目录),更新缓存(设置jobPropsMap和nodeMap)
(4)job文件校验,校验http job callback
(5)解析job依赖关系,主要是建立数据结构nodeDependencies
(6)构造flow,从root节点开始递归建立(不被其他节点依赖的节点也就是出度为0的节点称之为root节点)。
(7)解析flow间的依赖,就是检查了下flow与flow之间是否有循环依赖

3.创建schedule:
(1)解析参数,构造ExecutionOptions(调度配置,就schedule配置页面那些参数)
(2)插入trigger表
    2-1:判断调度合法性(是否非周期执行并且调度已过期)
    2-2:
    2-3:创建TriggerAction(触发器触发的动作,有很多实现类,比如ExecuteFlowAction,表示执行flow的动作

0 0
原创粉丝点击