哪些HDFS操作是原子操作?

11

我正在尝试编写代码,将文件导入HDFS以供作为Hive外部表使用。 我发现使用以下命令之类的东西:

foo | ssh hostname "hdfs dfs -put - /destination/$FILENAME"

可能会导致一种错误,在该错误中创建临时文件,然后在完成时重命名。这可能会导致Hive在目录列表和查询执行之间出现竞争条件。

一种解决方法是将文件复制到临时目录,然后将文件“hdfs dfs mv”到正确的位置。

具体的和一般的/学术问题是:

  1. "hdfs dfs -mv" 命令是原子的,对吗?
  2. 还有哪些HDFS命令或操作是原子的?
  3. 在大约同时发出两个“hdfs dfs -mkdir”命令,它们都认为自己成功了吗?
  4. 有没有更好的方法来避免将文件移到正确位置时与Hive出现竞争条件?
1个回答

14

Hadoop FS introduction中,您可以找到原子性要求。

以下是Hadoop兼容的文件系统的核心期望。一些文件系统不满足所有这些期望;因此,某些程序可能无法按预期工作。

原子性

有一些操作必须是原子的。这是因为它们经常用于在集群中的进程之间实现锁定/独占访问。

  1. 创建一个文件。如果overwrite参数为false,则检查和创建必须是原子的。
  2. 删除一个文件。
  3. 重命名一个文件。
  4. 重命名一个目录。
  5. 使用mkdir()创建单个目录。

...

大多数其他操作没有原子性的要求或保证。

因此,为了确保,您必须检查底层文件系统。但基于这些要求,答案是:

  1. 是的
  2. 如上所列
  3. 我认为重命名文件是完成工作的好选择

这似乎与FileSystemrename文档不一致,文档中提到默认情况下它不是原子性的。 - Colonel Thirty Two
依赖于文件系统的实现,但是默认情况下它不是原子性的。 - tworec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接