Spark Standalone临时目录已满:Jupyter PySpark内核环境清理方案咨询
解决PySpark + Jupyter Notebook下/tmp目录占满的问题
我之前也碰到过类似的PySpark+Jupyter场景下/tmp磁盘被撑爆的情况,结合实际运维经验给你几个可行的方案,分两种思路来聊:
一、让Spark在关闭Jupyter内核时自动清理临时文件
要实现内核关闭时自动清文件,有几个实用的办法:
- 换个更大的磁盘存Spark临时文件(最推荐):如果你的节点有其他大容量磁盘,直接修改
spark.local.dir参数,把Spark的临时文件路径转移过去。
你可以在Notebook里初始化SparkSession时直接设置:
也可以在集群的from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.local.dir", "/path/to/your/large-disk/tmp") \ .getOrCreate()spark-defaults.conf里全局配置,这样所有PySpark应用都会自动用这个路径:spark.local.dir /path/to/your/large-disk/tmp - 利用Jupyter内核钩子做清理:Jupyter支持在内核启动/关闭时执行自定义脚本。你可以找到PySpark内核的
kernel.json文件(通常在~/.local/share/jupyter/kernels/pyspark/或者集群的Jupyter安装目录下),在配置里添加一个关闭时触发的脚本,专门删除当前Spark应用生成的临时文件(Spark的临时文件夹一般以spark-开头)。 - 开启Spark Driver端的自动清理:除了Worker端的清理,还可以设置
spark.cleaner.referenceTracking.cleanCheckpoints=true和spark.cleaner.ttl(这个参数控制Driver端不再使用的RDD、广播变量等对象的存活时间),让Driver主动清理不再需要的临时数据。
二、关于调整spark.worker.cleanup.appDataTtl的建议
如果暂时没法换磁盘,调短ttl到30分钟是可行的,但要注意几个细节:
- 匹配你的任务时长:如果你的Jupyter里有运行超过30分钟的长任务,Worker清理时可能会误删正在使用的临时文件,导致任务失败。所以如果你的任务大多是30分钟内能完成的短任务,这个设置没问题;如果有长任务,就得把ttl设得比最长任务时间再长一点(比如最长任务25分钟,设成40分钟)。
- 调整清理线程的执行频率:默认Spark Worker的清理线程是每小时跑一次(通过
spark.worker.cleanup.interval控制,单位是秒),如果ttl设成30分钟,建议把清理间隔也改成30分钟(即1800秒),这样每30分钟就会扫描一次,删除超过30分钟的应用数据,能更及时控制/tmp的占用。 - 单独配置日志的存活时间:如果日志文件占了很大空间,可以单独设置
spark.worker.cleanup.logTtl,把日志的ttl设得更短(比如15分钟),不用影响任务数据的保留时间。
总结下来的最优实践
- 优先换
spark.local.dir到更大的磁盘,这是从根源解决容量问题的办法,比频繁清理更稳妥。 - 如果必须用现有的/tmp目录,建议结合:
- 把
spark.worker.cleanup.appDataTtl设为你最长任务的时长+缓冲时间 - 把
spark.worker.cleanup.interval设为和ttl一致或者更短 - 配置Jupyter内核的关闭钩子,确保关闭内核时立即清理当前应用的临时文件
- 把
- 作为补充,你可以加个定时任务,比如每天凌晨执行
find /tmp -name "spark-*" -mtime +1 -delete,删除超过1天的Spark临时文件,防止漏清理。
内容的提问来源于stack exchange,提问作者Antonio Lisi
相关产品推荐
相关产品推荐

