本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.3节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲

1.3 使用distcp实现集群间数据复制

Hadoop分布式复制(distcp)是Hadoop集群间复制大量数据的高效工具。distcp是通过启动MapReduce实现数据复制的。使用MapReduce的好处包含可并行性、高容错性、作业恢复、日志记录、进度汇报等。Hadoop分布式复制(distcp)对在开发集群环境、研究集群环境和生产集群环境之间进行数据复制十分有用。

准备工作
首先必须保证复制源和复制目的地能够互相访问。

最好关闭复制源集群map任务的推测机制,可以在配置文件mapred-site.xml中将mapred.map.tasks.speculative.execution的值设置为false来实现,这样就可以避免在map任务失败的时候产生任何不可知的行为。

源集群和目的集群的RPC协议必须是一致。这意味着两个集群之间安装的Hadoop版本必须一致3。

操作步骤
完成以下几个步骤实现集群间的文件夹复制。

1.将集群A的weblogs文件夹复制到集群B上:

hadoop distcp hdfs://namenodeA/data/weblogs  hdfs://namenodeB/data/weblogs

2.将集群A的weblogs文件夹复制到集群B并覆盖已存在文件:

hadoop distcp –overwrite hdfs://namenodeA/data/weblogs hdfs://namenodeB/ data/weblogs

3.同步集群A和集群B之间的weblogs文件夹:

hadoop distcp –update hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs

工作原理
在源集群,文件夹中的内容将被复制为一个临时的大文件。将会启动一个只有map(map-only4)的MapReduce作业来实现两个集群间的数据复制。默认情况下,每个map就将会分配到一个256 MB的数据块文件。举个例子,如果weblogs文件夹总大小为10 GB,默认将会启动40个map,每个map会复制大约256 MB的数据。distcp复制也可以通过参数手动设置启动的map数量。

hadoop distcp –m 10 hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs

在上面这个例子中,将会启动10个map进行数据复制。如果weblogs文件夹的总大小是10 GB,那么每个map会复制大约1 GB的数据。

更多参考
如果要在运行的Hadoop版本不一样的两个集群之间进行数据复制,一般建议在复制源集群使用HftpFileSystem5。HftpFileSystem是一个只读的文件系统。相应的distcp命令只能在目标服务器上运行:

hadoop distcp hftp://namenodeA:port/data/weblogs hdfs://namenodeB/data/ weblogs

在上面这条命令中,port的值要与配置文件hdfs-site.xml中dfs.http.address属性的端口值一致。