我正在尝试编写代码,将文件导入HDFS以供作为Hive外部表使用。 我发现使用以下命令之类的东西:
foo | ssh hostname "hdfs dfs -put - /destination/$FILENAME"
可能会导致一种错误,在该错误中创建临时文件,然后在完成时重命名。这可能会导致Hive在目录列表和查询执行之间出现竞争条件。
一种解决方法是将文件复制到临时目录,然后将文件“hdfs dfs mv”到正确的位置。
具体的和一般的/学术问题是:
- "hdfs dfs -mv" 命令是原子的,对吗?
- 还有哪些HDFS命令或操作是原子的?
- 在大约同时发出两个“hdfs dfs -mkdir”命令,它们都认为自己成功了吗?
- 有没有更好的方法来避免将文件移到正确位置时与Hive出现竞争条件?
FileSystem
的rename
文档不一致,文档中提到默认情况下它不是原子性的。 - Colonel Thirty Two