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