distcp 是 Hadoop 自带的分布式复制程序,该程序可以在 Hadoop 集群间实现(大)文件夹或者(大)文件的复制,可以用来数据迁移,数据备份等。
# 相同版本的hadoop集群
hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
注意,源路径必须是绝对路径。
distcp 的选项
不加任何选项 默认目标路径存在文件则跳过
-overwrite 覆盖目标文件,无论是否修改
-update 覆盖有改动的目标文件
distcp 的底层原理
distcp 底层是跑 MapReduce 程序,只用 Map 完成,不需要 Reduce。
合理设置map个数
map 的数量是这样确定的。
让每一个 map 复制合理的数据量来尽量减少构建任务时所涉及的开销,这是一个很好的想法,所以每个 map 至少复制256MB数据(除非输入的总数据量较少,否则一个 map 就可以完成所有的复制)。
通。
如果数据非常大则有必要限制 map 的数量进而限制带宽和集群的使用。
默认情况下,每个集群节点最多分配20个map任务。
过对 distcp 指定 -m 参数,可以减少分配的map任务数。
例如,-m 1000 将分配 1000 个 map 任务
HFTP 协议
上面是 hdfs 协议,适合相同版本的集群,如果是不同版本的,建议使用 HFTP 协议。
# 版本不同,两个系统版本的 RPC 是不兼容的。想要弥补这种情况,可以使用基于只读 HTTP 协议的 HFTP 文件系统并从源文件系统中读取数据。并且这个作业必须运行在目标集群上,进而实现 HDFS RPC 版本的兼容。注意,需要在 URI 源中指定 namenode 的 Web 端口。这是由 dfs.http.address 属性决定的,其默认值为50070
hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
webhdfs 协议
使用 webhdfs 协议(替代hftp)后,对源集群和目标集群均可以使用HTTP协议进行通信,且不会造成任何不兼容的问题
hadoop distcp webhdfs://namenodel: 50070/foo webhdfs://namenode2:50070/bar