Spark运行在Standalone模式下产生的临时目录的问题
1.问题描述
收到运维线上告警。
告警信息:文件系统剩余空间小于5% on volume /
目前状态: PROBLEM
告警等级:High
2.异常分析
df -h
查看文件系统各分区使用情况
切换至root用户
find / -type f -size +1000M -print0 | xargs -0 du -h
查看大文件所在位置
du -h -x --max-depth=1
该命令用于查看该目录下一层深度的文件系统的大小情况,不推荐,效率较低。
发现大量1G以上的文件均在/spark/tmp/* /spark/spark-events/*下
查看spark-defaults.conf
spark.local.dir file:///home/hdp/spark/tmp
spark.history.fs.logDirectory file:///home/hdp/spark/spark-events
3.解决
1 方案1(不建议使用)
可以通过crontab 定时执行rm -rf /tmp/spark命令,缺点:当spark的任务执行,这个时候会生成/tmp/spark 的临时文件,正好在这个时候
crontab 启动rm命令,从而导致文件找不到以至于spark任务执行失败
2 方案2(推荐在spark-env.sh 中配置参数,不在spark-defaults.conf 中配置)
spark环境配置spark.local.dir,其中 SPARK_LOCAL_DIRS : storage directories to use on this node for shuffle and RDD data
修改 conf 目录下的spark-defaults.conf 或者 conf 目录下的spark-env.conf,下面我们来一一验证哪个更好。
(1)修改spark执行时临时目录的配置,增加如下一行
spark.local.dir /diskb/sparktmp,/diskc/sparktmp,/diskd/sparktmp,/diske/sparktmp,/diskf/sparktmp,/diskg/sparktmp
说明:可配置多个目录,以 "," 分隔。
(2)修改配置spark-env.sh下增加
export SPARK_LOCAL_DIRS=spark.local.dir /diskb/sparktmp,/diskc/sparktmp,/diskd/sparktmp,/diske/sparktmp,/diskf/sparktmp,/diskg/sparktmp
如果spark-env.sh与spark-defaults.conf都配置,则SPARK_LOCAL_DIRS覆盖spark.local.dir 的配置
生产环境我们按照这样的思路去处理
生产环境修改为:在spark-defaults.conf 下增加一行
spark.local.dir /home/hadoop/data/sparktmp