private List<Mapper> estimateMappers() {
		List<Mapper> newMapperList = new ArrayList<Mapper>();
		List<Long> splitsSizeList = splitMap.get((int)(newConf.getSplitSize() / 1024 /1024));
		
		MapperEstimator mapperEstimator = new MapperEstimator(finishedConf, newConf);
		
		//split size is changed
		if(isSplitSizeChanged) {
			//256:[268435456, 268435456, 268435456, 268435456, 268435456, ... 268435456, 120589425]
			Map<Integer, Mapper> cacheNewMapper = new HashMap<Integer, Mapper>();
			
			for(int i = 0; i < splitsSizeList.size(); i++) {
				Long cSplitSize = splitsSizeList.get(i);
				int cSplitMB = (int) (cSplitSize / (1024 * 1024)) ; //HDFS_BYTES_READ
				
				if(!cacheNewMapper.containsKey(cSplitMB)) {
					Mapper newMapper = mapperEstimator.estimateNewMapper(job.getMapperList(), cSplitSize);
					newMapperList.add(newMapper);
					cacheNewMapper.put(cSplitMB, newMapper); 
				}
				else
					newMapperList.add(cacheNewMapper.get(cSplitMB)); //Note: multiple references of newMapper
			}	
		}
			
		//do not need to consider split size
		else {
			//assume all the sampled mappers' input split size is normal
			
			for(int i = 0; i < splitsSizeList.size(); i++) {
				Mapper newMapper = mapperEstimator.estimateNewMapper(job.getMapperList(), splitsSizeList.get(i));
				newMapperList.add(newMapper);
			}
			
		}	
		
		return newMapperList;
	}