@SuppressWarnings("rawtypes")
	public static JobConf getJobConf(Configuration conf, String[] args, Class callerClass) throws IOException {
		// Directly create the path instances with the given paths and store them for later usage.
		Path input = new Path(args[0]);
		Path output = new Path(args[1]);

		// Create new generic job configuration.
		JobConf desiredJob = new JobConf(conf, callerClass);

		// Create new hadoop job and set basic configuration parameters.
		desiredJob.setJobName(Coefficient.HADOOP_JOB_NAME);
		desiredJob.setSessionId(Coefficient.HADOOP_JOB_NAME);

		// Tell hadoop where to get the altered input data and where to put the output data.
		FileInputFormat.setInputPaths(desiredJob, input);
		FileOutputFormat.setOutputPath(desiredJob, output);

		// The third console argument determines which correlation algorithm should be used for computing the
		// correlation during this job.
		desiredJob.setEnum(Coefficient.HADOOP_VARIABLE_ALGORITHMS_KEY, Algorithms.valueOf(args[2]));

		// If the arguments array is missing the fourth offset use the faster approach by default.
		switch (args.length != 4 ? Coefficient.DEFAULT_APPROACH : Approaches.valueOf(args[3])) {
		case i:
		case inplace:
			desiredJob = getInPlaceJobConf(desiredJob, args[0], conf);
			break;
		case p:
		case preparation:
		default:
			desiredJob = getPreparationJobConf(desiredJob, args[0], conf);
			break;
		}

		return desiredJob;
	}