最近在升级一个框架的时候,发现某个流式计算程序每隔一定的时间就会出现GC overhead limit exceeded的错误问题。
这个问题肯定是内存不够,但是初始设置的内存是够的啊,于是进行各种内存优化,如将变量定义在循环体外等控制,但是发现只是将这个间隔时间往后推了一下而已。
还是没有找到症结所在。
后来再分析了下,可能是哪些变量占了内存没有及时释放掉,
看到了好几个dataframe的cache代码,但这个cache应该 spark有个自动释放清理的机制的。
为了进行测试,手动添加unpersist进行内存释放,再上线,发现问题果然消失了。
原来这个问题真的是内存的问题。
再仔细看了下官方说明。
Spark automatically monitors cache usage on each node and drops out old data partitions in a least-recently-used (LRU) fashion. If you would like to manually remove an RDD instead of waiting for it to fall out of the cache, use the RDD.unpersist() method.
可能还是这个自动机制在流式计算中有点赶不上,导致出现的错误。这个坑还是非常深。