EMR集群Spark训练树模型时提示磁盘空间不足求助
兄弟,我之前在EMR上跑树模型也碰到过一模一样的磁盘空间不足问题,太闹心了!结合你的集群配置(1主4工作,4核16G+4块80G盘),我给你梳理下可能的原因和解决办法,亲测有效:
先排查核心问题:磁盘到底有没有被用上?
先别着急调模型参数,先登录到工作节点,执行df -h命令看看磁盘挂载情况:
- 如果发现只有系统盘(比如
/dev/xvda1)被占用,其他3块80G盘显示/mnt/disk2、/mnt/disk3之类的但使用率很低,那问题就找到了——Spark/Yarn根本没用到这些额外磁盘!
针对性解决办法
1. 把多块磁盘都利用起来(最有效!)
EMR默认可能只把系统盘作为临时存储目录,你需要修改Spark和Yarn的配置,让它们把临时数据分散到所有4块磁盘上:
- 修改Spark配置:在Spark作业提交时添加参数,或者修改集群级别的Spark配置:
这个参数指定Spark的临时数据(shuffle、中间计算结果)会分散到多个磁盘,直接分摊磁盘压力。--conf spark.local.dir=/mnt/disk1,/mnt/disk2,/mnt/disk3,/mnt/disk4 - 修改Yarn配置:编辑Yarn的
yarn-site.xml,调整以下两个参数:
改完后重启Yarn NodeManager服务,让配置生效。<property> <name>yarn.nodemanager.local-dirs</name> <value>/mnt/disk1/yarn,/mnt/disk2/yarn,/mnt/disk3/yarn,/mnt/disk4/yarn</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/mnt/disk1/logs,/mnt/disk2/logs,/mnt/disk3/logs,/mnt/disk4/logs</value> </property>
2. 压缩Spark的临时数据,减少磁盘占用
树模型训练会产生大量shuffle数据,开启压缩能大幅减少磁盘使用:
在作业提交时添加这些参数:
--conf spark.shuffle.compress=true \ --conf spark.shuffle.spill.compress=true \ --conf spark.io.compression.codec=lz4
lz4是Spark默认的高效压缩算法,速度快、压缩比也不错,适合树模型的大量临时数据。
3. 调整Yarn的磁盘健康检查阈值
Yarn默认会在磁盘使用率超过90%时标记磁盘不健康,拒绝分配容器。如果你的磁盘空间确实紧张,可以适当调高这个阈值:
在yarn-site.xml里添加:
<property> <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name> <value>95</value> </property>
注意不要调到100%,留个5%的缓冲,避免磁盘完全占满导致系统崩溃。
4. 优化模型和数据,减少计算量
如果上述配置调整后还是有问题,就得从模型和数据入手:
- 降低模型复杂度:随机森林的
numTrees别设得太高(比如从100降到50),决策树的maxDepth调小(比如从15降到10),树模型的复杂度越高,中间计算产生的临时数据就越多。 - 排查数据倾斜:用Spark SQL查看是否有特征存在严重倾斜:
如果某个特征的某个取值占了80%以上的数据,就得做倾斜处理——比如给这个特征加盐拆分大分区,或者过滤掉极端值。from pyspark.sql.functions import desc df.groupBy("你的特征列").count().orderBy(desc("count")).show(10) - 数据采样:先用10%的样本跑模型,确认可行后再用全量数据,或者过滤掉冗余特征、重复数据。
5. 定期清理临时文件
Spark的临时目录会积累很多旧数据,你可以手动清理,或者配置自动清理:
--conf spark.cleaner.referenceTracking.cleanCheckpoints=true \ --conf spark.cleaner.ttl=3600
这个配置会让Spark自动清理3600秒(1小时)之前的临时数据,避免磁盘被旧数据占满。
内容的提问来源于stack exchange,提问作者jscu
相关产品推荐
相关产品推荐

