Apache zookeeper 风暴大窗口导致执行者被Nimbus杀死

Apache zookeeper 风暴大窗口导致执行者被Nimbus杀死,apache-zookeeper,apache-storm,apache-storm-topology,Apache Zookeeper,Apache Storm,Apache Storm Topology,我有一个JavaSpring应用程序,它根据创建拓扑结构的DTO向storm(1.1.2)nimbus提交拓扑 这是伟大的工作,除了非常大的窗口。我正在用几个不同的滑动和翻滚窗口测试它。除了每15分钟前进一次的24小时滑动窗口外,没有人给我任何问题。该拓扑将从Kafka接收约250条消息/秒,并使用一个简单的时间戳提取器(与我正在测试的所有其他拓扑非常相似)将它们窗口化 为了解决这个问题,我使用了大量的工作线程和内存空间,但我的默认配置是1个工作线程,堆大小为2048mb。我也尝试过减少延迟,但

我有一个JavaSpring应用程序,它根据创建拓扑结构的DTO向storm(1.1.2)nimbus提交拓扑

这是伟大的工作,除了非常大的窗口。我正在用几个不同的滑动和翻滚窗口测试它。除了每15分钟前进一次的24小时滑动窗口外,没有人给我任何问题。该拓扑将从Kafka接收约250条消息/秒,并使用一个简单的时间戳提取器(与我正在测试的所有其他拓扑非常相似)将它们窗口化

为了解决这个问题,我使用了大量的工作线程和内存空间,但我的默认配置是1个工作线程,堆大小为2048mb。我也尝试过减少延迟,但效果很小

我认为可能是窗口太大,工作人员的内存不足,导致心跳或zookeeper连接检查延迟,进而导致Nimbus杀死工作人员

通常情况下(~11个窗口前进),Nimbus日志会报告该拓扑的执行器“不活动”该拓扑的工作日志显示拓扑无法与Zookeeper通信的
KeeperException
,或者显示嵌套
PrivilegedActionException
java.lang.ExceptionInInitializeError:null

当拓扑分配了一个新的辅助对象时,我正在进行的聚合将丢失。我假设发生这种情况是因为窗口至少包含250*60*15*11(messagesPerSecond*secondsPerMinute*15mins*WindowAdvancesBeforeClash)消息,每个消息大约有84字节。要完成整个窗口,它将以250*60*15*97条消息结束(消息秒*秒分钟*15分钟*15分钟递增24小时加上过期窗口)。如果我的数学是正确的,这是~1.8gbs,因此我觉得工作内存应该覆盖窗口或至少超过11个窗口


我可以稍微增加记忆,但不会太多。我还可以减少内存/工作者的数量,增加工作者/拓扑的数量,但我想知道我是否缺少什么?我是否可以增加工作人员心跳的时间量,以便执行者在被杀之前有更多的时间进行登记,或者这会因为某种原因而变得不好?如果我更改了heartbeat If,它将出现在拓扑的配置映射中。谢谢

这是由工作进程内存不足造成的。从风暴代码看。看起来Storm将窗口中的每条消息作为元组(这是一个相当大的对象)保存。由于信息的传输率很高,并且有24小时的窗口,这就需要大量的内存

我通过使用一个预扣螺栓将所有元组扣在最初的1分钟窗口中来解决这个问题,这大大减少了主窗口上的负载,因为它现在每分钟接收一个元组。bucketing窗口不会耗尽内存,因为它的窗口中一次只有一分钟的元组