hadoop 通过distcp并行复制。

hadoop权威指南第四版

Hadoop自带一个有用程序distcp,该程序可以并行从Hadoop文件系统中复制大量数据,也可以系那个大量数据复制到Hadoop中。

        Distcp的一种用法是替代 hadoop fs -cp。例如,我们可以将文件复制到另一个文件中:

% hadoop distcp file1 file2

也可以复制目录:

% hadoop distcp dir1 dir2


        如果dir2 不存在,将新建dir2,目录dir1的内容全部复制到dir2下。可以指定多个源路径,所有源路径下的内容都将被复制到目录路径下。

        如果dir2 已经存在,那么目录dir1将被复制到dir2下,形成目录结构dir2/dir1。如果这不是你所需的,你可以补充使用-overwrite选项,在保持同样的目录结构的同时强制覆盖原有文件。你也可以使用-update选项,仅更新发生变化的文件。用一个示例可以更好解释这个过程。如果我们修改了dir1 子树中一个文件,我们能够通过运行以下命令将修改同步到dir2中:

hadoop distcp -update dir1 dir2


        建议:如果不确定discp操作的效果,最好先在一个小的测试目录树下试运行。

        distcp是作为一个MapReduce作业来实现的,该复制作业是通过集群中并行运行的map来完成。这里没有reducer。每个文件通过一个map进行复制,并且distcp试图为每一个map分配大致相等的数据来执行,即把文件划分为大致相等的块。默认情况下,将近20个map被使用,但是可以通过为distcp指定-m参数来修改map的数目

        关于distcp的一个常见使用实例是在两个HDFS集群间传送数据。例如,以下命名在第二个集群上为第一个集群/foo目录创建了一个备份:

hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs:namenode2/foo


        -delete选项使得distcp可以删除目录路径中任意没有原路径中出现的文件或目录,-P 选项意味着文件状态属性如权限、块大小和复本数被保留。当你运行不带参数的distcp时,能够看到准确的用法

        如果两个集群运行的是HDFS的不兼容版本,你可以将webhdfs协议用于他们之间的distcp:

hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50080/foo


        另一个变种是使用HttpFs代理作为distcp源或目标(有一次使用了webhdfs协议),这样具有设置防火墙和控制带宽的优点。

你可能感兴趣的:(Hadoop系列)