jstorm源码分析:work管理

原创 2016年05月31日 08:57:15

管理work

前面已经知道了,通过SyncProcessEvent 可以从zookeeper上获取分配到一台机器的任务信息,那么有了这些信息,我们能干什么呢?接下来我们就来揭开SyncProcessEvent的面纱

主要成员

private LocalState localState; 本地状态,主要是本地所有的work状态信息,包括心跳检测信息等   

private Map

入口

整个入口还是在我们的run函数中:

public void run(Map<Integer, LocalAssignment> localAssignments, Set<String> downloadFailedTopologyIds ) 

第一个参数就是从zk上获取的分配到这台机器上的work信息

第二个是下载失败的拓扑任务

从文件中获取所有work的心跳信息

所有的work都会把自己的信息写到文件中,这样我们可以通过读取文件获取这些work的运行信息
“`

 public Map<String, StateHeartbeat> getLocalWorkerStats(Map conf, LocalState localState, Map<Integer, LocalAssignment> assignedTasks) throws Exception {

    Map<String, StateHeartbeat> workeridHbstate = new HashMap<String, StateHeartbeat>();

    int now = TimeUtils.current_time_secs();

    /**
     * Get Map<workerId, WorkerHeartbeat> from local_dir/worker/ids/heartbeat
     */
    //从本地文件中,获取所有本地的进程
    Map<String, WorkerHeartbeat> idToHeartbeat = readWorkerHeartbeats(conf);
    for (Entry<String, WorkerHeartbeat> entry : idToHeartbeat.entrySet()) {

        String workerid = entry.getKey().toString();

        WorkerHeartbeat whb = entry.getValue();

        State state = null;
        //如果是空的,那么就不是一个正常启动的work,我们就去看看是否正在启动,如果是,那么去验证是否zk上分配这个任务,如果否,直接从启动列表中删除
        if (whb == null) {
            state = State.notStarted;
            //获取work的启动时间和端口
            Pair<Integer, Integer> timeToPort = this.workerIdToStartTimeAndPort.get(workerid);
            //有进程的启动列表中
            if (timeToPort != null) {
                LocalAssignment localAssignment = assignedTasks.get(timeToPort.getSecond());
                //但是在zk中找不到任务的信息,那么就需要把从启动列表中删除
                if (localAssignment == null) {
                    LOG.info("Following worker don't exit assignment, so remove this port=" + timeToPort.getSecond());
                    state = State.disallowed;
                    // workerId is disallowed ,so remove it from workerIdToStartTimeAndPort
                    Integer port = this.workerIdToStartTimeAndPort.get(workerid).getSecond();
                    this.workerIdToStartTimeAndPort.remove(workerid);
                    this.portToWorkerId.remove(port);
                }
            }
        } else if (matchesAssignment(whb, assignedTasks) == false) {   //看headbeat和zk分配信息是否匹配

            // workerId isn't approved or
            // isn't assigned task
            state = State.disallowed;

        } else if ((now - whb.getTimeSecs()) > JStormUtils.parseInt(conf.get(Config.SUPERVISOR_WORKER_TIMEOUT_SECS))) {
            //上次汇报时间距离当前时间超过了配置时间,并且不是被杀掉的,那么就报告错误信息。 统一标注是超时
            if (killingWorkers.containsKey(workerid) == false) {
                String outTimeInfo = " it is likely to be out of memory, the worker is time out ";
                workerReportError.report(whb.getTopologyId(), whb.getPort(),
                        whb.getTaskIds(), outTimeInfo);
            }

            state = State.timedOut;
         } else {
            //进程是否死了,看/proc/workid目录是否存在
            if (isWorkerDead(workerid)) {
                //不在被杀掉列表中
                if (killingWorkers.containsKey(workerid) == false){
                    String workeDeadInfo = "Worker is dead ";
                    workerReportError.report(whb.getTopologyId(), whb.getPort(),
                            whb.getTaskIds(), workeDeadInfo);
                }
                state = State.timedOut;
            } else {
                state = State.valid;
            }
        }

        if (state != State.valid) {
            if (killingWorkers.containsKey(workerid) == false)
                LOG.info("Worker:" + workerid + " state:" + state + " WorkerHeartbeat:" + whb + " assignedTasks:" + assignedTasks
                        + " at supervisor time-secs " + now);
        } else {
            LOG.debug("Worker:" + workerid + " state:" + state + " WorkerHeartbeat: " + whb + " at supervisor time-secs " + now);
        }
        //更新headbeats
        workeridHbstate.put(workerid, new StateHeartbeat(state, whb));
    }

    return workeridHbstate;
}

“`
代码比较长,总结:
1 通过调用readWorkerHeartbeats 获取所有work心跳信息(读取文件获取的)
2 对每个work的心跳信息,分情况进行处理:
2.1 心跳信息是空的:那么如果在启动列表中,且不是分配到这个机器上的任务(zk信息中找不到),那么从启动列表中删除。 这种情况是work还在启动中,但是任务已经被停止了。
2.2 检测任务是否匹配: 看work的heatbeats中的任务id和zk上该work的任务id是否一样
2.3 当前work的heartbeat更新时间超过配置时间了:那是否在删除的列表中,如果不存在,报个错误。标示work状态为超时。
2.4 看进程是否死了,如果死了,那么标示超时,否则,就是正常的

