package com.github.elazarl.multireducers; import org.apache.hadoop.mapreduce.JobContext; import org.apache.hadoop.mapreduce.JobStatus; import org.apache.hadoop.mapreduce.OutputCommitter; import org.apache.hadoop.mapreduce.TaskAttemptContext; import java.io.IOException; import java.util.List; /** * MultiOutputCommitter would commit multiple committers together. */ class MultiOutputCommitter extends OutputCommitter { private List<OutputCommitter> committers; public MultiOutputCommitter(List<OutputCommitter> committers) { this.committers = committers; } @Override public void setupJob(JobContext jobContext) throws IOException { for(OutputCommitter committer: committers){ committer.setupJob(jobContext); } } @Override public void commitJob(JobContext jobContext) throws IOException { for(OutputCommitter committer: committers){ committer.commitJob(jobContext); } } // we need to support deprecated API too... @SuppressWarnings("deprecation") @Override public void cleanupJob(JobContext context) throws IOException { for(OutputCommitter committer: committers){ committer.cleanupJob(context); } } @Override public void abortJob(JobContext jobContext, JobStatus.State state) throws IOException { boolean success = true; for(OutputCommitter committer: committers){ try{ committer.abortJob(jobContext,state); }catch (Exception e) { e.printStackTrace(); success = false; } } if(!success){ throw new RuntimeException("failures occur while abort job"); } } @Override public void setupTask(TaskAttemptContext taskContext) throws IOException { for(OutputCommitter committer: committers){ committer.setupTask(taskContext); } } @Override public boolean needsTaskCommit(TaskAttemptContext taskContext) throws IOException { return true; } @Override public void commitTask(TaskAttemptContext taskContext) throws IOException { for(OutputCommitter committer: committers){ committer.commitTask(taskContext); } } @Override public void abortTask(TaskAttemptContext taskContext) throws IOException { boolean success = true; for(OutputCommitter committer: committers){ try{ committer.abortTask(taskContext); }catch (Exception e) { e.printStackTrace(); success = false; } } if(!success){ throw new RuntimeException("failures occur while abort task"); } } }