Apache storm 重新平衡后,风暴任务状态是否会转移到新的执行者?

Apache storm 重新平衡后,风暴任务状态是否会转移到新的执行者?,apache-storm,Apache Storm,这是我在阅读后提出的一个问题: 如果我需要在bolt的内部状态中保存一些信息,例如,在经典的单词计数用例中,将bolt中看到的每个单词的计数保存在hashmap中。执行“rebalance”命令后,可以将服务器的任务移动到另一个执行器,该执行器可能位于另一个JVM甚至另一台机器中。bolt的内部状态(本例中的单词计数hashmap)是否会传输到新环境(instance/JVM/machine) 当然,将单词计数hashmap放在Zookeeper这样的中心位置不会有这个问题。但出于性能考虑,有

这是我在阅读后提出的一个问题:

如果我需要在bolt的内部状态中保存一些信息,例如,在经典的单词计数用例中,将bolt中看到的每个单词的计数保存在hashmap中。执行“rebalance”命令后,可以将服务器的任务移动到另一个执行器,该执行器可能位于另一个JVM甚至另一台机器中。bolt的内部状态(本例中的单词计数hashmap)是否会传输到新环境(instance/JVM/machine)


当然,将单词计数hashmap放在Zookeeper这样的中心位置不会有这个问题。但出于性能考虑,有时我们似乎需要将内容保留在内存中。

一旦运行重新平衡,将发生以下情况

  • 它将首先停用当前拓扑
  • 然后,它将在集群内平均分配工人
  • 然后拓扑将返回到其先前的激活状态
  • 下面是Nathan Marz写的一篇文章,它应该可以帮助你消除疑虑

    再平衡相当于在另一台机器上杀死和从头开始创建的工人。如果您想保持“状态”,我建议您使用类似Trident的东西,并在DFS上保持状态同步


    在storm中,我们有以下映射

    风暴|真实世界
    +++++++++++++++++++++
    Worker| Java进程
    执行器线程
    任务|运行对象方法(执行等)

    由于storm中的进程(以及机器)之间没有共享内存,所以应用程序中的所有螺栓中都没有共享值,例如计数器。但您可以在一个工作进程的执行器(线程)中共享值。
    要处理所有执行器中的共享值,必须使用其他工具,如分布式缓存(Memcached、guava)或数据库。
    在暴风雨中,我认为它使用zookeeper在重新平衡后恢复状态