3 就是把状态更新到heartbeat中。

删除无用的worker

对work各种 状态进行判断
1 如果在work正在启动列表中并且heatbeat状态是没有启动,直接跳过。
2 我们状态正常的,先记录下
3 对于非正常的。 首先放到待删除列表中,如果是正常关闭中,那么就记录个日志。

通过调用shutWorker关闭所有待删除的work.
如果带删除work都成功杀死了,那么就释放: 任务清空超时信息
清空已经删除的work的本地信息
最后返回所有正常的work,这个包含两个部分,一个是前面状态正常的,另外加上正在启动列表中,有心跳信息但是心跳状态是nostarted 的

JStorm源码分析(一)Worker核心源码分析(草稿|无代码|无图版)

(一)属性分析 Worker 类下只有一个属性—— WorkerData ,封装了所有与 Worker 有关的属性,下面列表分类阐述这些属性的作用: 组 组的作用 变量名 类型 ...
  • u013126638
  • u013126638
  • 2017年03月22日 11:32
  • 616

storm配置:设置worker进程内存大小

Storm中真正干活的是各个worker,而worker由supervisor负责启动。在topology启动过程中我们会看到如下的启动日志: 这就是启动一个worker进程,也就是一个...
  • jmppok
  • jmppok
  • 2013年12月20日 13:46
  • 7548

storm配置:如何解决worker进程内存过小的问题

Storm中真正干活的是各个worker,而worker由supervisor负责启动。在topology启动过程中我们会看到如下的启动日志: 这就是启动一个worker进程,也就是一个JV...
  • bbaiggey
  • bbaiggey
  • 2016年09月09日 12:59
  • 2050

JStorm - 安装配置

1. JStrom说明 JStorm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这个任务跑起来,并且按7...
  • szzhaom
  • szzhaom
  • 2014年12月06日 21:07
  • 5069

jstorm提交topology后子节点worker is dead

worker is dead on
  • qq_30831935
  • qq_30831935
  • 2016年08月31日 16:00
  • 378

Jstorm 集群搭建过程/Jstorm集群一键安装部署

Jstorm 官方搭建使用过程如连接https://github.com/alibaba/jstorm/wiki/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85 ,我整理了三...
  • youdianjinjin
  • youdianjinjin
  • 2016年05月31日 23:37
  • 2576

jstorm源码分析:work管理

管理work前面已经知道了,通过SyncProcessEvent 可以从zookeeper上获取分配到一台机器的任务信息,那么有了这些信息,我们能干什么呢?接下来我们就来揭开SyncProcessEv...
  • benbendy1984
  • benbendy1984
  • 2016年05月31日 08:57
  • 1557

jstorm 问题

1 运行topology时提示work数量不够。或者没有活着的supervisor,Failed to make assignment xxxx, due to no alive supervisor...
  • CottonDuke
  • CottonDuke
  • 2017年12月26日 15:07
  • 94

jstorm任务调度总结

原文链接:http://blog.chinaunix.net/uid-29038263-id-5765584.html 1 Jstorm简介       Jstorm是开源的分布式实时计算系统,相...
  • dengqi18814470962
  • dengqi18814470962
  • 2017年08月15日 17:39
  • 254

JStorm-2.1.1源码分析--Topology提交(下)

上篇文章已经介绍了ServiceHandler.submitTopologyWithOpts()方法,在该方法中,会实例化一个TopologyAssignEvent,相当于创建了一个topology级...
  • u010010428
  • u010010428
  • 2016年06月10日 14:17
  • 2462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jstorm源码分析:work管理
举报原因:
原因补充:

(最多只允许输入30个字)