From 558cc8c0bfb7f521c09e6e99cb47cb4acec9f7c9 Mon Sep 17 00:00:00 2001 From: Vinod Kumar Vavilapalli Date: Fri, 9 Mar 2012 21:13:42 +0000 Subject: [PATCH] MAPREDUCE-3982. Fixed FileOutputCommitter to not err out for an 'empty-job' whose tasks don't write any outputs. Contributed by Robert Joseph Evans. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1299047 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-mapreduce-project/CHANGES.txt | 3 +++ .../lib/output/FileOutputCommitter.java | 8 +++---- .../lib/output/TestFileOutputCommitter.java | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index de5b703ba6..eadc1dd143 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -304,6 +304,9 @@ Release 0.23.2 - UNRELEASED MAPREDUCE-3975. Default value not set for Configuration parameter mapreduce.job.local.dir (Eric Payne via bobby) + MAPREDUCE-3982. Fixed FileOutputCommitter to not err out for an 'empty-job' + whose tasks don't write any outputs. (Robert Joseph Evans via vinodkv) + Release 0.23.1 - 2012-02-17 INCOMPATIBLE CHANGES diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/output/FileOutputCommitter.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/output/FileOutputCommitter.java index 7bad09f303..9ad310c4b1 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/output/FileOutputCommitter.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapreduce/lib/output/FileOutputCommitter.java @@ -278,11 +278,11 @@ public class FileOutputCommitter extends OutputCommitter { */ public void setupJob(JobContext context) throws IOException { if (hasOutputPath()) { - Path pendingJobAttemptsPath = getPendingJobAttemptsPath(); - FileSystem fs = pendingJobAttemptsPath.getFileSystem( + Path jobAttemptPath = getJobAttemptPath(context); + FileSystem fs = jobAttemptPath.getFileSystem( context.getConfiguration()); - if (!fs.mkdirs(pendingJobAttemptsPath)) { - LOG.error("Mkdirs failed to create " + pendingJobAttemptsPath); + if (!fs.mkdirs(jobAttemptPath)) { + LOG.error("Mkdirs failed to create " + jobAttemptPath); } } else { LOG.warn("Output Path is null in setupJob()"); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/lib/output/TestFileOutputCommitter.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/lib/output/TestFileOutputCommitter.java index c7d4e51bd2..74ea971301 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/lib/output/TestFileOutputCommitter.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/lib/output/TestFileOutputCommitter.java @@ -122,6 +122,28 @@ public class TestFileOutputCommitter extends TestCase { assertEquals(output, expectedOutput.toString()); FileUtil.fullyDelete(new File(outDir.toString())); } + + public void testEmptyOutput() throws Exception { + Job job = Job.getInstance(); + FileOutputFormat.setOutputPath(job, outDir); + Configuration conf = job.getConfiguration(); + conf.set(MRJobConfig.TASK_ATTEMPT_ID, attempt); + JobContext jContext = new JobContextImpl(conf, taskID.getJobID()); + TaskAttemptContext tContext = new TaskAttemptContextImpl(conf, taskID); + FileOutputCommitter committer = new FileOutputCommitter(outDir, tContext); + + // setup + committer.setupJob(jContext); + committer.setupTask(tContext); + + // Do not write any output + + // do commit + committer.commitTask(tContext); + committer.commitJob(jContext); + + FileUtil.fullyDelete(new File(outDir.toString())); + } @SuppressWarnings("unchecked") public void testAbort() throws IOException, InterruptedException {