// If not in cache, create a new one
if(context == null) {
context = new OutputContext();
OutputFormat mainOutputFormat;
try {
mainOutputFormat = ((OutputFormat) ReflectionUtils.newInstance(
this.context.getOutputFormatClass(), this.context.getConfiguration()));
} catch(ClassNotFoundException e1) {
throw new RuntimeException(e1);
}
ProxyOutputCommitter baseOutputCommitter = ((ProxyOutputCommitter) mainOutputFormat
.getOutputCommitter(this.context));
// The trick is to create a new Job for each output
Job job = new Job(this.context.getConfiguration());
job.setOutputKeyClass(getNamedOutputKeyClass(this.context, baseFileName));
job.setOutputValueClass(getNamedOutputValueClass(this.context, baseFileName));
// Check possible specific context for the output
setSpecificNamedOutputContext(this.context.getConfiguration(), job, baseFileName);
TaskAttemptContext taskContext = new TaskAttemptContext(job.getConfiguration(),
this.context.getTaskAttemptID());
// First we change the output dir for the new OutputFormat that we will
// create
// We put it inside the main output work path -> in case the Job fails,
// everything will be discarded
taskContext.getConfiguration().set("mapred.output.dir",
baseOutputCommitter.getBaseDir() + "/" + baseFileName);
context.taskAttemptContext = taskContext;
// Load the OutputFormat instance
OutputFormat outputFormat = InstancesDistributor.loadInstance(
context.taskAttemptContext.getConfiguration(), OutputFormat.class,
getNamedOutputFormatInstanceFile(this.context, baseFileName), true);
// We have to create a JobContext for meeting the contract of the
// OutputFormat
JobContext jobContext = new JobContext(taskContext.getConfiguration(),
taskContext.getJobID());
context.jobContext = jobContext;
// The contract of the OutputFormat is to check the output specs
outputFormat.checkOutputSpecs(jobContext);
// We get the output committer so we can call it later
context.outputCommitter = outputFormat.getOutputCommitter(taskContext);
// Save the RecordWriter to cache it
context.recordWriter = outputFormat.getRecordWriter(taskContext);
// if counters are enabled, wrap the writer with context
// to increment counters
if(countersEnabled) {
context.recordWriter = new RecordWriterWithCounter(context.recordWriter,