You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化PySpark AWS Glue作业以避免OOM内存溢出报错

报错根因说明

Caused by: org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@5fa14240 : No space left on device

该报错不属于常规的堆内存溢出,触发原因是Spark执行排序、Shuffle类操作时,内存中放不下的中间数据需要溢写到Worker节点的本地磁盘,但节点本地磁盘可用空间已被占满,导致溢写失败作业终止。

PySpark(AWS Glue)优化方案

资源配置调整

  • 升级Worker规格:AWS Glue G.1X Worker默认仅配备64GB本地磁盘,G.2X Worker自带128GB本地磁盘,若当前使用G.1X规格,可直接升级为G.2X,单节点磁盘容量翻倍,无需修改作业逻辑即可快速解决问题。
  • 调整Worker数量:如果存在数据倾斜导致单Worker处理的数据量远高于平均水平,可适当增加Worker数量分散负载,避免单节点磁盘被超额溢写文件占满。

降低Shuffle溢写数据量

  • 治理数据倾斜:优先定位发生倾斜的大Key,通过大Key单独处理、加盐打散后再聚合的方式,避免单节点处理超量数据,大幅降低单节点磁盘占用。
  • 提前裁剪无效数据:在执行join、group by、orderBy等Shuffle类操作前,提前通过filter、drop操作删除不需要的字段和无效数据行,减少参与Shuffle的总数据量,从根源降低溢写磁盘占用。
  • 调整Shuffle分区数:Spark默认spark.sql.shuffle.partitions参数值为200,可根据作业处理的总数据量调整为总数据量/128MB的量级,分区过小会导致单分区数据量过大,溢写时占用更多磁盘空间。
  • 开启Shuffle压缩:在作业初始化后添加以下配置,开启数据压缩降低溢写文件体积:
# 开启Shuffle数据压缩
spark.conf.set("spark.sql.shuffle.compress", "true")
spark.conf.set("spark.rdd.compress", "true")
# 选用snappy压缩,兼顾压缩比和读写速度
spark.conf.set("spark.io.compression.codec", "snappy")

溢写逻辑优化

  • 调整溢写批量阈值:适当调高spark.shuffle.spill.batchSize参数值,减少小批量溢写的次数,避免生成过多小文件占用额外磁盘空间。
  • 开启S3溢写(Glue 3.0+支持):如果作业数据量极大,可配置将Shuffle临时文件写入S3而非本地磁盘,彻底规避本地磁盘不足问题,配置代码如下:
spark.conf.set("spark.shuffle.glue.s3Spill.enabled", "true")

注意该配置会产生额外的S3读写请求费用,仅推荐超大数据量作业使用。


内容的提问来源于stack exchange,提问作者shubhamkakran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:51:02