Storm系列(十四)架构分析之Executor-输入和输出处理
来源:互联网 发布:lol末日人工智能奖励 编辑:程序博客网 时间:2024/05/29 04:39
mk-executor-data函数用于定义Executor中含有的数据。
Executor的输入处理
根据executor-id从Worker的:executor-receive-queue-map中获得Disruptor Queue 如下:
说明:
Worker的接收线程从ZMQ收到数据后,线程会根据目标的Task Id找到对应的Executor,并将数据发送到该Executor所对应的接收DisruptorQueue中,对于DisruptorQueue中的消息Bolt会调用executor方法处理,而Spout类型的Executor则调用Ack或Fail处理。
mk-task-receive函数定义了一个函数来处理DisruptorQueue中的消息,通过调用disruptor/clojure-handler函数获取消息处理函数,该消息处理函数会在收到新消息时被调用。
函数原型:
方法说明:
- tuple-action-fn为Executor的消息处理函数(Spout与Bolt各不同)。
- 若存在消息来源task-id,则调用一次tuple-action-fn函数,若不存在消息来源taks-id,则在该Executor上的所有Task上调用tuple-action-fn函数。
- 在创建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*函数来启动用于发送数据的队列线程。
函数原型:
方法说明:
- 获取worker中的消息发送函数mk-transfer-fn赋值给变量worker-transfer-fn。
- 启动Disruptor Queue的消费者线程(disruptor/consume-loop*),batch-transfer-queue为Executor定义的Disruptor Queue对象,disruptor/handler构建EventHandler对象。
- Executor的report-error-and-die函数,对错误进行记录并退出进程。
- 在创建Executor的过程中,会启动system-threads(mk-executor函数):system-threads[(start-batch-transfer->worker-handler! worker executor-data)].
- 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-输入和输出处理
- Storm系列(十五)架构分析之Executor-Spout
- Storm系列(十六)架构分析之Executor-Bolt
- Storm系列(五)架构分析之Nimbus启动过程
- Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]
- Storm系列(七)架构分析之Scheduler-调度器[DefaultScheduler]
- Storm系列(十二)架构分析之Worker-心跳信息处理
- Storm系列(十三)架构分析之Worker-维护ZMQ连接
- Storm系列(九)架构分析之Supervisor-同步Nimbus的事件线程
- Storm系列(十一)架构分析之Supervisor-管理Worker进程的事件线程
- 【Twitter Storm系列之三】 storm简单实例分析
- python处理输入和输出
- storm源码之理解Storm中Worker、Executor、Task关系
- storm源码之理解Storm中Worker、Executor、Task关系
- Storm架构分析
- Storm架构分析
- Storm架构分析
- twitter storm 源码走读之5 -- worker进程内部消息传递处理和数据结构分析
- Storm系列(十三)架构分析之Worker-维护ZMQ连接
- javascript内置对象数组Array和字符串string的一些方法
- Ganglia系列(一)安装
- 软件测试--APP测试注意
- DBSCAN
- Storm系列(十四)架构分析之Executor-输入和输出处理
- Ammeter 仪表板控件
- 球面数据拟合算法简介
- 网易DDB性能优化实践
- 根据两个已有表建立新表
- Storm系列(十五)架构分析之Executor-Spout
- Storm系列(十六)架构分析之Executor-Bolt
- Docker系列(一)安装
- Esper系列(三)Context和Group by