马上部分流量计算-Jstorm提交Topology过程(上)

5、上篇任务已经ServiceHandler.submitTopologyWithOpts()方法。在该方法中,会实例化一个TopologyAssignEvent,相当于创建了一个topology级别的作业,然后将其保存到TopologyAssign的任务队列中。详细代码例如以下:

TopologyAssignEvent assignEvent = new TopologyAssignEvent();
assignEvent.setTopologyId(topologyId);
assignEvent.setScratch(false);
assignEvent.setTopologyName(topologyname);
assignEvent.setOldStatus(Thrift
.topologyInitialStatusToStormStatus(options
.get_initial_status())); TopologyAssign.push(assignEvent);

6、TopologyAssign是Jstorm一个任务分配器。它会依据配置和Topology中spout和bolt的关系来进行Task的创建和分配,可是详细任务的创建和非配并发其自身完毕的,二是调用Jstorm自身的调度器完毕的。当然Jstorm同意用户依据自己业务需求定制调度器,关于Jstorm的调度器分析会本人专门写一篇文章,此处暂不做不论什么说明。回到TopologyAssign。该类是一个实现了Runnable接口的后台线程。随着Nimbus启动,主要完毕topology作业分配、备份和作业均衡的作用。当天还是通过Jstorm的调度器来完毕的。其run方法会採用堵塞的方式获取自身作业队列中的作业,然后进行作业分配,其作业分配核心业务例如以下

public Assignment mkAssignment(TopologyAssignEvent event) throws Exception {
String topologyId = event.getTopologyId();
TopologyAssignContext context = prepareTopologyAssign(event);
//ResourceWorkerSlot是worker的抽象。封装了worker和其task
Set<ResourceWorkerSlot> assignments = null;
IToplogyScheduler scheduler = schedulers.get(DEFAULT_SCHEDULER_NAME);
//通过Jstorm的调度来计算任务的分配
assignments = scheduler.assignTasks(context);
Assignment assignment = null;
Map<String, String> nodeHost = getTopologyNodeHost(
context.getCluster(), context.getOldAssignment(), assignments); Map<Integer, Integer> startTimes = getTaskStartTimes(context,
nimbusData, topologyId, context.getOldAssignment(), assignments);
//获取提交到集群的jar包地址,Worker运行任务时须要下载代码
String codeDir = StormConfig.masterStormdistRoot(nimbusData.getConf(),
topologyId);
assignment = new Assignment(codeDir, assignments, nodeHost, startTimes);
StormClusterState stormClusterState = nimbusData.getStormClusterState();
//将分配好的任务上传到ZK,通知supervisor
stormClusterState.set_assignment(topologyId, assignment);
//更新Task的開始时间
NimbusUtils.updateTaskHbStartTime(nimbusData, assignment, topologyId);
// 更新元信息到ZK
if (context.getAssignType() == TopologyAssignContext.ASSIGN_TYPE_REBALANCE
|| context.getAssignType() == TopologyAssignContext.ASSIGN_TYPE_MONITOR)
NimbusUtils.updateMetricsInfo(nimbusData, topologyId, assignment);
else
metricsMonitor(event);
return assignment;
}

7、Nimbus已经将任务分配好了。而且创建到ZK上,此时就须要supervisor认领自己的任务了,supervisor获取任务的详细逻辑封装在SyncSupervisorEvent,其也是一个后台线程,会不停获取ZK上(JSTORM_ROOT/assignments下)的所有任务,然后把自己的任务保存到本地磁盘上。再通过NimbusClient把topology的代码保存到本地,然后启动worker启动线程来运行任务,详细业务逻辑代码例如以下

public void run() {

			RunnableCallback syncCallback = new EventManagerZkPusher(this,
syncSupEventManager); /**
*首次启动时主动获取ZK上JSTORM_ROOT/assignments的所有任务,兴许通过ZK的watch以一种回调的方式获取任务,
*/
Map<String, Assignment> assignments = Cluster.get_all_assignment(
stormClusterState, syncCallback);
/**
*获取本地已经下载的topology
*/
List<String> downloadedTopologyIds = StormConfig
.get_supervisor_toplogy_list(conf);
/**
* 在所有作业中。获取自身的作业
*/
Map<Integer, LocalAssignment> localAssignment = getLocalAssign(
stormClusterState, supervisorId, assignments); /**
* 将作业保存到本地磁盘
*/
localState.put(Common.LS_LOCAL_ASSIGNMENTS, localAssignment);
// 获取topology的代码下载地址
Map<String, String> topologyCodes = getTopologyCodeLocations(
assignments, supervisorId);
//通过NimbusClient将代码下载到本地
downloadTopology(topologyCodes, downloadedTopologyIds); /**
* 删除没用的topology
*/
removeUselessTopology(topologyCodes, downloadedTopologyIds); /**
* 将syncProcesses加到运行队列。syncProcesses复杂启动新的worker来运行任务
*/
processEventManager.add(syncProcesses); }

8、SyncSupervisorEvent将自己的作业选出来,并保存到本地之后,再由SyncProcessEvent来启动worker运行详细的作业。SyncProcessEvent主要干两件事。启动新的worker。杀死没用的worker。此处要涉及启动新的Worker,详细业务逻辑例如以下

