code: private void createSegment() throws IOException {
          segmentsAttempted = 0;
          bytesWritten = 0;
          boolean success = false;
  
          while (!success) {
              Path path = workOutputPath.suffix(String.format(extensionFormat, segmentsCreated, segmentsAttempted));
              FileSystem fs = path.getFileSystem(conf);
  
              try {
                  // The o.a.h.mapred OutputFormats overwrite existing files, whereas
                  // the o.a.h.mapreduce OutputFormats don't overwrite. Bizarre...
                  // Here, overwrite if progress != null, i.e. if using mapred API.
                  FSDataOutputStream fsStream = (progress == null) ? fs.create(path, false): fs.create(path, progress);
                  byteStream = new CountingOutputStream(new BufferedOutputStream(fsStream));
                  dataStream = new DataOutputStream(codec == null ? byteStream : codec.createOutputStream(byteStream));
                  segmentsCreated++;
                  logger.info("Writing to output file: {}", path);
                  success = true;
  
              } catch (IOException e) {
                  if (e.getMessage().startsWith("File already exists")) {
                      logger.warn("Tried to create file {} but it already exists; retrying.", path);
                      segmentsAttempted++; // retry
                  } else {
                      throw e;
                  }
              }
          }
      }
docs: Creates an output segment file and sets up the output streams to point at it.
  If the file already exists, retries with a different filename. This is a bit nasty --
  after all, {@link FileOutputFormat}'s work directory concept is supposed to prevent
  filename clashes -- but it looks like Amazon Elastic MapReduce prevents use of per-task
  work directories if the output of a job is on S3.
  
  TODO: Investigate this and find a better solution.