Worker根据Topology的定义及分配到自身的任务情况,计算出发出的消息被那些Task接收,由于Worker上分配的任务可能被调整,因此Worker需要定时的更新这些连接信息。

ZMQ连接信息更新

函数:mk-refresh-connections

方法原型:

 (conf TASK-REGRESH-POLL-SECS) refresh-connections).

代码说明:

  1. 调用mk-halting-timer创建计时器,该代码在创建Worker数据时调用。
  2. 创建一个用于更新连接的函数,然后立即执行refresh-connections函数更新ZMQ,然后不断执行该函数,执行间隔为TASK-REFRESH-SECS默认为10秒,在mk-worker函数中调用.

从Zookeeper中获取Topology活跃情况

refresh-storm-active函数获取Topology的状态信息.

方法原型:

(defn refresh-storm-active ([worker])…)

方法说明:

  1. 提供匿名函数做为callback参数,在相应Zookeeper节点变化时回调。
  2. 通过:refresh-active-timer计时器完成定期调用,默认为10秒。
    (shcedule-recurring(:refresh-active-timer worker) 0 (conf TASK-FEFRESH-POLL_SECS) (partial refresh-active worker)).
  3. 调用:storm-cluster-state的storm-base方法获取Topology的基础信息。
  4. 判断该Topology是否处于活跃状态(:active),并将判断结果存储于:storm-active-atom变量中。

Worker中接收函数

Mk-transfer-local-fn函数用于产生并发送消息到Executor的接收队列,同一Worker内部的Executor之间通过该函数传递消息。

方法原型:

(defn mk-transfer-local-fn [worker])

方法说明:

  1. 调用:short-executor-receive-queue-map返回Executor中第一个Task的TaskId到该Executor对应的接收队列的映射关系,保存到short-executor-queue-map变量。
  2. 调用task->short-executor返回从该Worker中的TaskId到Executor中第一个Task的TaskId的映射关系。
  3. 定义返回的匿名函数,该函数输入为ZMQ收到的一组消息tuple-batch,按照与消息TaskId对应的Executor中第一个Task的TaskId对消息进行分组,变量grouped对应的键为Executor中第一个Task的TaskId,值为属于该Executor的一组消息。
  4. 通过short-executor-receive-queue-map得到TaskId与Executor相对应的接收消息队列q。
  5. 调用disruptor/publish方法将收到的消息发送到队列q.

Woker中的发送函数

Mk-transfer-fn用于Executor的数据发送,分别有以下两种情况:

  1. 目标TaskId与发送TaskId属于同一个Worker,此时不需要跨进程传输消息,可将消息通过mk-tansfer-local-fn发送至接收端Executor的接收队列。
  2. 消息的目标TaskId跟发送TaskId属于不同的Worker中,此时则将消息序列化(KryoTupleSerializer)后发送至Worker的发送队列,由Worker(mk-tranfer-tuples-handler)负责将队列的消息通过ZMQ发送出去.

方法原型:

defn mk-transfer [worker]

该方法返回一个参数为系列化器serializer和一组消息的函数。

不同Worker间的通信

Worker中有一个额外的线程对transfer-queue(worker对应的消息发送队列)进行监听,Mk-transfer-tuples-handler用于创建对应的消息处理器。

方法原型:

defn mk-transfer-tuples-handler [worker]
  1. 调用cached-node+port获取Worker中与目标node+port相对应的ZMQ Socket连接,保存到node+port->socket.
  2. 调用worker-data的cached-task->node+port获取TaskId到node+port的映射,保存到task->node+port.
  3. 定义一个clojure-handler,对应的函数定义为fn [packets _ batch-end?],第一个参数为一组消息packets,第二个忽略,第三个为为结束标记。
  4. 调用msg/seng函数将消息发送出去。

 

发送监听线程的启动:

transfer-tuples (mk-transfer-tuples-handler worker)
transfer-thread (disruptor /consume-loop* (:transfer-queue worker) transfer-tuples)

Storm系列(十三)架构分析之Worker-维护ZMQ连接的更多相关文章

  1. Storm系列(十一)架构分析之Supervisor-管理Worker进程的事件线程

    处理流程:   方法原型: (defn sync-processes [supervisor]) 函数说明: Supervisor是一个supervisor-data对象. 从local-state中 ...

  2. Storm系列(九)架构分析之Supervisor-同步Nimbus的事件线程

    Supervisor由三个线程组成,一个计时器线程和两个事件线程. 计时器线程负责维持心跳已经更新Zookeeper中的状态,还负责每隔一定的时间将事件线程需要执行的事件添加到其对应的队列中. 两个事 ...

  3. Storm系列(七)架构分析之Scheduler-调度器[DefaultScheduler]

    Storm默认的任务调度器.实现如下: 1  (defn –prepare [this conf]) 2  (defn –schedule [this ^Topologies topologies ^ ...

  4. Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]

    任务调度接口定义: 1  IScheduler{ 2      // conf为当前nimbus的stormp配置 3  void prepare(Map conf); // 初始化 4  // to ...

  5. Storm系列(五)架构分析之Nimbus启动过程

    启动流程图   mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj ...

  6. Nimbus<一>Storm系列(五)架构分析之Nimbus启动过程

    启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj\b ...

  7. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  8. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  9. apache kafka系列之性能优化架构分析

    apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

随机推荐

  1. 开发设计模式(一)Command模式

    Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...

  2. Java内存管理:深入Java内存区域

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的皇帝 ...

  3. uva 165 Stamps

    题意: 现有k种邮票面额, 一封信上最多贴h张邮票. 求能贴出的最大连续区间,即[1, max_value]这个区间内的所有面额都能贴出来. 并输出k种面额, h + k <= 9. 思路: 这 ...

  4. mysql的过程和Oracle的区别

    mySQL 和 Oracle 不一样  , mysql 中的function 中, 没有 CREATE OR REPLACE如果需要用到这句,可以使用 DROP FUNCTION IF EXISTS ...

  5. css3 旋转出现动画

    @-moz-keyframes daf{ 0% { -moz-transform: rotate(-360deg) scale(0.2); -webkit-transform: rotate(-360 ...

  6. jav利用反射修改类的静态变量

    有Student这个类: public class Student { private static String schoolName=""; private static St ...

  7. Altium查看所有快捷键,图文教程

    方式一:依次打开“查看”>>"工作区面板">>“Help”>>“快捷方式”.即可. 英文版“快捷方式”为“shotcut” 方式二: 留意右下角 ...

  8. ARM的NEON协处理器是什么

    ARM的NEON协处理器是什么 何谓多媒体扩展指令集?由于原理复杂坚涩,小编就简单的打个比方:厂商们分析平时处理器干哪些事情最慢.又最经常用到,然后把这些最消耗时间的事情固化成电路,做成一个额外的部分 ...

  9. RunTime报错的一个原因,以及截图

    const char * handle; handle = m_conn->openFile(szRemoteFile,"writeOnly","createTru ...

  10. 139. Word Break

    题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...