【已解决】 IDEA运行spark程序报错:GC overhead limit exceeded?

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运行或编译内存

  1. file -> settings
  2. 搜索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. 心得

写代码的时候,还是要多注意代码的优化!!!

原文地址:https://www.cnblogs.com/cjq10029/p/12688693.html