HDFS(6)- distcp并行复制

我们可以用Java Api写代码进行复制文件或目录,也可以使用hadoop fs -cp进行复制,可这两种效率并不高,拷贝文件或目录写代码也麻烦。使用distcp并行处理是比较好的手段。

命令

复制文件

  hadoop distcp file1 file2

复制目录

  hadoop distcp dir1 dir2

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

如果dir2已经存在,那么目录dir1将被复制到dir2下,形成目录结构dir2/dir1。也可以添加-overwrite选项,在保持目录结构的同时强制覆盖原文件。

  hadoop distcp -overwrite dir1 dir2

也可以使用-update选项,仅更新发生变化的文件。

  hadoop distcp -update dir1 dir2

在HDFS集群间传递数据

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

以上命令在第二个集群上为第一个集群的/foo目录创建一个备份。
-delete选项允许删除目标路径中任意没在源路径中出现的文件或目录。
-p选项设置文件的状态属性被保留,如权限、块大小和副本数。

如果两个集群运行的HDFS版本不兼容,可以使用webhdfs进行distcp:

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

原理

distcp是作为一个MapReduce作业来实现的,通过在集群中并行运行的map来完成,这里没有reduce阶段。默认情况下,会启动20个map任务,但是可以通过distcp指定-m参数来修改map数目。

你可能感兴趣的:(HDFS(6)- distcp并行复制)