在JStorm中似乎没有执行者的概念,而且setTasksNumber()方法似乎毫无用处,因为任务的数量与parallelism_hint有关。
我的问题是: JStorm中的任务是静态的吗?如果没有,任务死后会重新启动吗?如果任务不是静态的,fields-grouping是如何工作的?
发布于 2015-12-18 06:48:56
在JStorm中,工作人员的行为就像暴风雨中的执行者。一个工作人员可以有多个任务,但是与Storm不同的是,工作人员中的任务可能属于不同的组件,下面是一个示例:
一个拓扑包含一个喷口(S),两个螺栓(B1,B2),每个组件的任务号是在调用TopologyBuilder.buildTopology方法时设置的,特别是在TopologyBuilder.setBolt方法中。
假设你把你的S的并行度设为2,B1的并行度设为3,B2的并行度为4。我们总共有2+3+4 =9个任务。
然后,可以通过调用Config.setNumWorkers()方法将总员工num设置为3。
在调度工作人员和任务之后,我们有任务id和组件,如:B1: taskId: 1,2,3 S: taskId: 4,5 B2: taskId: 6,7,8,9
注意,任务id在同一个组件中是连续的,但它不一定从喷口开始到螺栓。
然后我们有以下的计划工作人员和任务:Worker1: 1 4 6 Worker2: 2 5 7 Worker3: 3 8 9,如我们所见,每个员工有3个任务,任务可能是不同的组件。
注意,JStorm的调度算法有点类似于Storm的默认调度算法(但功能更强大),请参考下面的比较:https://issues.apache.org/jira/browse/STORM-1320
在拓扑运行期间,如果不执行重平衡操作,则计划的结果始终是相同的,也就是说,无论分配哪个主机+端口( worker ),该工作人员中的任务总是相同的。即使通过重新启动拓扑,如果不更改组件的并行性,计划的结果也将是相同的。但是,如果执行再平衡操作,任务可能会发生变化。
当工作人员中的某个任务死亡时(通过抛出未检查/未处理的异常),整个工作人员将被杀死,错误将报告给ZK。立即重新安排工作时间,请注意reschedule在这里可能不合适,nimbus知道该工作人员已经死亡,它将尝试在其他地方重新启动该工人,但该工作人员中的任务完全相同。
有关更多JStorm文档,请参见:https://github.com/alibaba/jstorm
https://stackoverflow.com/questions/34318571
复制相似问题