private void startNewWorkers(Set<Integer> keepPorts,
Map<Integer, LocalAssignment> localAssignments) throws Exception {
/**
* 获取本次新分配的作业
*/
Map<Integer, LocalAssignment> newWorkers = JStormUtils
.select_keys_pred(keepPorts, localAssignments); /**
* 给每一个新作业生成一个ID
*/
Map<Integer, String> newWorkerIds = new HashMap<Integer, String>(); for (Entry<Integer, LocalAssignment> entry : newWorkers.entrySet()) {
Integer port = entry.getKey();
LocalAssignment assignment = entry.getValue(); String workerId = UUID.randomUUID().toString();
newWorkerIds.put(port, workerId);
//保存每一个Worker的ID到本地 StormConfig.worker_pids_root(conf, workerId);
//启动新的JVM运行作业
launchWorker(conf, sharedContext,
assignment.getTopologyId(), supervisorId, port,
workerId, assignment); }

以上就是Jstorm提交一个topology的过程。这两篇文章仅仅是给出了一条主线。具体的代码逻辑并未具体给出,兴许会不断完好,同一时候关于Jstrom的调度器兴许也会给详细分析

版权声明:本文博客原创文章。博客,未经同意,不得转载。

流量计算-Jstorm提交Topology过程(下一个)的更多相关文章

  1. 流式计算-Jstorm提交Topology过程(上)

    Topology是Jstorm对有向无环图的抽象,内部封装了数据来源spout和数据处理单元bolt,以及spout和bolt.bolt和bolt之间的关系.它能够被提交到Jstorm集群. 本文以J ...

  2. 计算后缀表达式的过程(C#)

    计算后缀表达式的过程是一个很好玩的过程,而且很简单哦!这里呢,有个计算的技巧,就是:遇到数字直接入栈,遇到运算符就计算! 后缀表达式也叫逆波兰表达式,求值过程可以用到栈来辅助存储: 假定待求值的后缀表 ...

  3. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

  4. java计算下一个整5分钟时间点

    需求背景 我的需求是获取当前时间之后的下一个"整5分钟时间点". 首先,那么何为"整5分钟时间点"? 满足以下两个条件的时间: 分钟数等于以下时间中的一个,且秒 ...

  5. MapReduce剖析笔记之二:Job提交的过程

    上一节以WordCount分析了MapReduce的基本执行流程,但并没有从框架上进行分析,这一部分工作在后续慢慢补充.这一节,先剖析一下作业提交过程. 在分析之前,我们先进行一下粗略的思考,如果要我 ...

  6. 为什么下一个十年的主战场在 Serverless?

    作者 | 不瞋 阿里云 Serverless 负责人 "唯有超越,才能让我们走下去." 这是不瞋在阿里的第十年.从 2010 年加入阿里云,不瞋参与了阿里云飞天分布式系统的研发,历 ...

  7. SQL Server获取下一个编码字符实现

    周末看到SQL Server 大V潇湘隐者的获取下一个编码字符串问题,本来作为以上博文的回复,也许回复内容长度超过其允许限制,无法提交.鉴于此,特记录SQL Server实现过程,方便自己回顾和查阅. ...

  8. 通过 IDE 向 Storm 集群远程提交 topology

    转载: http://weyo.me/pages/techs/storm-topology-remote-submission/ http://www.javaworld.com/article/20 ...

  9. SNF快速开发平台MVC-审核流,审核完成后会给下一个审核人发邮件,下一个审核人可以不登录系统,在邮件里进行审核处理

    审核流设计和使用参考以下资料: 审核流设计 http://www.cnblogs.com/spring_wang/p/4874531.html 审核流实例 http://www.cnblogs.com ...

随机推荐

  1. 恶补jquery(四)jquery中事件--冒泡

    事件 当我们在打开一个页面的时候.浏览器会对页面进行解释运行,这实际上是通过运行事件来驱动的.在页面载入事件时,运行Load()事件,是这个事件实现浏览器解释运行代码的过程. 事件机制 事件中的冒泡现 ...

  2. hdu3804(树链剖分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804 题意:给定一棵n个结点的树及边权,回答m个询问(x,y)满足以下条件的边权: 1)该边在结点1~ ...

  3. mongoDB 批量更改数据,某个字段值等于另一个字段值

    由于mongodb数据库类似js的写法,所以即使数据库中新的列不存在也会自动创建 db.hospital.find().forEach( function(item){ db.hospital.upd ...

  4. JVM必备指南(转)

    本文由 ImportNew - xiafei 翻译自 anturis.欢迎加入翻译小组.转载请见文末要求. 简介 Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来 ...

  5. apache cxf之 一个简单的JAX-WS服务程序

    推荐一本apache cxf的书籍: apache cxf的配置,这边就不做介绍了.请参照我关于它配置的博文. 开发步骤: 1.新建Java project,build path引入cxf runti ...

  6. JS上传图片本地实时预览缩略图

    HTML 代码如下 <body> <table width="100%" border="0" cellspacing="0&quo ...

  7. POJ 2536 Gopher II(二分图的最大匹配)

    题目链接:http://poj.org/problem?id=2536 题意:已知有n仅仅老鼠的坐标,m个洞的坐标,老鼠的移动速度为V,S秒以后有一仅仅老鹰要吃老鼠,问有多少个老鼠被吃. 非常明晰,二 ...

  8. Android实现隐藏状态栏和标题栏

    隐藏标题栏需要使用预定义样式:android:theme=”@android:style/Theme.NoTitleBar”. 隐藏状态栏:android:theme=”@android:style/ ...

  9. 使IIS Express支持其他网络客户端访问

    今天尝试利用Android客户端Web浏览器访问VS2012 IIS Express调试中的Web应用,发现这个IIS Express仅支持localhost主机名地址访问. 上网搜索找到解决方案,几 ...

  10. uva live 4394 String painter 间隔dp

    // uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...