准备消息循环的数据

函数原型:

let[executor-sampler (mk-stats-sampler (:storm-conf executor-data))]

主要功能:

定义tuple-action-fn函数,该函数会根据TaskId获得对应的Bolt对象并调用其executor方法.

Bolt输入处理函数

函数原型:

tuple-action-fn (fn [task-id ^TupleImpl tuple])

主要功能:

获得Bolt对应的bolt-obj,调用executor回调方法。

Bolt的消息发送函数

函数原型:

bolt-emit (fn [stream anchors values task])

主要功能:

  1. 调用tasks-fn获取消息接收端的TaskId集合。
  2. 调用transfer-fn函数发送消息,该函数与Spout中实现类似(唯一的区别不使用overflow-buffer缓存).

Bolt对象的初始化

调用Bolt的prepare函数
初始化过程:

  1. 获取Bolt对象并定义相关方法。bolt-emit方法用于向Executor的消息发送队列中发送消息。
  2. 调用Bolt对象的prepare方法,同时实例化Bolt对象的OutputCollector对象作为prepare方法的传入参数,OutputCollector的emit方法将调用bolt-emit函数来发送消息,ack及fail方法则用来对消息进行跟踪。
  3. 调用mk-task-receiver函数来获得接收队列的处理函数(tuple-action-fn)。

消息循环

调用阻塞方式的 consume-batch-when-available函数对接收队列中的消息进行处理。

(fn [] (distruptor/comsume-batch-when-available receive-queuu event-handler))

 

创建Executor

创建Executor函数mk-executor

函数原型:

(defn mk-executor [worker executor-id])

方法说明:

  1. 调用mk-executor-data创建Executor的数据。
  2. 调用mk-task创建Executor中的每个Task对应的数据。
  3. 调用start-batch-transfer->worker-handler!方法启动Executor的数据发送线程。
  4. 调用mk-threads方法获得Executor的主循环线程,并通过with-error-reaction宏对mk-threads进行包装。当异常发生时调用report-error-and-die方法记录错误并退出。
  5. 实例化RunningExecutor对象用来操作executor.
  6. 实例化 Shutdownable用于退出Executor并清理相关资源,具体操作包括:
    a)结束DisruptorQueue的消息循环。
    b)结束Executor中的启动线程
    c)清理用户钩子的数据
    d)断开与Zookeeper的连接
    e)依次调用Executor中Spout或Bolt的close方法.

获取分组函数

函数原型:

(defn outbound-components [^WorkerTopologyContext worker-context component-id])

功能描述:

获取从组件到某一个流的分组函数,task-fn函数通过调用该分组函数可获得消息的目标Task集合。

函数说明:

  1. 调用WorkerTopologyContext对象的getTargets方法得到一个哈希表,该哈希表的键为当前组件所对应的流,值为一个哈希表,用于记录目标组件以何种方式从该流接收数据。
  2. 调用outbound-groupings函数获得分组函数。

outbound-groupings
函数的定义

(defn- outbound-groupings [^WorkerTopologyContext worker-context this-component-id stream-id out-fields component->grouping])

方法说明:

  1. 对目标组件进行过滤,若组件对应的TaskId集合为空,怎被过滤掉。
  2. 用map函数对组件及其分组方式进行处理,调用mk-grouper函数来产生分组函数,并最终返回一个保存有从组件到分组函数的映射关系的哈希表.

mk-grouper

返回一个函数,该函数返回一个TaskId集合,代表消息发送的目的Task集合

函数原型:

(defn mk-grouper [^WorkerTopologyContext context component-id stream-id ^Fields out-fields thrift-grouping ^List target-tasks])

函数说明:

  1. 获取与目标组件对应的Task的数目及排列后的列表,它们将作为计算目标Task的函数输入。某些分组方式只需要目标组件的Task数目,如:ShuffleGrouping操作.
  2. 针对Thrift类型,不同分组方式分别构建分组函数。

 

触发系统Ticks

setup-ticks!函数定期向Executor的接收消息队列发送Tick消息.Executor在收到Tick消息之后,就会执行发送队列的超时操作。setup-ticks!主要用于对Spout节点发送出去的消息进行操作操作。

