docs: private Frame reBalance(final Frame fr, boolean local) {
      int chunks = (int)Math.min( 4 * H2O.NUMCPUS * (local ? 1 : H2O.CLOUD.size()), fr.numRows());
      if (fr.anyVec().nChunks() > chunks && !reproducible) {
        Log.info("Dataset already contains " + fr.anyVec().nChunks() + " chunks. No need to rebalance.");
        return fr;
      } else if (reproducible) {
        Log.warn("Reproducibility enforced - using only 1 thread - can be slow.");
        chunks = 1;
      }
      if (!quiet_mode) Log.info("ReBalancing dataset into (at least) " + chunks + " chunks.");
  //      return MRUtils.shuffleAndBalance(fr, chunks, seed, local, shuffle_training_data);
      String snewKey = fr._key != null ? (fr._key.toString() + ".balanced") : Key.rand();
      Key newKey = Key.makeSystem(snewKey);
      RebalanceDataSet rb = new RebalanceDataSet(fr, newKey, chunks);
      H2O.submitTask(rb);
      rb.join();
      return UKV.get(newKey);
    }