Spark单节点独立集群WordCount报磁盘空间不足问题咨询
咱们先揪出核心矛盾:你明明有1TB的挂载磁盘可用,但任务还是报磁盘写失败,大概率是Spark运行时产生的临时数据没写到你挂载的大磁盘上,默认跑到了空间不足的系统盘。结合你的场景(单节点Client模式、50GB大文件),给你一步步排查和解决的方案:
1. 先确认Spark临时文件的存储路径
Spark处理大文件时会生成大量临时数据(比如shuffle中间结果、RDD缓存数据),在Client模式下,Driver和Executor都运行在本地节点,它们的临时目录优先级是:
- 优先使用
spark.local.dir配置的路径 - 如果未配置,会默认使用系统临时目录(比如Linux的
/tmp、Windows的%TEMP%)
你可以先检查系统盘的/tmp空间是不是满了——50GB文件处理时,shuffle数据量可能比原文件还大,要是系统盘本身容量小,肯定会触发磁盘不足的报错。
2. 把Spark临时目录指向挂载的大磁盘(核心解决步骤)
这是最直接的修复方案,有两种实现方式:
方式一:提交任务时临时指定参数
在spark-submit命令中添加--conf参数,将临时目录设置到你的1TB挂载盘(假设挂载路径是/mnt/bigdisk):
spark-submit \ --master local[*] \ --conf spark.local.dir=/mnt/bigdisk/spark-tmp \ --class com.yourpackage.WordCount \ your-wordcount.jar \ 输入文件路径 输出结果路径
注意先手动创建/mnt/bigdisk/spark-tmp目录,确保Spark进程有读写权限。
方式二:修改Spark默认配置文件(长期生效)
如果之后经常跑大文件任务,直接修改Spark安装目录下conf文件夹里的spark-defaults.conf,添加一行:
spark.local.dir /mnt/bigdisk/spark-tmp
改完后无需重启单节点服务,下次提交任务会自动读取新配置。
3. 针对大文件WordCount的额外优化建议
你的节点有30GB+内存,完全可以利用起来减少磁盘压力:
- 调整任务并行度:默认并行度可能偏低,导致每个task处理的数据量过大,shuffle数据激增。可以设置和CPU核心数匹配的并行度(比如CPU是8核,设为16):
--conf spark.default.parallelism=16 - 内存缓存中间结果:在代码里给核心RDD添加缓存逻辑,减少重复计算和磁盘IO:
// 示例:将词频统计前的RDD缓存到内存 JavaRDD<String> lines = sc.textFile("输入路径"); lines.cache(); - 确认输出路径位置:确保任务的输出结果路径也在挂载的大磁盘上,别不小心写到系统盘占用空间。
核对报错逻辑
你给出的报错堆栈java.io.FileOutputStream.writeBytes失败,完全符合临时目录所在磁盘空间不足的场景——Spark在写入中间临时文件时没有可用空间了,把临时目录移到大磁盘就能解决核心问题。
内容的提问来源于stack exchange,提问作者Hromit Prodigy

