code: public Flow getFlow(String cluster, String user, String appId, long runId,
        boolean populateTasks) throws IOException {
      Flow flow = null;
  
      byte[] startRow = ByteUtil.join(Constants.SEP_BYTES, Bytes.toBytes(cluster),
          Bytes.toBytes(user), Bytes.toBytes(appId),
          Bytes.toBytes(FlowKey.encodeRunId(runId)), Constants.EMPTY_BYTES);
  
      LOG.info(
          "Reading job_history rows start at " + Bytes.toStringBinary(startRow));
      Scan scan = new Scan();
      // start scanning history at cluster!user!app!run!
      scan.setStartRow(startRow);
      // require that all results match this flow prefix
      scan.setFilter(new WhileMatchFilter(new PrefixFilter(startRow)));
  
      List<Flow> flows = createFromResults(scan, populateTasks, 1);
      if (flows.size() > 0) {
        flow = flows.get(0);
      }
  
      return flow;
    }
docs: Returns the {@link Flow} instance matching the application ID and run ID.
  
  @param cluster the cluster identifier
  @param user the user running the jobs
  @param appId the application description
  @param runId the specific run ID for the flow
  @param populateTasks whether or not to populate the task details for each
  job
  @return