spark-OutOfMemory:GC overhead limit exceeded 解决

本文分享了在运行Spark程序时遇到的OutOfMemoryError: GC Overhead Limit Exceeded错误及解决过程。通过调整executor core数量从4减至1,成功解决了问题。
部署运行你感兴趣的模型镜像

今天准备跑自己的spark程序,但是运行过程中遇到了OutOfMemory:GC overhead limit exceeded的错误。

原以为是数据集太大,google了一番,以为是内存不够了,但是在webui一看其实数据集好像也不是很大,但是还是尝试提高了内存配置,通过提高spark.executor.memoryspark.shuffle.memoryFraction,降低spark.storage.memoryFraction,来提高机器可用的堆空间。

再次运行发现,问题依旧。在苦恼中找到Spark User Mailing List的一个问答帖,有人和我遇到了同样的问题。在帖子里发现了一个新的解释:executor core数量太多,导致了多个core之间争夺gc时间以及资源(应该主要是内存资源),最后导致大部分的时间都花在了gc上。

根据他的建议,我把core数量从4调到了1(也是挺极端的,真是为了成功运行,我拼了),方法是:由于我是spark standalone集群模式,所以直接编辑conf/spark-env.sh中的SPARK_EXECUTOR_CORES

运行,成功了。

真是不可思议,本来并行是为了提高速度和效率,但是这里却反而导致了运行失败。具体原因其实还不清楚,关于jvm的gc我也不甚了解,甚至也是今天我才尝试设置spark的其他环境参数,还是要多加学习啊!

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在 IntelliJ IDEA 中提示 `BUILD FAILED` 和 `java.lang.OutOfMemoryError: GC overhead limit exceeded` 错误,可尝试以下解决办法: ### 修改 IDEA 内配置 - 在 `File -> Settings -> Build,Execution,Deployment -> Complier` 中,设置【Build process heap size(Mbytes)】为 2000。 - 在 `File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven -> Importing` 中,设置【VM options for importer】为 `-Xmx1024m` [^1]。 ### 修改 IDEA 安装目录下的配置文件 进入 IntelliJ IDEA 的安装目录,找到文件 【idea64.exe.vmoptions】(如果是 32 位机器,修改【idea.exe.vmoptions】文件),修改配置为: ```plaintext -Xms1024m -Xmx2048m -XX:ReservedCodeCacheSize=1024m ``` 这样可以增加 IDEA 启动时 JVM 的堆内存大小 [^1]。 ### 通用的内存优化方法 - **增加堆内存**:在运行项目时,通过修改 JVM 参数来增加堆内存的大小,例如在启动 Java 应用时添加 `-Xmx` 和 `-Xms` 参数,`-Xmx` 用于设置最大堆内存,`-Xms` 用于设置初始堆内存。示例命令如下: ```bash java -Xmx4096m -Xms2048m YourMainClass ``` - **调整 GC 策略**:不同的垃圾回收器适用于不同的场景,可以根据应用的特点选择合适的垃圾回收器。例如,对于服务器端应用,可以使用 G1 垃圾回收器,通过添加 `-XX:+UseG1GC` 参数来启用: ```bash java -XX:+UseG1GC YourMainClass ``` - **优化代码**:检查代码中是否存在内存泄漏的问题,确保对象在不再使用时及时释放引用。例如,避免在循环中创建大量的临时对象,尽量复用对象。 ```java // 不好的示例 for (int i = 0; i < 1000; i++) { String temp = new String("temp"); // 使用 temp } // 好的示例 String temp; for (int i = 0; i < 1000; i++) { temp = "temp"; // 使用 temp } ``` - **禁用 GC overhead limit**:虽然不推荐长期使用,但在某些情况下可以临时禁用 GC overhead limit 检查,通过添加 `-XX:-UseGCOverheadLimit` 参数来禁用: ```bash java -XX:-UseGCOverheadLimit YourMainClass ``` - **使用内存分析工具**:使用工具如 VisualVM、YourKit 等分析内存使用情况,找出内存占用过高的对象和代码段,进行针对性的优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值