我们可以用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
数目。