1. 问题描述
在运行代码之后,出现以下错误:
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 107.0 failed 1 times, most recent failure: Lost task 0.0 in stage 107.0 (TID 208, localhost, executor driver): java.lang.OutOfMemoryError: GC overhead limit exceeded
经查询之后,是由于JVM花费太长时间执行GC且只能回收很少的堆内存时抛出的
一般可以通过更改JVM启动配置增加堆大小来解决
参考:https://blog.csdn.net/github_32521685/article/details/89953796
2. 解决过程
1. 增加idea运行或编译内存
- file -> settings
- 搜索maven,点击importing,修改JVM启动项
并没有解决问题
2. 增加spark的executor.memory和driver.memory
val sparkConf = new SparkConf()......set("spark.executor.memory","6G").set("spark.driver.memory","3G")
也没有起作用
3. 减小executor.cores
executor core数量太多,可能会导致了多个core之间争夺gc时间以及资源,但修改为为1仍然报错
4. 优化代码
没办法,其他方案都不行,只好试试减少计算
在需要用的RDD的原始数据集上加.cache(),进行缓存一下,它就不会重复计算,整个的计算的效率会高一些,不会出现内存溢出的问题
终于,运行成功了
3. 心得
写代码的时候,还是要多注意代码的优化!!!