java - Apache Hadoop API 以原子方式创建唯一目录

标签 java hadoop hdfs

我正在寻找创建目录并在目录已存在时抛出错误的方法。目前 Apache HadoopFilesystem 类具有模拟 mkdir -p 行为的 mkdirs 方法。我正在寻找在 Java 中模拟 mkdir 的 API。

if fs.exists(路径) 抛出 FileAlreadyExistsException("目录存在") fs.mkdirs(路径)

这可以做到,但容易受到竞争条件的影响。我们是否有任何 API 可以原子地执行此操作。

最佳答案

恐怕不会。您可以使用 rename() 重命名目录,更好地保证它最终是否存在。

您可以通过 hadoop API 在 HDFS/posix 文件系统上自动创建文件;您可以将其用作获取目录树锁定的提示。但是你需要处理锁持有者失效的问题。这就是为什么事情倾向于为此使用 ZK 的原因;它确实提供有保证的原子/唯一 zknode 创建。

FWIW,原子性和文件系统操作有点乱。 HDFS 实际上确实使 mkdirs() 成为原子的,这比 unix 做的更多,尽管这是实现的意外(为了性能而持有锁)。一旦您开始与对象存储对话,您对原子操作和覆盖的所有先入之见都需要重新设置,否则您的代码将被无意中破坏。

关于java - Apache Hadoop API 以原子方式创建唯一目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436722/

相关文章:

java - H2数据库db文件导入

java - Spring Data MongoDB 凭据

Java 调用堆栈检查和操作

java - 如何使用 Oozie 运行 MapReduce ToolRunner 作业?

hadoop - 异常 : java. Spark 中的 lang.Exception : When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

python - 在 python 中运行 hdfs dfsadmin 命令

java - Hibernate org.hibernate.hql.ast.QuerySyntaxException 错误

hadoop - Flume HDFS Sink Flush 和 Roll 的区别

linux - 使用Cloudera服务重新启动hadoop CDH4的tasktracker和job tracker

hadoop - Spark 数据集写入 HDFS 期间创建的空分区