第三章 第七节 使用distcp并行拷贝

        到现在为止我们看到的HDFS访问模式都是单线程访问。它可以操作一组文件----例如定义file glob----

但是要高效并行处理这些文件,你需要自己写一个程序。HADOOP自带了一个有用的程序叫distcp用来

并行拷贝文件到/从HADOOP文件系统。

        distcp的一个作用是有效代替hadoop fs -cp。例如,你可以拷贝一个文件到另一文件:

% hadoop distcp file1 file2
        你也可以拷贝一个目录:

% hadoop distcp dir1 dir2
        如果dir2不存在,它会创建,并且把dir1下的内容拷贝进去。你可以定义多个源文件路径,它们都会被

拷贝到目标路径。

        如果dir2已经存在,那么dir1会被拷贝到它里面,创建一个目录结构dir2/dir1。如果这不是你想要的,你

可以提供一个-overwrite选项来保持同样的目录结构并强制覆盖文件。你也可以使用-update选项来只更新那

些改变了的文件。这最好使用一个例子。如果我们改变dir1里的一个文件,我们可以通过运行如下命令来同步

改变dir2:

% hadoop distcp -update dir1 dir2
        distcp是通过MapReduce job来实现的,它的工作就是通过并行运行在集群的map来拷贝。没有reducer。

每一个文件由一个单独的map来拷贝,distcp把所有分成文件大概相等的份来保证每一个map得到相近数量的

数据。默认只用20个map,可以通过定义-m参数来改变这个值。

        distcp最普遍的使用是在两个HDFS集群之间传递数据。例如,下面的命令会把第一个集群下的/foo目录

备份到第二个集群下:

% hadoop distcp -update -delete -p hdfs://namenode1/foo hdfs://namenode2/foo

        -delete标记将导致distcp将源目录中不存在的文件或目录从目标目录中删除,-p意味着文件的状态属性如

权限、block size及副本都将保存。你可以无参数运行distcp来查看详细使用指导。

        如果这两个集群运行的HDFS版本不兼容,你可以使用webhdfs协议来distcp他们:

% hadoop distcp webhdfs://namenode1:50070/foo webhdfs://namenode2:50070/foo

        另一个变形是使用一个HttpFs代理来作为distcp的源或目标(同样使用webhdfs协议),它的优点是可以控制

防火墙及带宽(见54页“HTTP")。


保持HDFS集群平衡

        在拷贝数据到HDFS时,考虑集群的平衡是很重要的。HDFS在文件block均匀分布在集群中时工作的最好,所以

你要确认distcp不会破坏这个。例如,如果你定义-m 1,只会有一个map来做拷贝----除了慢且没有有效使用集群的

资源不说----还意味着第一个副本的所有block会保存在运行map的那个节点上(直到硬盘填满)。第二个和第三个副本

可能保存到整个集群,但是这个节点将支是不平衡的。通过使用比集群节点更多的map可以避免这个问题。基于这个

原因,最好运行distcp时使用默认的每个节点20个map。

        尽管这样,并不总是可以避免集群变得不平衡的。也许你想限制map的数量这样其它的node可以用来做其它工作。

在这种情况下,你可以使用balancer工作(见329页“Balancer“)来使block均匀分布在集群上。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值