随后,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 |