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

Spark任务内存大于输入仍报SparkOutOfMemoryError问题求助

排查Spark "No space left on device" 错误的方向

首先要明确:你遇到的SparkOutOfMemoryError本质是磁盘空间不足,而非内存不够——错误信息里明确提到了No space left on device,说明Spark在尝试将内存数据spill到磁盘时,找不到可用空间了。结合你的集群配置和操作,给你几个具体的排查方向:

1. 检查Spark临时磁盘的配置与可用空间

Spark的shuffle、数据spill等操作会依赖本地磁盘存储临时文件,默认情况下使用系统的临时目录(比如/tmp),而r4.8xlarge的100GB SSD如果是实例的根磁盘,系统本身会占用一部分空间,再加上Spark的临时文件很容易被占满:

  • 登录到executor节点,用df -h命令查看/tmp或spark.local.dir指向目录的磁盘使用率;
  • 如果默认目录空间不足,建议修改spark.local.dir配置,指定到专门的磁盘路径(如果实例有额外挂载磁盘的话),或者清理该目录下的旧临时文件。

2. 评估重分区的分区数是否合理

你设置了15800个分区,这个数量过大,会直接导致shuffle阶段产生大量小临时文件,快速耗尽磁盘空间:

  • Spark的最优分区数通常是基于目标分区大小计算的,一般推荐128MB-256MB/分区。单个22GB的txt文件,按256MB/分区计算,一个文件只需要约88个分区(22*1024/256=88),100个文件总分区数应该在8800左右,15800远超合理范围;
  • 过多的分区不仅会占用大量磁盘空间,还会增加Executor的IO开销和任务调度成本,建议先下调分区数到合理范围测试。

3. 验证Executor内存配置的细节

虽然错误是磁盘问题,但内存配置不合理可能加剧spill频率,间接导致磁盘被占满:

  • 你计算的executor-memory=37g是基于总内存除以Executor数再预留7%,但要注意Spark Executor内存分为execution(执行计算)和storage(缓存数据)两部分,默认比例是50:50。如果你的操作有大量数据需要缓存,可能需要调整spark.memory.fraction或spark.memory.storageFraction参数,减少不必要的spill;
  • 另外,别忘了检查spark.yarn.executor.memoryOverhead配置,这个参数是给Executor的JVM堆外内存预留的,如果没设置,默认是Executor内存的10%,如果堆外内存不足,也可能触发异常,可以一并排查。

4. 检查输入文件的特性

txt文件的特性可能导致shuffle数据量远超预期:

  • 如果你的txt文件是未压缩的,且包含大量极短的行,会产生大量小记录,repartition时shuffle的数据量会被放大;
  • 排查是否存在异常大的单行记录(比如几GB大小的单条记录),这种情况会导致单个Task需要加载远超预期的数据,频繁触发spill,但结合你的错误信息,这点可能性稍低,可以通过采样文件内容验证。

5. 排查节点磁盘的其他占用情况

除了Spark的临时文件,节点上的其他进程也可能占用磁盘空间:

  • 登录节点执行du -sh /var/log查看系统日志是否过大,或者检查是否有其他服务(如YARN、HDFS)的临时文件未清理;
  • 确认100GB SSD的实际可用空间,有些云服务商的实例磁盘会预占一部分空间给系统镜像,实际可用空间可能不到100GB。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:08