当您添加更多节点时,Storm如何处理字段分组?

时间:2013-12-07 20:58:49

标签: real-time apache-storm

只是阅读有关风暴的更多详细信息,并且遇到了进行字段分组的能力,例如,如果您计算每个用户的推文,并且您有两个任务,其中字段分组为user-id,则相同的用户ID将被发送到同样的任务。

因此任务1可能在内存中有以下计数 鲍勃:10 爱丽丝:5

任务2可能在内存中有以下计数 吉尔:10 乔:4

如果我将新计算机添加到群集中以增加容量并运行重新平衡,那么我的内存计数会发生什么变化?你会开始让用户有不同的数量吗?

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)

根据一个或多个元组的字段,字段分组允许您控制发送到螺栓的元组。 它确保字段组合的给定值集始终发送到同一个螺栓。