code: private MergingReader<ByteBuffer, ByteBuffer> createReaderForShard(
        Marshaller<KeyValue<ByteBuffer, ? extends Iterable<ByteBuffer>>> marshaller,
        GoogleCloudStorageFileSet inputFileSet) {
      ArrayList<PeekingInputReader<KeyValue<ByteBuffer, ? extends Iterable<ByteBuffer>>>> inputFiles =
          new ArrayList<>();
      GoogleCloudStorageLevelDbInput reducerInput =
          new GoogleCloudStorageLevelDbInput(inputFileSet, DEFAULT_IO_BUFFER_SIZE);
      for (InputReader<ByteBuffer> in : reducerInput.createReaders()) {
        inputFiles.add(new PeekingInputReader<>(in, marshaller));
      }
      return new MergingReader<>(inputFiles, Marshallers.getByteBufferMarshaller(), false);
    }
docs: Create a {@link MergingReader} that combines all the input files and maintain sort order.
  
  (There are multiple input files in the event that the data didn't fit into the sorter's
  memory)
  
  A {@link MergingReader} is used to combine contents while maintaining key-order. This requires
  a {@link PeekingInputReader}s to preview the next item of input.
  
  @returns a reader producing key-sorted input for a shard.