最近在升級一個框架的時候,發現某個流式計算程序每隔一定的時間就會出現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.
可能還是這個自動機制在流式計算中有點趕不上,導致出現的錯誤。這個坑還是非常深。