我们使用spark结构化流媒体并使用mapGroupWithState在一段时间内聚合数据。当超时发生时,我们使用
删除状态state.remove()。
我们正在使用神经节来监控群集健康状况。 堆内存在此期间不断增加。 我怀疑即使在状态删除后,旧的状态对象仍然在内存中并且从未清理过。 调用state.remove()时对象会发生什么? 提示很受欢迎。
答案 0 :(得分:0)
我认为这应该是评论,但我刚刚创建了我的Stack Overflow帐户。
几周前,我在Spark Streaming上遇到了同样的问题。我的状态很大,我需要放弃旧状态。我使用了 mapGroupWithState ,它可以正常工作。刚开始我不了解 state.remove()的工作原理,但是经过几次执行我就明白了。
首先,什么时候调用remove方法?我使用了几分钟的超时时间。在时间到期后停止向该密钥发送消息时,我得到了如何超时和删除工作的信息。事件迭代器为null,state.hasTimedOut为true。
所以我决定将函数划分为if。
if (state.hasTimedOut) {
state.remove()
// Here I returned my object totally null
} else {
// deal with new event
// update state
// set time out
}
也许您正在删除状态而不是跳过执行?当时间到期且该键没有事件时,超时将为 true 。