Storm系列(十六)架构分析之Executor-Bolt
准备消息循环的数据
函数原型:
1 | let[executor-sampler (mk-stats-sampler (:storm-conf executor-data))] |
主要功能:
定义tuple-action-fn函数,该函数会根据TaskId获得对应的Bolt对象并调用其executor方法.
Bolt输入处理函数
函数原型:
1 | tuple-action-fn (fn [task-id ^TupleImpl tuple]) |
主要功能:
获得Bolt对应的bolt-obj,调用executor回调方法。
Bolt的消息发送函数
函数原型:
1 | bolt-emit (fn [stream anchors values task]) |
主要功能:
- 调用tasks-fn获取消息接收端的TaskId集合。
- 调用transfer-fn函数发送消息,该函数与Spout中实现类似(唯一的区别不使用overflow-buffer缓存).
Bolt对象的初始化
调用Bolt的prepare函数
初始化过程:
- 获取Bolt对象并定义相关方法。bolt-emit方法用于向Executor的消息发送队列中发送消息。
- 调用Bolt对象的prepare方法,同时实例化Bolt对象的OutputCollector对象作为prepare方法的传入参数,OutputCollector的emit方法将调用bolt-emit函数来发送消息,ack及fail方法则用来对消息进行跟踪。
- 调用mk-task-receiver函数来获得接收队列的处理函数(tuple-action-fn)。
消息循环
调用阻塞方式的 consume-batch-when-available函数对接收队列中的消息进行处理。
1 | (fn [] (distruptor/comsume-batch-when-available receive-queuu event-handler)) |
创建Executor
创建Executor函数mk-executor
函数原型:
1 | (defn mk-executor [worker executor-id]) |
方法说明:
- 调用mk-executor-data创建Executor的数据。
- 调用mk-task创建Executor中的每个Task对应的数据。
- 调用start-batch-transfer->worker-handler!方法启动Executor的数据发送线程。
- 调用mk-threads方法获得Executor的主循环线程,并通过with-error-reaction宏对mk-threads进行包装。当异常发生时调用report-error-and-die方法记录错误并退出。
- 实例化RunningExecutor对象用来操作executor.
- 实例化 Shutdownable用于退出Executor并清理相关资源,具体操作包括:
a)结束DisruptorQueue的消息循环。
b)结束Executor中的启动线程
c)清理用户钩子的数据
d)断开与Zookeeper的连接
e)依次调用Executor中Spout或Bolt的close方法.
获取分组函数
函数原型:
1 | (defn outbound-components [^WorkerTopologyContext worker-context component-id]) |
功能描述:
获取从组件到某一个流的分组函数,task-fn函数通过调用该分组函数可获得消息的目标Task集合。
函数说明:
- 调用WorkerTopologyContext对象的getTargets方法得到一个哈希表,该哈希表的键为当前组件所对应的流,值为一个哈希表,用于记录目标组件以何种方式从该流接收数据。
- 调用outbound-groupings函数获得分组函数。
outbound-groupings
函数的定义
1 | (defn- outbound-groupings [^WorkerTopologyContext worker-context this-component-id stream-id out-fields component->grouping]) |
方法说明:
- 对目标组件进行过滤,若组件对应的TaskId集合为空,怎被过滤掉。
- 用map函数对组件及其分组方式进行处理,调用mk-grouper函数来产生分组函数,并最终返回一个保存有从组件到分组函数的映射关系的哈希表.
mk-grouper
返回一个函数,该函数返回一个TaskId集合,代表消息发送的目的Task集合
函数原型:
1 | (defn mk-grouper [^WorkerTopologyContext context component-id stream-id ^Fields out-fields thrift-grouping ^List target-tasks]) |
函数说明:
- 获取与目标组件对应的Task的数目及排列后的列表,它们将作为计算目标Task的函数输入。某些分组方式只需要目标组件的Task数目,如:ShuffleGrouping操作.
- 针对Thrift类型,不同分组方式分别构建分组函数。
触发系统Ticks
setup-ticks!函数定期向Executor的接收消息队列发送Tick消息.Executor在收到Tick消息之后,就会执行发送队列的超时操作。setup-ticks!主要用于对Spout节点发送出去的消息进行操作操作。
函数原型:
1 | (defn setup-ticks [worker executor-data]) |
函数说明:
- 配置项TOPOLOGY-TICK-TUPLE-FREQ-SECS用来控制向__system流及__tick流发送消息的频率,tick-time-secs用来保存该频率值,receive-queue为Executor对应的接收Disruptor Queue,context为WorkerTopologyContext对象,Tick消息只发送到本地Worker,并不能被其它Worker的Executor收到。
- 判断tick-time-secs是否设置,若已进行设置则开始设置系统的Tick消息.
- 若该节点为Spout节点且未设置消息超时,则打印消息退出。参数TOPOLOGY-ENABLE-MESSAGE-TIMEOUTS用于调试模式,由于超时的消息会给系统调试带来额外的复杂性,因此可在调试过程中暂时关闭消息的超时操作。当Spout收到Tick消息时,可对缓存在pending对象中的数据进行超时操作。
- 利用Worker定义的用户计时器tick-time-secs为间隔设置计时器,并定义计时器回调函数,向receive-queue中发送一条消息,该消息对应的TaskId为nil,表示该Executor中所有的Task都会收到该消息,消息的内容为tick-time-secs,-1表示系统TaskId,最后一项表示该消息会被发送到SYSTEM-TICK_STREAM.
Storm系列(十六)架构分析之Executor-Bolt的更多相关文章
- Storm系列(十五)架构分析之Executor-Spout
Spout实现mk-threads接口用于创建与Executor对应的消息循环主函数. defmulti mk-threads executor-selector Mk-threads函数的主消息循环 ...
- Storm系列(十四)架构分析之Executor-输入和输出处理
Executor的数据 mk-executor-data函数用于定义Executor中含有的数据. Executor的输入处理 根据executor-id从Worker的:executor-recei ...
- Storm系列(十二)架构分析之Worker-心跳信息处理
Worker通过worker-data方法定义了一个包含很多共享数据的映射集合,Worker中很多方法都依赖它 mk-worker 功能: 创建对应的计时器.Executor.接收线程接收消息 方 ...
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 为什么不让用join?《死磕MySQL系列 十六》
大家好,我是咔咔 不期速成,日拱一卒 在平时开发工作中join的使用频率是非常高的,很多SQL优化博文也让把子查询改为join从而提升性能,但部分公司的DBA又不让用,那么使用join到底有什么问题呢 ...
- Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
任务调度接口定义: 1 IScheduler{ 2 // conf为当前nimbus的stormp配置 3 void prepare(Map conf); // 初始化 4 // to ...
- Storm 系列(六)—— Storm 项目三种打包方式对比分析
一.简介 在将 Storm Topology 提交到服务器集群运行时,需要先将项目进行打包.本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明.主要打包方式有以下三种: 第一种:不加任 ...
- MP实战系列(十六)之性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间. 虽然使用阿里的Druid连接池可以完成这个目的,但是,我们一般认为,目前的组件能够达到这个目的,尽量使用目前的组件,因为修改配置和引入第三方库 ...
随机推荐
- CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法
CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hos ...
- Nginx+uWSIG+Django+websocket的实现
1.Django+websocket django-websocket dwebsocket django-websocket是旧版的,现在已经没有人维护,dwebsocket是新版的,推荐使用dwe ...
- Educational Codeforces Round 8 D. Magic Numbers
Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...
- Java学习-数组
1.数组的是Object的直接子类,它属于“第一类对象”,但是它又与普通的java对象存在很大的不同,类名为:[I 一维数组:[I 二维数组:[[I 三维数组:[[[I 2.[代表了数组的维度,一个[ ...
- WPF获取控件的句柄
在WinForm中,获得句柄是一件很容易的事情,This.Handle或者Control.Handle就可以,最近在WPF的开发中发现找不到这个属性,一番查找资料后找到了两种方式. 1,使用Windo ...
- UI表单
Monk.UI表单美化插件诞生记! 阅读目录 背景 预览效果 表单组件 普通文本框 多行文本框 复选框 切换滑块 单选框 下拉选择框 数字输入框 时间选择 文件选择 显示文本 按钮 开源地址 背景 ...
- Apple 如何知道你使用了私有API
大约有三种方式 otool -L这个工具可以清晰的列出你链接所有的库 像IO.Kit是不允许使用的 nm -u 这个工具可以清晰的列出你所有链接符号如 C方法 OC方法 检查所有Selecter的字符 ...
- iOS 8 定位失败问题
首先plist定义两个string: NSLocationWhenInUseUsageDescription NSLocationAlwaysUsageDescription 然后调用 [self. ...
- Memcache仅仅支持简单数据类型
Memcache仅仅支持简单数据类型 ,复杂数据类型需要应用自己处理 从数据库当中取出数据[User [id=1, username=guowuxin, password=guowuxin], Use ...
- swift版本hello
import UIKit class ViewController: UIViewController { @IBOutlet var button : UIButton? //var alertVi ...