private void mergeSplitAndCopyBulkloadedHFiles(List<String> activeFiles,
    List<String> archiveFiles, TableName tn, FileSystem tgtFs) throws IOException {
    int attempt = 1;

    while (!activeFiles.isEmpty()) {
      LOG.info("MergeSplit {} active bulk loaded files. Attempt={}", activeFiles.size(), attempt++);
      // Active file can be archived during copy operation,
      // we need to handle this properly
      try {
        mergeSplitAndCopyBulkloadedHFiles(activeFiles, tn, tgtFs);
        break;
      } catch (IOException e) {
        int numActiveFiles = activeFiles.size();
        updateFileLists(activeFiles, archiveFiles);
        if (activeFiles.size() < numActiveFiles) {
          continue;
        }

        throw e;
      }
    }

    if (!archiveFiles.isEmpty()) {
      mergeSplitAndCopyBulkloadedHFiles(archiveFiles, tn, tgtFs);
    }
  }
Reads bulk load records from backup table, iterates through the records and forms the paths for
bulk loaded hfiles. Copies the bulk loaded hfiles to backup destination. This method does NOT
clean up the entries in the bulk load system table. Those entries should not be cleaned until
the backup is marked as complete.
@param tablesToBackup list of tables to be backed up
hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/impl/IncrementalTableBackupClient.java