只是阅读有关风暴的更多详细信息,并且遇到了进行字段分组的能力,例如,如果您计算每个用户的推文,并且您有两个任务,其中字段分组为user-id,则相同的用户ID将被发送到同样的任务。
因此任务1可能在内存中有以下计数 鲍勃:10 爱丽丝:5
任务2可能在内存中有以下计数 吉尔:10 乔:4
如果我将新计算机添加到群集中以增加容量并运行重新平衡,那么我的内存计数会发生什么变化?你会开始让用户有不同的数量吗?
答案 0 :(得分:5)
使用字段分组,我们可以指导特定字段转到特定任务。
字段分组:该流按分组中指定的字段进行分区。例如,如果流按“user-id”字段分组,则具有相同“user-id”的元组将始终执行相同的任务,但具有不同“user-id”的元组可能会执行不同的任务的
这些任务在风暴的生命周期中始终是静态的,使用rebalance
可以改变的是执行者(线程)的数量。在向集群添加新节点的情况下,您可以重新配置要运行的执行程序数,而无需关闭拓扑但无论任务数量保持不变。只是添加一个新节点可以通过调整风暴的并行性来提高性能。
答案 1 :(得分:2)
为了在每次风暴将使用任务数量(hashcode(values)%#tasks)修改值的哈希码时,将消息发送到同一任务。如果你要增加你的任务,你的计数就不准确,因为他们在重新平衡后可能不会去同一个任务/工人。
https://groups.google.com/forum/#!msg/storm-user/lCKnl8AmSVE/rVCH3uuUAcMJ
答案 2 :(得分:0)
要完全理解它,您必须看到代码:
字段分组取决于字段字符串,而不依赖于发出它的喷口。所以重新平衡不会影响它。这是函数:https://github.com/apache/storm/blob/3b1ab3d8a7da7ed35adc448d24f1f1ccb6c5ff27/storm-core/src/jvm/org/apache/storm/daemon/GrouperFactory.java#L157-L161
@Override
public List<Integer> chooseTasks(int taskId, List<Object> values) {
int targetTaskIndex = Math.abs(TupleUtils.listHashCode(outFields.select(groupFields, values))) % numTasks;
return Collections.singletonList(targetTasks.get(targetTaskIndex));
}
TupleUtils.listHashCode导致
public static <T> int listHashCode(List<T> alist) {
if (alist == null) {
return 1;
} else {
return Arrays.deepHashCode(alist.toArray());
}
}
答案 3 :(得分:0)
根据一个或多个元组的字段,字段分组允许您控制发送到螺栓的元组。 它确保字段组合的给定值集始终发送到同一个螺栓。