关于Spark中的常见问题及解决方法(5) ——Driver OutOfMemoryError或Driver Unresponsive
前言
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服务器和某些笔记本环境),请确保其他用户不会尝试做一些可能导致驱动程序中大量内存分配的事情, 比如将大量数据带回驱动程序节点等。