private List<Mapper> estimateMappers() {
		List<Mapper> newMapperList = new ArrayList<Mapper>();
		
		if(isSplitSizeChanged || isMapperConfChanged) {
			MapperEstimator mapperEstimator = new MapperEstimator(finishedConf, newConf);
					
			//split size is changed
			if(isSplitSizeChanged) {
				
				//List<Long> splitsSizeList = InputSplitCalculator.getSplitsLength(newConf);
				
				List<Long> splitsSizeList = splitMap.get((int)(newConf.getSplitSize() / 1024 /1024));
				//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 if(isMapperConfChanged) {
				for(int i = 0; i < job.getMapperList().size(); i++) {
					Mapper newMapper = mapperEstimator.estimateNewMapper(job.getMapperList().get(i));
					newMapperList.add(newMapper);
				}
				
			}
			//none mapper configuration changed
			else
				for(Mapper mapper : job.getMapperList()) 
					newMapperList.add(mapper);
		}
		//none mapper configuration changed
		else {
			for(Mapper mapper : job.getMapperList()) 
				newMapperList.add(mapper);
		}
		return newMapperList;
	}