《Hadoop权威指南:大数据的存储与分析》—3.7 通过distcp并行复制
3.7 通过distcp并行复制
前面着重介绍单线程访问的HDFS访问模型。例如,通过指定文件通配符,可以对一组文件进行处理,但是为了提高性能,需要写一个程序来并行处理这些文件。Hadoop自带一个有用程序distcp,该程序可以并行从Hadoop 文件系统中复制大量数据,也可以将大量数据复制到Hadoop中。
Distcp的一种用法是替代hadoop fs –cp。例如,我们可以将文件复制到另一个文件中:[1]
% hadoop distcp file1 file2
也可以复制目录:
% hadoop distcp dir1 dir2
如果dir2不存在,将新建dir2,目录dir1的内容全部复制到dir2下。可以指定多个源路径,所有源路径下的内容都将被复制到目标路径下。
如果dir2已经存在,那么目录dir1将被复制到dir2下,形成目录结构dir2/dir1。如果这不是你所需的,你可以补充使用-overwrite选项,在保持同样的目录结构的同时强制覆盖原有文件。你也可以使用-update 选项,仅更新发生变化的文件。用一个示例可以更好解释这个过程。如果我们修改了dir1子树中一个文件,我们能够通过运行以下命令将修改同步到dir2中:
% hadoop distcp –update dir1 dir2
如果不确定discp 操作的效果,最好先在一个小的测试目录树下试运行。
distcp是作为一个MapReduce作业来实现的,该复制作业是通过集群中并行运行的map来完成。这里没有reducer。每个文件通过一个map进行复制,并且distcp试图为每一个map分配大致相等的数据来执行,即把文件划分为大致相等的块。默认情况下,将近20个map被使用,但是可以通过为distcp指定-m参数来修改map的数目。
关于distcp的一个常见使用实例是在两个HDFS 集群间传送数据。例如,以下命令在第二个集群上为第一个集群/foo目录创建了一个备份:
% hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs://namenode2/foo
-delete选项使得distcp可以删除目标路径中任意没在源路径中出现的文件或目录,-P选项意味着文件状态属性如权限、块大小和复本数被保留。当你运行不带参数的distcp时,能够看到准确的用法。
如果两个集群运行的是HDFS的不兼容版本,你可以将webhdfs协议用于它们之间的distcp:
% hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/foo
另一个变种是使用HttpFs 代理作为distcp源或目标(又一次使用了webhdfs协议),这样具有设置防火墙和控制带宽的优点,详情参见3.4节对HTTP的讨论。
保持 HDFS 集群的均衡
向HDFS复制数据时,考虑集群的均衡性是相当重要的。当文件块在集群中均匀分布时,HDFS 能达到最佳工作状态,因此你想确保distcp不会破坏这点。例如,如果将-m选项指定为1,即由一个map来执行复制作业,它的意思是不考虑速度变慢和未充分利用集群资源每个块的第一个复本将存储到运行map 的节点上(直到磁盘被填满)。第二和第三个复本将分散在集群中,但这一个节点是不均衡的。将map的数量设定为多于集群中节点的数量,可以避免这个问题。鉴于此,最好首先使用默认的每个节点20个map来运行distcp命令。
然而,这也并不总能阻止集群的不均衡。也许想限制map的数量以便另外一些节点可以运行其他作业。若是这样,可以用均衡器(balancer)工具(参见11.1.4节对均衡器的讨论),进而改善集群中块分布的均匀程度。
- 点赞
- 收藏
- 关注作者
评论(0)