11

我正在尝试编写代码以将文件导入 HDFS 以用作配置单元外部表。我发现使用类似的东西:

富 | ssh 主机名“hdfs dfs -put - /destination/$FILENAME”

可能会导致一种错误类型,即创建一个临时文件,然后在完成后重命名。这可能会导致目录列表和查询执行之间的 hive 竞争条件。

一种解决方法是将文件复制到临时目录并将文件“hdfs dfs mv”放置到位。

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

  1. “hdfs dfs -mv”命令是原子的,对吧?
  2. 还有哪些 HDFS 命令或操作是原子的?
  3. 两个几乎同时发出的“hdfs dfs -mkdir”命令可以相信它们都成功了吗?
  4. 将文件移动到位时,是否有更好的方法来避免配置单元的竞争条件?
4

1 回答 1

14

Hadoop FS 介绍中,您可以找到对原子性的要求

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

原子性

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

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

...

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

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

  1. 是的
  2. 以上所列
  3. 恕我直言,重命名文件是这项工作的不错选择
于 2016-01-07T15:53:47.670 回答