1. ConnectorParams (interface): 定义了各种常量参数,没有声明任何方法。
2. ExecutorServlet.java类
2.1 继承类HttpServlet和接口ConnectorParams,用于处理Http请求,主要是Get请求,处理方式都写在doGet方法中。
2.2 init()方法:创建AzkabanExecutorServer实例,通过该executor server实例获取flowRunnerManager,以及jobRunnerManager。
2.3 doGet(HttpServletRequest req, HttpServletResponse resp)方法:处理具体的请求,并返回resp。 针对不同的action,进行不同的处理。
action可以分为两类:
第一类不需要获取execid和user,有三个action,分别是:update,ping,reloadJobTypePlugins;
第二类action,会先获取execid和user,包含:metadata,metadata_jobRunnerMgr,log,attachments,execute,status,cancel,pause,resume,modifyExecution,job_execute,job_cancel
action=execute时,ExecutorServlet类调handleAjaxExecute()方法去调flowRunnerManager.submitFlow(execId)来执行该工作流。
3. FlowRunnerManager.java类 实现EventListener接口
private Map<Future<?>, Integer> submittedFlows = new ConcurrentHashMap<Future<?>, Integer>();
private Map<Integer, FlowRunner> runningFlows = new ConcurrentHashMap<Integer, FlowRunner>(); 记录当前正在执行的Flows,key是execId
private Map<Integer, ExecutableFlow> recentlyFinishedFlows = new ConcurrentHashMap<Integer, ExecutableFlow>();
void submitFlow(int execId) 方法:
先判断runningFlows是不是已经包含该execId对应的作业流
如果已经包含:抛异常
如果不包含-》获取execId对应的executableFlow实例flow-》然后执行setupFlow(flow)配置flow(创建项目和执行的目录等)-》获取执行配置(ExecutionOptions)-》判断pipelineExecId是否为null,如果不为null-》判断该pipelineExecId对应的flowRunner在不在runningFlows中
如果在runningFlows中:起一个LocalFlowWatcher检测该pipeline流的执行情况
如果不在runningFlows中:起一个RemoteFlowWatcher检测该pipeline流的执行情况。实际是起了一个RemoteUpdaterThread来每隔一定时间(默认为60秒)通过读取数据库的记录监控流的状态。
-》判断流执行设置里是否包含参数flow.num.job.threads,如果存在该参数,且小于默认的值10,则将该流并行执行的job线程数设置为该参数值。-》创建新的FlowRunner实例runner-》对线程做一些配置,configureFlowLevelMetrics(runner); -》再次check runningflows是否包含execId对应的线程-》将runner加入runningflows-》将这个执行流对应的future加入到submittedFlows里用于跟踪流的执行,修改最后提交时间
void handleEvent方法:当流Finish时,在recentlyFinishedFlows 里加入该流,将流从runningFlows里去除
4. EventListener接口,声明了一个方法:void handleEvent(Event event)
5. EventHandler.java类:包含一个HashSet<EventListener>,包含方法addListener,fireEventListener(该方法调用每个listener.handleEvent()),removeListener。
6. ExecutableFlow.java: 包含可执行流的相关信息和设置信息的方法。
7.pipelineExecId:pipeline就是并发策略里的流水线,该execId对应的flow正在执行的执行流中最后次提交的执行流execId
8. ExecutorManager.java类:
private ConcurrentHashMap<Integer, Pair<ExecutionReference, ExecutableFlow>> runningFlows = new ConcurrentHashMap<Integer, Pair<ExecutionReference, ExecutableFlow>>();
private ConcurrentHashMap<Integer, ExecutableFlow> recentlyFinished = new ConcurrentHashMap<Integer, ExecutableFlow>();
8.1 public String submitExecutableFlow(ExecutableFlow exflow, String userId)方法:将作业流提交到执行队列
方法过程:
根据exflow获取flowId -》判断queuedFlows是否满-》
queuedFlows满了-》提交失败,打出log提示error
queuedFlows未满-》获取该次执行流对应的作业流所有正在跑的实例running,获取流执行设置(ExecutionOptions)-》获取流的执行参数(是否enable,如果enable则将参数生效)-》判断runningflows是否为空,如果不为空-》获取并发设置
并发设置:流水线(pipeline)-》设置流水线执行Id(PipelineExecutionId)为正在执行的最后次提交的执行流id,获取pipeline level
并发设置:忽略本次执行(skip)-》抛出异常ExecutorManagerException,给出提示该流已经有实例已经在执行,本次执行被skip了
并发设置:并行执行-》仅修改message提示
-》白名单设置?options.setMemoryCheck(memoryCheck);-》判断是否多节点模式(isMultiExecutorMode)
多节点模式:是-》将该flow记录为正在执行的flow(executorLoader.addActiveExecutableReference(reference);),将作业流放入队列queuedFlows.enqueue(exflow, reference);
多节点模式:否-》将该flow记录为正在执行的flow,选择本地executor,下发作业流dispatch(reference, exflow, choosenExecutor);
9. ExecutableFlow.java类:一个可执行流的相关信息。
10.ExecutionReference.java类:存储execId,executor,updateTime,nextCheckTime,numErrors信息;一个具体的执行实例
11. FlowWatcher.java类:检测某个execId的各个作业的执行状态。
private int execId;
private ExecutableFlow flow;
private Map<String, BlockingStatus> map = new ConcurrentHashMap<String, BlockingStatus>(); 该map用于存储各个job的执行状态,key为jobId,value为job的状态
12. BlockingStatus.java类:管理特定作业的状态,以同步的方式改变作业的状态。当状态处于block状态时,线程会处于等待状态,等待其他线程的通知(notify),最多等待时长为5分钟。
private static final long WAIT_TIME = 5 * 60 * 1000;
private final int execId;
private final String jobId;
private Status status;
13. FlowRunner.java 继承EventHandler,实现Runnable接口。
public void run():
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- AXI_LITE源码学习笔记
AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函数以及整个类的大至,现在结合前面我们研究的线程和RPC,则可以进一步 ...
- Hadoop源码学习笔记(4) ——Socket到RPC调用
Hadoop源码学习笔记(4) ——Socket到RPC调用 Hadoop是一个分布式程序,分布在多台机器上运行,事必会涉及到网络编程.那这里如何让网络编程变得简单.透明的呢? 网络编程中,首先我们要 ...
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...
- Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
随机推荐
- 微信企业号 获取AccessToken
目录 1. AccessToken介绍 2. 示例代码 1. AccessToken介绍 1.1 什么是AccessToken AccessToken即访问凭证,业务服务器每次主动调用企业号接口时需要 ...
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- 前端框架 EasyUI (2)页面布局 Layout
在 Web 程序中,页面布局对应用程序的用户体验至关重要. 在一般的信息管理类的 Web 应用程序中,页面结构通常有一个主工作区,然后在工作区上下左右靠近边界的区域设置一些边栏,用于显示信息或放置一些 ...
- TODO:搭建Laravel VueJS SemanticUI
TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...
- 在 Laravel 中使用图片处理库 Integration/Image
系统需求 PHP >= 5.3 Fileinfo Extension GD Library (>=2.0) … or … Imagick PHP extension (>=6.5.7 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- ZKWeb网页框架1.4正式发布
本次更新的内容有 添加更快的批量操作函数 添加IDatabaseContext.FastBatchSave 添加IDatabaseContext.FastBatchDelete 注意这些函数不会触发注 ...
- Win10 UWP开发系列——开源控件库:UWPCommunityToolkit
在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...