风暴大 window 大小导致执行者被 Nimbus 杀死
Storm large window size causing executor to be killed by Nimbus
我有一个 java spring 应用程序,它基于创建拓扑结构的 DTO 将拓扑提交给风暴 (1.1.2) nimbus。
除非常大的 windows 外,这工作得很好。我正在用几种不同的滑动和翻滚来测试它 windows。 None 除了每 15 分钟前进一次的 24 小时滑动 window 之外,还给我任何问题。该拓扑将从 Kafka 接收到 ~250 messages/s 并简单地 windows 它们使用具有 3 秒延迟的简单时间戳提取器(很像我正在测试的所有其他拓扑)。
我已经对 worker 和内存津贴进行了大量研究以尝试解决这个问题,但我的默认配置是 1 个 worker 和 2048mb 堆大小。我也尝试减少影响最小的延迟。
我认为 window 大小可能变得太大,工作人员 运行 内存不足,这会延迟心跳或 zookeeper 连接签入,从而导致 Nimbus 终止工人。
Nimbus 日志报告该拓扑的执行器是 "not alive" 并且该拓扑的工作日志显示 KeeperException
其中拓扑无法与 Zookeeper 或 java.lang.ExceptionInInitializerError:null
与 nest PrivelegedActionException
.
通信
当拓扑被分配一个新的工作者时,我正在做的聚合丢失了。我假设发生这种情况是因为 window 持有至少 250*60*15*11 (messagesPerSecond*secondsPerMinute*15mins*windowAdvancesBeforeCrash) 消息,每个消息大约 84 字节。要完成整个 window,最终将包含 250*60*15*97 条消息(messagesPerSecond*secondsPerMinute*15mins*15minIncrementsIn24HoursPlusAnExpiredWindow)。这是 ~1.8gbs 如果我的数学是正确的,所以我觉得工作人员的内存应该覆盖 window 或至少超过 11 window 预付款。
我可以稍微增加内存,但不会太多。我也可以减少 memory/worker 的数量并增加 workers/topology 的数量,但我想知道我是否遗漏了什么?我是否可以增加工作人员的心跳时间,以便执行者有更多时间在被杀之前办理登机手续,或者由于某种原因这会很糟糕吗?如果我更改了心跳,如果将在拓扑的配置图中。谢谢!
这是由于工作人员运行内存不足造成的。从查看风暴代码。看起来 Storm 将 window 中的每条消息都保存为一个元组(这是一个相当大的对象)。消息发送率高且 24 小时 window,内存很大。
我通过使用一个初步的 bucketing 螺栓修复了这个问题,它会在最初的 1 分钟内对所有元组进行 bucket window 这显着减少了主 window 上的负载,因为它现在接收一个元组每分钟。分桶 window 不会 运行 内存不足,因为它在 window.
中一次只有一分钟的元组
我有一个 java spring 应用程序,它基于创建拓扑结构的 DTO 将拓扑提交给风暴 (1.1.2) nimbus。
除非常大的 windows 外,这工作得很好。我正在用几种不同的滑动和翻滚来测试它 windows。 None 除了每 15 分钟前进一次的 24 小时滑动 window 之外,还给我任何问题。该拓扑将从 Kafka 接收到 ~250 messages/s 并简单地 windows 它们使用具有 3 秒延迟的简单时间戳提取器(很像我正在测试的所有其他拓扑)。
我已经对 worker 和内存津贴进行了大量研究以尝试解决这个问题,但我的默认配置是 1 个 worker 和 2048mb 堆大小。我也尝试减少影响最小的延迟。
我认为 window 大小可能变得太大,工作人员 运行 内存不足,这会延迟心跳或 zookeeper 连接签入,从而导致 Nimbus 终止工人。
Nimbus 日志报告该拓扑的执行器是 "not alive" 并且该拓扑的工作日志显示 KeeperException
其中拓扑无法与 Zookeeper 或 java.lang.ExceptionInInitializerError:null
与 nest PrivelegedActionException
.
当拓扑被分配一个新的工作者时,我正在做的聚合丢失了。我假设发生这种情况是因为 window 持有至少 250*60*15*11 (messagesPerSecond*secondsPerMinute*15mins*windowAdvancesBeforeCrash) 消息,每个消息大约 84 字节。要完成整个 window,最终将包含 250*60*15*97 条消息(messagesPerSecond*secondsPerMinute*15mins*15minIncrementsIn24HoursPlusAnExpiredWindow)。这是 ~1.8gbs 如果我的数学是正确的,所以我觉得工作人员的内存应该覆盖 window 或至少超过 11 window 预付款。
我可以稍微增加内存,但不会太多。我也可以减少 memory/worker 的数量并增加 workers/topology 的数量,但我想知道我是否遗漏了什么?我是否可以增加工作人员的心跳时间,以便执行者有更多时间在被杀之前办理登机手续,或者由于某种原因这会很糟糕吗?如果我更改了心跳,如果将在拓扑的配置图中。谢谢!
这是由于工作人员运行内存不足造成的。从查看风暴代码。看起来 Storm 将 window 中的每条消息都保存为一个元组(这是一个相当大的对象)。消息发送率高且 24 小时 window,内存很大。
我通过使用一个初步的 bucketing 螺栓修复了这个问题,它会在最初的 1 分钟内对所有元组进行 bucket window 这显着减少了主 window 上的负载,因为它现在接收一个元组每分钟。分桶 window 不会 运行 内存不足,因为它在 window.
中一次只有一分钟的元组