前言
Driver OutOfMemoryError或Driver Unresponsive是一個非常嚴重的問題挠轴,因為它會使我們的Spark應用程序崩潰。 但這類問題也經常發(fā)生婿失,因為Driver 收集了太多的數(shù)據回到驅動程序,使其內存不足猜欺。
主要癥狀
- Spark應用程序無應答或者崩潰
- Driver日志中出現(xiàn)OutOfMemoryErrors或者GC相關的錯誤.
- 互動性非常低或根本不存在晚伙。
- 驅動程序JVM的內存使用率很高
可能的解決方法
- 可能是代碼中使用了諸如collect之類的操作將過大的數(shù)據集收集到驅動程序節(jié)點吮龄。
- 可能使用了廣播連接,但廣播的數(shù)據太大咆疗。 可以使修改Spark的最大廣播連接配置來更好地控制broadcast數(shù)據的大小漓帚。
- 長時間運行的應用程序在驅動程序上生成了大量對象,無法釋放它們午磁。 Java的jmap工具可以通過打印堆的直方圖來查看哪些對象占據了驅動程序JVM的大部分內存尝抖。 但需要注意的時jmap會在運行時暫停該JVM。
- 增加Driver分配的內存大小
- 如果使用其他語言迅皇,例如Python昧辽,JVM可能會出現(xiàn)內存不足會問題,因為兩者之間的數(shù)據轉換需要消耗JVM中的內存登颓。 如果使用了其他語言搅荞,請不要將大量數(shù)據帶回驅動程序節(jié)點,可以將其寫入文件框咙,而不是將其作為內存中的對象收集起來咕痛。
- 如果您與其他用戶共享SparkContext(例如,SQL JDBC服務器和某些筆記本環(huán)境)喇嘱,請確保其他用戶不會嘗試做一些可能導致驅動程序中大量內存分配的事情, 比如將大量數(shù)據帶回驅動程序節(jié)點等茉贡。