public void submitJob(JobInfo jobInfo) {
		//1. Talk to the NameNode and get the Chunk Information 
		 	//1.1 As the appropriate Slave to move the JAR to all the NODES
		try 
		{
			if(this.nameNodeReference.checkFileExistence(jobInfo.getJobConf().getInputPath()))
			{
				InputFileInfo inputFileInfo = this.nameNodeReference.getInputFileInfo(jobInfo.getJobConf().getInputPath());
				HashMap<String, List<String>> partitionInfo = inputFileInfo.getTranspose();
				
				//Instantiate the Priority Queue for the MapperTask and ReducerTasks(This List keeps a Heap of Where POssibly we might run it)
				MapperPriorityQueue mQ = new MapperPriorityQueue(30);
				ReducerPriorityQueue rQ = new ReducerPriorityQueue(30);
				
				Map<Integer, ConcurrentHashMap<TaskMetaData, MapperPriorityQueue>> mTasks = new HashMap<Integer, ConcurrentHashMap<TaskMetaData, MapperPriorityQueue>>();				
				Map<Integer, ConcurrentHashMap<TaskMetaData, ReducerPriorityQueue>> rTasks = new HashMap<Integer, ConcurrentHashMap<TaskMetaData, ReducerPriorityQueue>>();
				
				for(Map.Entry<String, List<String>> partitionEntry: partitionInfo.entrySet())
				{
					int taskID = this.nextTaskId();
					String chunkInputName = partitionEntry.getKey();
					
				
					//Get the List of the Possible Deployments
					List<String> possibleDeploymentNodes = partitionEntry.getValue();
					
					
					for(String dataNode : possibleDeploymentNodes)
					{
						String taskTrackerName = "TaskTracker_" + dataNode.split("_")[1].toString();
						
						if(this.taskTrackers.containsKey(taskTrackerName) && !mQ.contains(this.taskTrackers.get(taskTrackerName)))
						{
							//Possible list of Slaves the TaskCould Run on Based on the File Chunks
							mQ.add(this.taskTrackers.get(taskTrackerName));
							rQ.add(this.taskTrackers.get(taskTrackerName)); 
						}
					}
					
					//Build a Map Task Meta Data need to execute a Task
					TaskProgress taskProgress = new TaskProgress(taskID,SystemConstants.TaskType.MAPPER);
					TaskMetaData mapTask = new TaskMetaData(jobInfo.getJobID(),taskID, SystemConstants.TaskType.MAPPER,
											taskProgress, chunkInputName, String.valueOf(jobInfo.getJobID()),
											jobInfo.getJobConf().getInputFormatClassName(), jobInfo.getJobConf().getOutputFormatClassName(),
											jobInfo.getJobConf().getMapperClassName(),null,jobInfo.getJobConf().getPartitionerClassName(),jobInfo.getJobConf().getReducerNum(),0);
					
					//Add this Task to the Map Queue 
					this.mapTaskQueue.put(mapTask, mQ);
					
					//Add this Task to the MTasks
					ConcurrentHashMap<TaskMetaData, MapperPriorityQueue> temp = new ConcurrentHashMap<TaskMetaData, MapperPriorityQueue>();
					temp.put(mapTask, mQ);
					mTasks.put(taskID, temp);
					
					//Also the jobInfo that this Task in Under you
					jobInfo.progressofallTasks.put(taskID, taskProgress);

				}
				
				for(int i=0; i < jobInfo.getJobConf().getReducerNum() ; i++)
				{
					int taskID = this.nextTaskId();
					TaskProgress taskProgress = new TaskProgress(taskID,SystemConstants.TaskType.REDUCER);
					
					TaskMetaData reduceTask = new TaskMetaData(jobInfo.getJobID(),taskID, SystemConstants.TaskType.REDUCER,
							taskProgress, null, String.valueOf(jobInfo.getJobID()),
							jobInfo.getJobConf().getInputFormatClassName(), jobInfo.getJobConf().getOutputFormatClassName(),
							null,jobInfo.getJobConf().getReducerClassName(),null,0,i);
					
					//Add this Task to the Map Queue 
					this.reduceTaskQueue.put(reduceTask, rQ);
					
					//Add this Task to the RTasks	
					ConcurrentHashMap<TaskMetaData, ReducerPriorityQueue> temp = new ConcurrentHashMap<TaskMetaData, ReducerPriorityQueue>();
					temp.put(reduceTask, rQ);
					rTasks.put(taskID,temp);
					
					//Also the jobInfo that this Task in Under you
					jobInfo.progressofallTasks.put(taskID, taskProgress);
				}
				
				//Add it to all the other DataStructures in the JobTracker
				this.mapperTasks.putAll(mTasks);
				this.reducerTasks.putAll(rTasks);
				
				this.jobs.put(jobInfo.getJobID(), jobInfo);
				jobInfo.setJobStatus(SystemConstants.JobStatus.INPROGRESS);
			}
		} 
		catch (RemoteException e) {
			// TODO Auto-generated catch block
			System.err.println("Could not contact NameNodeReference");
			e.printStackTrace();
		}
		
	}