Spark Scala任务成功后未删除_temporary目录的排查与解决
排查Spark写入Hive表后_temporary目录未删除的问题
排查方向
- 检查权限配置:确认执行Spark Driver的用户对Hive表存储路径具备完整的读写执行权限。因为_temporary目录由Executor写入后,需由Driver负责重命名并删除,若Driver用户无对应路径权限,会导致删除失败。可通过
hdfs dfs -ls <表路径>查看目录权限,对比Driver运行用户的权限。 - 查看HDFS namenode审计日志:namenode日志会记录所有文件系统操作,可查找针对_temporary目录的删除操作记录,排查是否存在权限拒绝、路径异常等错误信息。
- 确认Spark写入模式与表类型:
- 若使用
append模式写入,需检查是否存在分区冲突或重复写入的隐性异常(即使任务日志无报错); - 外部表需确认存储路径是否为自定义非默认路径,部分场景下自定义路径的权限或目录结构可能干扰临时目录清理。
- 若使用
- 检查Spark作业部署模式:若采用
cluster模式提交作业,需确认Driver容器是否在任务完成后正常退出,未提前终止。可通过集群管理平台查看Driver容器的生命周期日志。 - 核查Spark配置:
- 检查是否启用
spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation,该配置可能改变Spark对已有目录的处理逻辑; - 确认是否自定义了
spark.sql.sources.commitProtocolClass,若自定义提交协议未正确实现清理逻辑,会导致临时目录残留。
- 检查是否启用
解决与阻止方法
- 手动清理临时目录:临时解决可执行命令
hdfs dfs -rm -r <表存储路径>/_temporary,注意不要误删有效数据。 - 修复权限问题:调整Hive表存储路径的权限,确保Driver运行用户拥有读写执行权限,可使用
hdfs dfs -chmod -R 755 <表路径>(根据实际需求调整权限)。 - 规范写入逻辑:采用Spark标准API写入Hive表,如
DataFrame.write.saveAsTable()或CREATE TABLE ... AS SELECT语法,避免自定义文件写入逻辑绕过Spark的提交协议。 - 升级Spark版本:Spark 3.1.3存在部分已知的临时目录未删除bug(如动态分区写入场景),升级至3.2.x及以上版本可修复此类问题。
- 重置提交协议配置:若自定义了提交协议,可恢复为默认配置:
spark.sql.sources.commitProtocolClass=org.apache.spark.sql.execution.datasources.SQLHadoopMapReduceCommitProtocol
内容的提问来源于stack exchange,提问作者Eyal
相关产品推荐
相关产品推荐