函数原型:

(defn setup-ticks [worker executor-data])

函数说明:

  1. 配置项TOPOLOGY-TICK-TUPLE-FREQ-SECS用来控制向__system流及__tick流发送消息的频率,tick-time-secs用来保存该频率值,receive-queue为Executor对应的接收Disruptor Queue,context为WorkerTopologyContext对象,Tick消息只发送到本地Worker,并不能被其它Worker的Executor收到。
  2. 判断tick-time-secs是否设置,若已进行设置则开始设置系统的Tick消息.
  3. 若该节点为Spout节点且未设置消息超时,则打印消息退出。参数TOPOLOGY-ENABLE-MESSAGE-TIMEOUTS用于调试模式,由于超时的消息会给系统调试带来额外的复杂性,因此可在调试过程中暂时关闭消息的超时操作。当Spout收到Tick消息时,可对缓存在pending对象中的数据进行超时操作。
  4. 利用Worker定义的用户计时器tick-time-secs为间隔设置计时器,并定义计时器回调函数,向receive-queue中发送一条消息,该消息对应的TaskId为nil,表示该Executor中所有的Task都会收到该消息,消息的内容为tick-time-secs,-1表示系统TaskId,最后一项表示该消息会被发送到SYSTEM-TICK_STREAM.

Storm系列(十六)架构分析之Executor-Bolt的更多相关文章

  1. Storm系列(十五)架构分析之Executor-Spout

    Spout实现mk-threads接口用于创建与Executor对应的消息循环主函数. defmulti mk-threads executor-selector Mk-threads函数的主消息循环 ...

  2. Storm系列(十四)架构分析之Executor-输入和输出处理

    Executor的数据 mk-executor-data函数用于定义Executor中含有的数据. Executor的输入处理 根据executor-id从Worker的:executor-recei ...

  3. Storm系列(十二)架构分析之Worker-心跳信息处理

    Worker通过worker-data方法定义了一个包含很多共享数据的映射集合,Worker中很多方法都依赖它 mk-worker 功能: 创建对应的计时器.Executor.接收线程接收消息   方 ...

  4. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...

  5. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 为什么不让用join?《死磕MySQL系列 十六》

    大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...

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

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

  8. Storm 系列(六)—— Storm 项目三种打包方式对比分析

    一.简介 在将 Storm Topology 提交到服务器集群运行时,需要先将项目进行打包.本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明.主要打包方式有以下三种: 第一种:不加任 ...

  9. MP实战系列(十六)之性能分析插件

    性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...

随机推荐

  1. 如何让VS2012同时调试2个项目

  2. Django数据操作

    1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录. 2.管理器和查询集. 查询集QuerySet表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤 ...

  3. ibdata1是?

    MySQL使用InnoDB引擎的时候,ibdata1这个文件会随着时间的增长,会变得越来越大,占据大量的磁盘空间. 那么,ibdata1里保存了哪些东西,为什么会变得越来越大呢,让我们开看看ibdat ...

  4. Winodws live writer

    发布一篇试试.

  5. 用原生JavaScript实现图片瀑布流的浏览效果

    学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...

  6. 认识变量------JAVA

    声明变量: variables must have a type variables must have a name int count // type int //count name 变量就是杯 ...

  7. sublimtest3文件名乱码问题及解决方案

    在sublime text 3中,Preference, Settings-User,最后加上一行"dpi_scale": 1.0覆盖操作系统设置的DPI. 这是我的Setting ...

  8. python机器学习库

    http://scikit-learn.org/stable/install.html

  9. loadrunner 脚本和replaylog中的中文乱码问题(转载)

    解决这个问题必须认识到一个事实就是,loadrunner和测试服务器交换数据使用的是utf8格式,但是展现在replaylog中是使用gb2312格式,而且在脚本中如何使用web_reg_find的时 ...

  10. 使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘(引)

    使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘 由于帮人在MacBook上装Windows, 用pe格式化了一下分出来的Windows分区, 搞得Mac系统也瘫掉了, 无奈之下 ...