worker中的每个计时器都对应一个java线程,使用计数器进行心跳保持以及获取元数据更新信息。
创建woker
mk-worker函数用于创建worker进程,主要工作包括:
- 启动相应计时器
- 创建worker中对应的executor
- 启动接收消息线程
worker心跳信息
do-heartbeat函数用户产生worker的心跳信息,这些信息被写入本地文件系统中。
supervisor会读取这些心跳信息以判断worker的状态,然后决定是否重启worker。
心跳信息包括如下信息:
current-time-secs:当前时间
storm-id:topologyId
executors:worker中包含的executer列表
port:worker对应的端口号
worker获取executor
read-worker-executor函数用来计算分配到该worker的executor,它通过调用storm-cluster-state的assignment-info函数获取所有topology的分配信息,然后利用worker的assignment-id以及port进行过滤,获得摸个worker所有的executor,assignment-id对应于node。
下载topology配置以及代码
在执行一个topology任务是,supervisor将从nimbus下载三个文件:
-
stormconf.ser topology配置项的序列化文件,执行任务前需要反序列化。
-
stormcode.ser topology的定义文件。
-
stormjar.jar 用户的资源文件以及源码等。
executor心跳信息
do-executor-heartbeats函数用来发送Executor的心跳信道到zookeeper中,该心跳信息保存了Executor中Task的运行统计,Nimbus利用这些心跳信息判断Executor是否处于活跃状态,并且在storm ui上显示这些运行信息。
topology状态信息
worker需要获知其执行的topology的状态,如果状态为deactive,spout应停止向外发送消息。
refresh-storm-active函数用于获取topology的状态信息。
worker数据接收
mk-receive-queue-map函数用于为worker中的每一个executor创建接收队列,并将其存储hash表,key为 executorId,值为Disruptor Queue对象。
executorId实际是一个一元数组[startTaskId,endTaskId],表示要执行任务的区间。
worker数据发送
mk-transfer-fn函数主要用于executor数据发送。
- 消息的目标taskId与发送taskId属于同一个worker,直接发送至接收端executor的接收队列,避免网络开销。
- 消息的目标taskId与发送taskId不属于同一个worker,将消息通过netty发送出去。
关闭worker
- 关闭消息接收线程
- 关闭worker中所有executor线程
- 关闭消息发送队列和线程
- 关闭所有计时器线程
- 从zookeeper中清楚该worker的心跳信息
- 断开zookeeper的链接
worker中线程以及通信关系图
相关推荐
本文档是关于Storm源码的详细走读笔记,主要分析了Storm的启动场景、Topology提交过程、worker进程中的线程使用情况、消息传递机制以及 TridentTopology的创建和ack机制等多个方面。 首先,文档提到了Storm集群中的...
五、Worker 进程中的线程种类及用途 Worker 进程中有多种线程,包括: * 接收和发送线程:负责接收和发送消息。 * zk client 线程:负责向 Zookeeper 发送心跳消息。 * 定时器线程:负责定期执行一些任务,例如...
- **Executor**:Executor是在Worker内部执行Spout或Bolt的线程,每个Executor可以运行多个任务实例。 - **Task**:Task是最小的计算单元,一个Spout或Bolt可以被分解为多个Task实例,并行运行在不同的Executor中。 ...
4. **Executor**:Executor 是由 Worker 启动的一个 Java 线程,负责执行 Bolt 或 Spout 中的 Task。 5. **Task**:最小的工作单元,通常每个 Executor 包含一个或多个 Task。Task 实际上执行了用户自定义的逻辑。 ...
- **Non Grouping**:默认分组,与 Shuffle Grouping 效果相似,但可能在同一线程中执行。 - **Direct Grouping**:直接分组,允许上游组件指定下游 Task 来处理 Tuple。 Storm 提供了丰富的 API 和组件,使其...
任务(Task)通常在Executor线程中执行,并且一个Worker可以运行多个Task。 Storm集群中的状态可以保存在Zookeeper或者本地磁盘上。Nimbus和Supervisor节点都是无状态(state-less)的,并且设计为快速失败(fail-...
Workers运行具体的Spout和Bolt任务,每个worker可以包含多个task,这些task在executor线程中运行。Spout作为数据源,从外部数据源拉取数据并转化为内部的Tuple;Bolt接收Tuple进行处理,并决定数据是否继续传递到下...
- **Worker**:实际执行拓扑任务的进程,包含多个线程,每个线程运行一个Bolt或Spout实例。 - **Spout**:负责读取数据源并生成数据流。 - **Bolt**:处理数据流,进行计算、过滤、聚合等操作。 - **Zookeeper**:...
3. **Storm集群部署**:实例在集群中运行,说明会涉及Zookeeper协调、Nimbus节点分配任务、Supervisor管理worker进程等集群管理内容。 4. **Java编程**:作为主要开发语言,Java提供了丰富的类库和工具,使得开发、...
Executor是Storm中执行Bolt和Spout的线程,worker是JVM进程,负责运行一个或多个executor。Task是Storm中的最小执行单元,每个Task执行一个特定的Bolt或Spout的实例。优化Storm性能时,需要关注如何合理配置executor...
在本节中,我们将深入探讨Storm的核心概念和特性,包括它的记录级容错原理、配置详解、批处理、TOPN操作、流程聚合、DRPC(Direct RPC)以及executor、worker、task之间的关系和调优。 **Storm记录级容错原理** ...
4. **Task**:Worker进程中的一个线程,执行具体的Spout或Bolt任务。 5. **Slots**:表示系统总的进程数量,每个Slot可以运行一个Worker进程。 6. **Nimbus与Supervisors**:通过Zookeeper集群进行交互和协调。...
6. **配置优化**:在搭建环境中,可能需要对Storm的配置参数进行调整,如worker数量、executor线程数、心跳间隔等,以适应不同的性能需求。 7. **监控和调试**:Storm提供了一套监控工具,包括Web UI,可以查看拓扑...
Executors是Worker进程中spawn的线程,执行Component的逻辑。Worker Process是Storm.spawn的进程,可以运行一个或多个Executors。 Storm的调度机制包括默认的轮询调度策略和多租户调度策略。默认调度策略使用naïve...
- Supervisor负责在工作节点上启动和管理Worker进程,每个Worker进程中包含多个线程,线程则运行任务(Task),任务是实际处理数据的实体。 - Nimbus是主控节点,负责分配和调度Topologies到各个Supervisor上,...
- **Executor、Worker 和 Task**:Executor 是在 Worker 进程中执行的线程,负责处理 Tuple。Worker 是 JVM 实例,可以包含多个 Executor。Task 是执行特定计算逻辑的基本单元,分配给 Executor 执行。 了解这些...
根据实际需求,还可以调整其他参数,如worker内存、线程数等。 4. **启动Zookeeper**:在所有服务器上启动Zookeeper服务,确保其正常运行。 5. **启动Storm**:在Nimbus节点上启动`bin/storm nimbus`,在其他...
Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的...