一、概述
DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。
它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。
它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。
由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。
二、使用DistCp
DistCp最常用于在集群之间的拷贝:
hadoop distcp hdfs://nn1:8020/source hdfs://nn2:8020/destination
上述命令会把nn1集群的/source目录下的所有文件或目录展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务,
然后每个NodeManager分别执行从nn1到nn2的拷贝操作。注意:DistCp使用绝对路径进行操作。
命令行中还可以指定多个源目录:
hadoop distcp hdfs://nn1:8020/source/a hdfs://nn1:8020/source/b hdfs://nn2:8020/destination
或者使用-f选项,从文件里获得多个源:
hadoop distcp -f hdfs://nn1:8020/srclist hdfs://nn2:8020/destination
其中srclist 的内容是:
hdfs://nn1:8020/source/a
hdfs://nn1:8020/source/b
当从多个源拷贝时,如果两个源冲突,DistCp会停止拷贝并提示出错信息, 如果在目的位置发生冲突,会根据选项设置解决。
默认情况会跳过已经存在的目标文件(比如不用源文件做替换操作)。每次操作结束时
都会报告跳过的文件数目,但是如果某些拷贝操作失败了,但在之后的尝试成功了, 那么报告的信息可能不够精确。
每个Datanode必须都能够与源宿端Datanode进行访问和交互。
每个Datanode必须都能够与源宿端Datanode进行访问和交互。
对于HDFS来说,源和目的端要运行相同版本的协议或者使用向下兼容的协议。详细请参阅“在版本之间复制”章节。拷贝完成后,建议生成
源端和目的端文件的列表,并交叉检查,来确认拷贝是否真正成功。 因为DistCp使用Map/Reduce和FileSystem
API进行操作,所以这三者或它们之间有任何问题
都会影响拷贝操作。一些Distcp命令的成功执行可以通过再次执行带-update参数的该命令来完成,
但用户在如此操作之前应该对该命令的语法很熟悉。
值得注意的是,当另一个客户端同时在向源文件写入时,拷贝很有可能会失败。 尝试覆盖HDFS上正在被写入的文件的操作也会失败。
如果一个源文件在拷贝之前被移动或删除了,拷贝失败同时输出异常 FileNotFoundException。
三、命令行选项
DistCp命令行选项如表1所示:
标识 | 描述 | 备注 |
-p[rbugp] | Preserve r:replication number b: block size u: user g: group p: permission |
|
-i | 忽略失败 | 这个选项会比默认情况提供关于拷贝的更精确的统计, |
-log <logdir> | 记录日志到 <logdir> | |
-m <num_maps> |
同时拷贝的最大数目 | 指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大。 |
-overwrite | 覆盖目标 | 用户要小心使用这个选项。 |
-update | 如果源和目标的大小不一样则进行覆盖 | 用户使用要小心。 |
-f <urilist_uri> |
用<urilist_uri> 作为源文件列表 |