Distcp工具深入分析(3)

发表于:2014-06-25来源:淘测试作者:凡提点击数: 标签:软件测试
(; sl .next(key, value); last = sl .getPosition()) { // if adding this split would put this split past the target size, // cut the last split and put this next file in the next split. if (acc + key.ge
(; sl.next(key, value); last = sl.getPosition()) {

// if adding this split would put this split past the target size,

// cut the last split and put this next file in the next split.

if (acc + key.get() > targetsize && acc != 0) {

long splitsize = last - pos;

splits.add(new FileSplit(src, pos, splitsize, (String[])null));

cbrem -= splitsize;

pos = last;

acc = 0L;

}

acc += key.get();

}

}

finally {

checkAndClose(sl);

}

  split之后就进入Mapper执行阶段,map task起来后就会根据自己分配到的那段文件列表来进行点对点的拷贝,拷贝过程会保持Permission、Replication、Block Size的一致性,如果设定了-update则会做一下是否需要update的判断,如果设定了-overwrite则会删除已有的文件。这里Owner信息没有保持一致,而是放到了服务端所有map执行完之后,这一点很让我觉得纠结,为什么不在map里面拷贝完之后直接同步文件Owner呢?如果有哪位大师知道希望可以提点我一下。因为是实现了Tool接口,而Tool接口是继承了Configurable接口的,所以-D指定的值对于DistCp来说也是可以生效的。例如设定“-Ddfs.replication=1”,那么拷贝时目标文件的replication数就将保持为1,这样一来由于目标端需要写入的数据变少了,拷贝速度就可以大大加快,但是不推荐这么做,因为拷贝过程中如果有一台Datanode挂了,那么丢失的数据由于无备份,就将真正丢了,这台机器恢复不了的话,整个distcp过程就会因为丢数据而失败了。

  拷贝过程关键代码如下:

FSDataInputStream in = null;

FSDataOutputStream out = null;

try

原文转自:http://www.taobaotest.com/blogs/2516