我正在尝试使用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,但是我需要一种高效安全的方法来删除实际复制的文件。
2条答案
按热度按时间ulydmbyx1#
这种行为与unix上的mv是一致的(某种程度上)-尽管其手册页没有记录它,但如果目标目录包含以下文件,mv将拒绝将目录重命名为另一个目录:
[evgeny@dev1]$mv src/*夏令时/
mv:无法将“src/subsrc”移动到“dst/subsrc”:目录不为空
不幸的是,您必须首先清除dst dir:“hadoopfs-rmrdst”。
8mmmxcuj2#
org.apache.hadoop.fs.filecontext(org.apache.hadoop.fs.filesystem的 Package \替换)有一个更干净的api。
除此之外,如果目录存在,它的重命名将(可选)失败。这不会使请求的合并,但至少会引发异常,不会创建不需要的子目录。