code: boolean processRecords(Configuration conf, Connection hbaseConnection,
        String cluster, int batchSize, int threadCount,
        String processFileSubstring) throws IOException, InterruptedException,
        ClassNotFoundException, ExecutionException, RowKeyParseException {
  
      List<ProcessRecord> processRecords =
          getProcessRecords(conf, hbaseConnection, cluster, processFileSubstring);
  
      // Bail out early if needed
      if ((processRecords == null) || (processRecords.size() == 0)) {
        return true;
      }
  
      // Grab the min and the max jobId from all processing records.
      MinMaxJobFileTracker minMaxJobFileTracker = new MinMaxJobFileTracker();
  
      for (ProcessRecord processRecord : processRecords) {
        minMaxJobFileTracker.track(processRecord.getMinJobId());
        minMaxJobFileTracker.track(processRecord.getMaxJobId());
      }
  
      List<JobRunner> jobRunners = getJobRunners(conf, hbaseConnection, cluster, false, batchSize,
          minMaxJobFileTracker.getMinJobId(), minMaxJobFileTracker.getMaxJobId());
  
      boolean success = runJobs(threadCount, jobRunners);
      if (success) {
        updateProcessRecords(conf, hbaseConnection, processRecords);
      }
  
      return success;
    }
docs: Pick up the ranges of jobs to process from ProcessRecords. Skip raw rows
  that have already been processed.
  
  @param conf used to contact HBase and to run jobs against
  @param hbaseConnection
  @param cluster for which to process records.
  @param batchSize the total number of jobs to process in a batch (a MR job
  scanning these many records in the raw table).
  @param threadCount how many parallel threads should be used to run Hadoop
  jobs in parallel.
  @param processFileSubstring Use only process records where the process file
  path contains this string. If <code>null</code> or empty string,
  then no filtering is applied.
  @return whether all job files for all processRecords were properly
  processed.
  @throws IOException
  @throws ClassNotFoundException when problems occur setting up the job.
  @throws InterruptedException
  @throws ExecutionException when at least one of the jobs could not be
  scheduled.
  @throws RowKeyParseException