2014-01-07 20 views
1

我需要将大量文件从一个hdfs目录移动到另一个hdfs目录中(而不是复制)到另一个hdfs目录。将大量文件从hdfs移动到hdfs

我可以使用distcp,但它似乎是一个矫枉过正,因为它是复制文件(复制它)我只想移动它。两个问题:

A)是那里有什么:

我想用MapReduce的做到这一点,因为有成千上万的文件需要被移动(或重命名为新的路径)。我也想将它与oozie集成。我自己可以写一个mapreduce工作,但我想知道是否有什么可以完成这项工作。

B)我真的需要这样做mapred?

不幸的是,我对hdfs rename的性能特征不够了解;你认为我可以通过单线程方法来重命名文件吗?

回答

1

移动本身是高效的,因为它只处于元数据(即inode)级别,而不是数据级别。换句话说,发布一个移动(它在Hadoop的代码中名为rename,而不是move)比复制数据要快得多。你可以看看source code,以防你对细节感兴趣。

由于这个原因,您的不应该执行distcp,因为这将是数据的实际副本。如果要对其进行并行化(因为你说的数百万个文件),应该不会太难使用Hadoop流:包含的文件列表进行重命名(SRC +目的地)

  1. 写几个文件,一个每行。
  2. 编写一个shell脚本,为它在stdin上读取的每一行发出重命名(hdfs命令mv)。
  3. 使用流式处理:您的文件与文件是输入,您的shell脚本是映射器。

那里有什么吗?

我不知道,但也有可能。

我真的需要这样做,因为mapred?

如果您有数百万个文件,即使HDFS重命名本身有效,联系namenode的延迟也会加起来。 但是,如果它是一次性的,我宁愿发出单线程的方法并等待,因为写入和调试(即使是简单的代码)也需要一段时间。如果你打算经常这样做(为什么?),那么我会考虑实施我上面描述的方法。