在阅读更多关于storm的细节时,我们发现了它的字段分组功能,例如,如果你对每个用户的tweet进行计数,并且有两个任务的字段分组为用户id,那么相同的用户id将被发送到相同的任务。
因此,任务1的内存中可以有以下计数bob:10 alice:5
任务2的内存中可能有以下计数jill:10 joe: 4
如果我向集群添加了一台新机器以增加容量并重新平衡运行,那么内存中的计数会发生什么变化?你会开始得到不同数量的用户吗?
在阅读更多关于storm的细节时,我们发现了它的字段分组功能,例如,如果你对每个用户的tweet进行计数,并且有两个任务的字段分组为用户id,那么相同的用户id将被发送到相同的任务。
因此,任务1的内存中可以有以下计数bob:10 alice:5
任务2的内存中可能有以下计数jill:10 joe: 4
如果我向集群添加了一台新机器以增加容量并重新平衡运行,那么内存中的计数会发生什么变化?你会开始得到不同数量的用户吗?
4条答案
按热度按时间sauutmhj1#
使用字段分组,我们可以引导特定字段转到特定任务。
字段分组:流按分组中指定的字段进行分区。例如,如果流按“user id”字段分组,则具有相同“user id”的元组将始终转到同一个任务,但是具有不同“user id”的元组可能转到不同的任务。
这些任务在风暴的生命周期中总是静态的,您可以使用
rebalance
是执行器(线程)的数目。在向集群添加新节点的情况下,允许您重新配置要运行的执行器的数量,而无需关闭拓扑,但无论任务的数量如何,都保持不变。只是添加一个新节点可以通过调整storm的并行性来提高性能。bpzcxfmw2#
要完全理解它,您必须查看代码:
字段分组取决于字段字符串,而不是由哪个喷口发出。所以重新平衡不会影响它。这是函数:https://github.com/apache/storm/blob/3b1ab3d8a7da7ed35adc448d24f1f1ccb6c5ff27/storm-core/src/jvm/org/apache/storm/daemon/grouperfactory.java#l157-l161型
tupleutils.listhashcode导致
ne5o7dgx3#
基于一个或多个元组的字段,字段分组允许您控制发送到螺栓的元组。它确保字段组合的给定值集始终发送到同一个螺栓。
kxxlusnw4#
为了在每次向同一个任务发送消息,storm将用任务数(hashcode(values)%#tasks)修改值的hashcode。如果您要增加您的任务,您的计数将不准确,因为在重新平衡后,它们可能不会转到同一个任务/工作者。