关闭

测试工具——Distcp工具深入分析

发表于:2013-11-01 11:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:凡提    来源:51Testing软件测试网采编

  map数的确定算法如下:
private static void setMapCount(long totalBytes, JobConf job)
throws IOException {
int numMaps =
(int)(totalBytes / job.getLong(BYTES_PER_MAP_LABEL, BYTES_PER_MAP));
numMaps = Math.min(numMaps,
job.getInt(MAX_MAPS_LABEL, MAX_MAPS_PER_NODE *
new JobClient(job).getClusterStatus().getTaskTrackers()));
job.setNumMapTasks(Math.max(numMaps, 1));
}
  这里可以看到,DistCp其实还判断了集群实际tasktracker数量,防止map数设置的太多,导致很多map需要等待一轮轮的调度。
  切分代码如下:
SequenceFile.Reader sl = null;
try {
sl = new SequenceFile.Reader(fs, src, job);
for (; 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过程就会因为丢数据而失败了。
32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号