Executor的数据

mk-executor-data函数用于定义Executor中含有的数据。

Executor的输入处理

根据executor-id从Worker的:executor-receive-queue-map中获得Disruptor Queue 如下:

1  receive-queue ((:executor-receive-queue-map worker) executor-id)

说明:

Worker的接收线程从ZMQ收到数据后,线程会根据目标的Task Id找到对应的Executor,并将数据发送到该Executor所对应的接收DisruptorQueue中,对于DisruptorQueue中的消息Bolt会调用executor方法处理,而Spout类型的Executor则调用Ack或Fail处理。

mk-task-receive函数定义了一个函数来处理DisruptorQueue中的消息,通过调用disruptor/clojure-handler函数获取消息处理函数,该消息处理函数会在收到新消息时被调用。

函数原型:

1  defn mk-task-receive [executor-data tuple-action-fn]

方法说明:

  1. tuple-action-fn为Executor的消息处理函数(Spout与Bolt各不同)。
  2. 若存在消息来源task-id,则调用一次tuple-action-fn函数,若不存在消息来源taks-id,则在该Executor上的所有Task上调用tuple-action-fn函数。
  3. 在创建Spout或Bolt时,会调用mk-task-receiver函数并将结果存储于event-handler变量中:
    event-handler(mk-task-receiver executor-data tuple-action-fn)
    在Spout中以非阻塞方式接收数据:
    (disruptor/consume-batch receive-queue event-handler)
    在Bolt中以阻塞方式接收数据:
    (disruptor/consume-when-available receive-queue event-handler)

Executor的输出及发送

每个Executor都会有一个输出的Disruptor Queue对象,Executor在发送消息时首先会将消息发送到该队列,Executor会启动一个发送线程来处理该队列中的数据,该线程调用Worker中的mk-transfer-fn产生的函数对数据进行处理,或者把数据通过ZMQ发送(mk-transfer-tuples-handler)到其它Worker,或者直接发送到与该Worker上的其它Executor相对应的接收Disruptor Queue中。

Start-batch-transfer->worker-handler!函数调用disruptor/consume-loop*函数来启动用于发送数据的队列线程。

函数原型:

1  defn start-batch-transfer->worker-handler! [worker executor-data]

方法说明:

  1. 获取worker中的消息发送函数mk-transfer-fn赋值给变量worker-transfer-fn。
  2. 启动Disruptor Queue的消费者线程(disruptor/consume-loop*),batch-transfer-queue为Executor定义的Disruptor Queue对象,disruptor/handler构建EventHandler对象。
  3. Executor的report-error-and-die函数,对错误进行记录并退出进程。
  4. 在创建Executor的过程中,会启动system-threads(mk-executor函数):system-threads[(start-batch-transfer->worker-handler! worker   executor-data)].
  5. Executor在创建其数据时会创建发送队列,发送队列的创建过程:
    Batch-transfer->worker (disruptor/disruptor-queue
    (storm-conf TOPOLOGY-EXECUTOR-SEND-BUFFER-SIZE)
    :claim-strategy :single-threaded
    :wait-strategy (storm-conf TOPOLOGY-DISRUPTOR-WAIT-STRATEGY))

Storm系列(十四)架构分析之Executor-输入和输出处理的更多相关文章

  1. Storm系列(十六)架构分析之Executor-Bolt

    准备消息循环的数据 函数原型: 1  let[executor-sampler (mk-stats-sampler (:storm-conf executor-data))] 主要功能: 定义tupl ...

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

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

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

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

  4. struts2官方 中文教程 系列十四:主题Theme

    介绍 当您使用一个Struts 2标签时,例如 <s:select ..../>  在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...

  5. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

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

  6. 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》

    由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...

  7. MP实战系列(十四)之分页使用

    MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...

  8. ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合)

    一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...

  9. Docker系列(十四):Kubernetes API和源码分析

    Kubernetes API入门 Ku8 eye开源项目

随机推荐

  1. WPF 控件

    ****ScrollViewer**** 前台: <ScrollViewer  HorizontalScrollBarVisibility="Auto" VerticalSc ...

  2. [C和指针] rearrange.c

    C和指针_程序1.1_重排字符 /* ** 这个程序从标准输入(键盘)中读取输入行并按需求处理后在标准输出(屏幕)中打印, ** 每个输入行的后面一行是该行按需求处理后的输出内容. ** ** 输入的 ...

  3. VisualStudio自定义代码段_方法二

    1.在项目中新增一个xml文件为vcoo.snippet,然后右键“插入代码段”,选择Snippet即可: 2.修改代码片段内容后保存: 3.VS菜单中选择“工具”-“代码段管理器”导入这个snipp ...

  4. MVC-简单验证码制作

    1.制作验证码: using System; using System.Collections.Generic; using System.Drawing; using System.Drawing. ...

  5. iOS 后台运行实现 --备用

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 ...

  6. ubuntu terminal 介绍及相关命令

    ubuntu的terminal 1.调出方法 windows键+T 2.终端显示内容 3. 查看当前所在目录的绝对路径--pwd命令 eg1: eg2: linux严格区分大小写 4. 更改/进入目录 ...

  7. Linux下配置jdk1.7

    第一步:下载jdk-7-linux-i586.tar.gz wget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586 ...

  8. ul 、ol li 继承原有样式的问题

    如: 1.为什么我的服务器无法远程了? 2.为什么我的服务器总是自动重启? 3.为什么我的服务器总是自动重启? 以前写这种类型的列表,都是自己用键盘输入这些数字,其实不然,ul .ol li本身就自带 ...

  9. python join字符连接函数的使用方法

    就是把一个list中所有的串按照你定义的分隔符连接起来,比如: >>> import string >>> >>> >>> li ...

  10. SQLite入门与分析(八)---存储模型(1)

    写在前面:SQLite作为嵌入式数据库,通常针对的应用的数据量相对于通常DBMS的数据量是较小的.所以它的存储模型设计得非常简单,总的来说,SQLite把一个数据文件分成若干大小相等的页面,然后以B树 ...