Distcp工具深入分析(2)

发表于:2014-06-25来源:淘测试作者:凡提点击数: 标签:软件测试
随后,DistCp会以268435456字节(256MB)为切分单位计算map数,这个数值可以通过-sizelimit参数进行人为修改。DistCp构造了自己的InputSplit,将_distcp_src_files文件以刚

  随后,DistCp会以268435456字节(256MB)为切分单位计算map数,这个数值可以通过-sizelimit参数进行人为修改。DistCp构造了自己的InputSplit,将_distcp_src_files文件以刚才所说的值为单位进行切分,如果设定了-m参数,则会按照该参数设定的map数为基准进行切分。这里需要注意切分的map数不会恰好等于-m参数设定的值,由于不能整除的原因,总会或多或少的偏离一点设定值。

  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

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