目录存在时hdfs movefromlocal中的奇怪行为

huwehgph  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(313)

我正在尝试使用movefromlocalhdfsshell命令将文件(树结构)从本地文件系统移动到hdfs。
如果目标子目录不存在,则一切正常。但是,如果它们存在(这是一般情况,因为文件被添加到现有目录中),则会创建层次结构中的另一个级别
例子:
磁盘上的原始结构

$ find src
src
src/a
src/a/2
src/a/2/file1
src/a/1
src/a/1/file1
src/a/4
src/a/4/file1
src/a/3
src/a/3/file1
src/b
src/b/2
src/b/2/file1
src/b/1
src/b/1/file1
src/b/4
src/b/4/file1
src/b/3
src/b/3/file1

移动命令

$hdfs dfs -moveFromLocal src/* /dst

结果(如预期)

$ hdfs dfs -ls  -R /dst
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/1/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/2/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/3/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/4/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/1/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/2/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/3/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/4/file1

第二批本地文件

$ find src
src
src/a
src/a/2
src/a/2/file2
src/a/1
src/a/1/file2
src/a/4
src/a/4/file2
src/a/3
src/a/3/file2
src/b
src/b/2
src/b/2/file2
src/b/1
src/b/1/file2
src/b/4
src/b/4/file1
src/b/3
src/b/3/file2

将第二批移至hdfs

$ hdfs dfs -moveFromLocal src/* /dst

hdfs第二批
请注意,所有“file2”都处于双重层次结构中(a/a,而不仅仅是a)

$ hdfs dfs -ls  -R /dst
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/1/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/2/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/3/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/a/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/a/4/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a/a
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a/a/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/a/a/1/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a/a/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/a/a/2/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a/a/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/a/a/3/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/a/a/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/a/a/4/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/1/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/2/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/3/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:39 /dst/b/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:39 /dst/b/4/file1
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b/b
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b/b/1
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/b/b/1/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b/b/2
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/b/b/2/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b/b/3
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/b/b/3/file2
drwxr-xr-x   - root supergroup          0 2014-02-02 03:42 /dst/b/b/4
-rw-r--r--   3 root supergroup          0 2014-02-02 03:42 /dst/b/b/4/file1

编辑
我知道这种行为是故意的。。。我对同样的解决方案持开放态度。
最简单的解决方案是创建一个分别移动每个文件的循环,这是由于性能问题造成的问题(每个hdfs命令启动一个新的jvm)
我也考虑过使用copy而不是move,但是我需要一种高效安全的方法来删除实际复制的文件。

ulydmbyx

ulydmbyx1#

这种行为与unix上的mv是一致的(某种程度上)-尽管其手册页没有记录它,但如果目标目录包含以下文件,mv将拒绝将目录重命名为另一个目录:
[evgeny@dev1]$mv src/*夏令时/
mv:无法将“src/subsrc”移动到“dst/subsrc”:目录不为空
不幸的是,您必须首先清除dst dir:“hadoopfs-rmrdst”。

8mmmxcuj

8mmmxcuj2#

org.apache.hadoop.fs.filecontext(org.apache.hadoop.fs.filesystem的 Package \替换)有一个更干净的api。
除此之外,如果目录存在,它的重命名将(可选)失败。这不会使请求的合并,但至少会引发异常,不会创建不需要的子目录。

相关问题