Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 存在目录时hdfs moveFromLocal中的奇怪行为_Hadoop_Hdfs - Fatal编程技术网

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

Hadoop 存在目录时hdfs moveFromLocal中的奇怪行为,hadoop,hdfs,Hadoop,Hdfs,我正在尝试使用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

我正在尝试使用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上的第二批

$ hdfs dfs -moveFromLocal src/* /dst
请注意,所有“file2”都处于双重层次结构中(a/a,而不仅仅是a)

编辑

我知道这种行为是故意的。。。 我对执行相同操作的替代解决方案持开放态度

  • 最简单的解决方案是创建一个单独移动每个文件的循环,这是由于性能问题造成的问题(每个hdfs命令都会启动一个新的jvm)

  • 我还考虑过使用复制而不是移动,但我需要一种高效、安全的方法来删除实际复制的文件


此行为与Unix上的mv是一致的(某种程度上)-尽管其手册页没有对其进行记录,但如果目标目录包含以下文件,mv将拒绝将目录重命名为另一个目录:

[evgeny@dev1]\$mv src/*dst/
mv:无法将“src/subsrc”移动到“dst/subsrc”:目录不为空

不幸的是,您必须首先清除dst目录:“hadoop fs-rmr dst”。

(包装器\ org.apache.hadoop.fs.FileSystem的替代品) 有一个更干净的API

除此之外,如果目录存在,它的重命名将(可选)失败。
这不会进行请求的合并,但至少会引发异常,不会创建不需要的子目录。

linux mv失败,但根本不会移动文件。无论如何,删除现有文件不是一个解决方案,因为它们仍然需要编辑并不理想,但是,根据我们得到的结果,您的解决方案可能应该是:copyToLocal、merge(rsync-r src/*dst/)、-expunge dst、moveFromLocal