一般使用hadoop -cp的命令来复制文件或者目录,但是hadoop -cp的效率对于处理大数据下的目录级别的copy并不能展现出高性能。
接下来distcp的使用,就是为了增加copy情况下的并行度,真正实现parallel的copy。
copy文件:
hadoop distcp hdfs://namenode1/foo/file1 hdfs://namenode1/foo/file2
copy目录:
hadoop distcp hdfs://namenode1/foo1/ hdfs://namenode1/foo2
如果foo2目录不存在,那么会新建一个foo2目录,然后把foo1的子文件子目录copy过去
如果foo2目录已经存在, 那么会在foo2目录下新生成foo1目录,形成/foo2/foo1的目录结构。
如果目录存在且只想保存foo2目录下:
hadoop distcp -update hdfs://namenode1/foo1/ hdfs://namenode1/foo2
如果目录存在且只想保存foo2目录下并删除其他foo2的目录文件:
hadoop distcp -update -delete -p hdfs://namenode1/foo1/ hdfs://namenode1/foo2
一般来说,distcp更多的用途是实现不同hdfs cluster之间的互相copy:
hadoop distcp -update -delete -p hdfs://namenode1/usr hdfs://namenode2/usr
当然我们也可以通过webhdfs和httphdfs, ftp, S3…进行数据copy
hadoop distcp -update -delete -p webhdfs://namenode1:50070/usr webhdfs://namenode2:50070/usr
hadoop distcp -update -delete -p swebhdfs://namenode1:14000/usr swebhdfs://namenode2:14000/usr
distcp是通过MapReduce来实现的,每一个file都调度一个map来copy文件,过程中并没有reduce的参与。