排查 Spark 创建临时目录出错
Spark 任务运行时报错:
java.io.IOException: Failed to create a temp directory ...
根据函数栈定位报错的函数,然后分析它的实现源码:
273 def createDirectory(root: String, namePrefix: String = "spark"): File = { 274 var attempts = 0 275 val maxAttempts = MAX_DIR_CREATION_ATTEMPTS 276 var dir: File = null 277 while (dir == null) { 278 attempts += 1 279 if (attempts > maxAttempts) { 280 throw new IOException("Failed to create a temp directory (under " + root + ") after " + 281 maxAttempts + " attempts!") 282 } 283 try { 284 dir = new File(root, namePrefix + "-" + UUID.randomUUID.toString) 285 if (dir.exists() || !dir.mkdirs()) { 286 dir = null 287 } 288 } catch { case e: SecurityException => dir = null; } 289 } 290 291 dir 292 }
MAXDIRCREATIONATTEMPTS 的值为 10 ,可以看出,如果创建 10 次随机目录失败,就报出 IOException 异常。判断是否成功的依据是:
if (dir.exists() || !dir.mkdirs())
要么目录存在,要么新建失败。一般来说尝试十次是不会反复出现目录已存在的,而 mkdirs 失败的原因多半是磁盘空间问题。