【问题标题】:How can I prevent Hadoop's HDFS API from creating parent directories?如何防止 Hadoop 的 HDFS API 创建父目录?
【发布时间】:2018-05-31 03:30:33
【问题描述】:

如果在创建子目录时父目录不存在,我希望 HDFS 命令失败。当我使用FileSystem#mkdirs 中的任何一个时,我发现没有引发异常,而是创建了不存在的父目录:

import java.util.UUID
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}

val conf = new Configuration()
conf.set("fs.defaultFS", s"hdfs://$host:$port")

val fileSystem = FileSystem.get(conf)
val cwd = fileSystem.getWorkingDirectory

// Guarantee non-existence by appending two UUIDs.
val dirToCreate = new Path(cwd, new Path(UUID.randomUUID.toString, UUID.randomUUID.toString))

fileSystem.mkdirs(dirToCreate)

如果没有检查存在的繁琐负担,如果父目录不存在,如何强制 HDFS 抛出异常?

【问题讨论】:

标签: scala hadoop hdfs mkdirs


【解决方案1】:

FileSystem API 不支持此类行为。相反,应该使用FileContext#mkdir;例如:

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileContext, FileSystem, Path}
import org.apache.hadoop.fs.permission.FsPermission

val files = FileContext.getFileContext()
val cwd = files.getWorkingDirectory
val permissions = new FsPermission("644")
val createParent = false

// Guarantee non-existence by appending two UUIDs.
val dirToCreate = new Path(cwd, new Path(UUID.randomUUID.toString, UUID.randomUUID.toString))

files.mkdir(dirToCreate, permissions, createParent)

上面的例子会抛出:

java.io.FileNotFoundException: Parent directory doesn't exist: /user/erip/f425a2c9-1007-487b-8488-d73d447c6f79

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2016-04-30
    • 2017-07-07
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多