本节书摘来异步社区《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属性的端口值一致。