This is an automated email from the ASF dual-hosted git repository.

ljain pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new ac99b47  HDDS-5927. Improve defaults in ContainerBalancerConfiguration 
(#2892)
ac99b47 is described below

commit ac99b47bba4b381f60fd0d414a02e83f0cab1d0b
Author: Siddhant Sangwan <[email protected]>
AuthorDate: Wed Jan 12 12:11:33 2022 +0530

    HDDS-5927. Improve defaults in ContainerBalancerConfiguration (#2892)
---
 .../apache/hadoop/hdds/scm/client/ScmClient.java   |   4 +-
 .../protocol/StorageContainerLocationProtocol.java |   4 +-
 ...inerLocationProtocolClientSideTranslatorPB.java |  34 +++---
 .../src/main/proto/ScmAdminProtocol.proto          |   7 +-
 .../scm/container/balancer/ContainerBalancer.java  |  39 ++++---
 .../balancer/ContainerBalancerConfiguration.java   | 127 ++++++++++++---------
 ...inerLocationProtocolServerSideTranslatorPB.java |  29 +++--
 .../hdds/scm/server/SCMClientProtocolServer.java   |  38 +++---
 .../container/balancer/TestContainerBalancer.java  |  76 ++++++------
 .../hdds/scm/cli/ContainerBalancerCommands.java    |  19 ++-
 .../scm/cli/ContainerBalancerStartSubcommand.java  |  50 ++++----
 .../hdds/scm/cli/ContainerOperationClient.java     |   6 +-
 .../datanode/TestContainerBalancerSubCommand.java  |   8 +-
 .../ozone/TestContainerBalancerOperations.java     |  19 +--
 14 files changed, 249 insertions(+), 211 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
index 351870a..342a3e7 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/client/ScmClient.java
@@ -312,8 +312,8 @@ public interface ScmClient extends Closeable {
    * Start ContainerBalancer.
    */
   boolean startContainerBalancer(Optional<Double> threshold,
-      Optional<Integer> idleiterations,
-      Optional<Double> maxDatanodesRatioToInvolvePerIteration,
+      Optional<Integer> iterations,
+      Optional<Integer> maxDatanodesPercentageToInvolvePerIteration,
       Optional<Long> maxSizeToMovePerIterationInGB,
       Optional<Long> maxSizeEnteringTargetInGB,
       Optional<Long> maxSizeLeavingSourceInGB) throws IOException;
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
index a6b9805..264a599 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
@@ -312,8 +312,8 @@ public interface StorageContainerLocationProtocol extends 
Closeable {
    * Start ContainerBalancer.
    */
   boolean startContainerBalancer(Optional<Double> threshold,
-      Optional<Integer> idleiterations,
-      Optional<Double> maxDatanodesRatioToInvolvePerIteration,
+      Optional<Integer> iterations,
+      Optional<Integer> maxDatanodesPercentageToInvolvePerIteration,
       Optional<Long> maxSizeToMovePerIterationInGB,
       Optional<Long> maxSizeEnteringTargetInGB,
       Optional<Long> maxSizeLeavingSourceInGB) throws IOException;
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
index 6e5bcf1..b745822 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
@@ -739,8 +739,8 @@ public final class 
StorageContainerLocationProtocolClientSideTranslatorPB
 
   @Override
   public boolean startContainerBalancer(
-      Optional<Double> threshold, Optional<Integer> idleiterations,
-      Optional<Double> maxDatanodesRatioToInvolvePerIteration,
+      Optional<Double> threshold, Optional<Integer> iterations,
+      Optional<Integer> maxDatanodesPercentageToInvolvePerIteration,
       Optional<Long> maxSizeToMovePerIterationInGB,
       Optional<Long> maxSizeEnteringTargetInGB,
       Optional<Long> maxSizeLeavingSourceInGB) throws IOException{
@@ -751,8 +751,8 @@ public final class 
StorageContainerLocationProtocolClientSideTranslatorPB
     //make balancer configuration optional
     if (threshold.isPresent()) {
       double tsd = threshold.get();
-      Preconditions.checkState(tsd >= 0.0D && tsd < 1.0D,
-          "threshold should to be specified in range [0.0, 1.0).");
+      Preconditions.checkState(tsd >= 0.0D && tsd < 100D,
+          "threshold should be specified in range [0.0, 100.0).");
       builder.setThreshold(tsd);
     }
     if (maxSizeToMovePerIterationInGB.isPresent()) {
@@ -761,22 +761,22 @@ public final class 
StorageContainerLocationProtocolClientSideTranslatorPB
           "maxSizeToMovePerIterationInGB must be positive.");
       builder.setMaxSizeToMovePerIterationInGB(mstm);
     }
-    if (maxDatanodesRatioToInvolvePerIteration.isPresent()) {
-      double mdti = maxDatanodesRatioToInvolvePerIteration.get();
+    if (maxDatanodesPercentageToInvolvePerIteration.isPresent()) {
+      int mdti = maxDatanodesPercentageToInvolvePerIteration.get();
       Preconditions.checkState(mdti >= 0,
-          "maxDatanodesRatioToInvolvePerIteration must be " +
+          "maxDatanodesPercentageToInvolvePerIteration must be " +
               "greater than equal to zero.");
-      Preconditions.checkState(mdti <= 1,
-          "maxDatanodesRatioToInvolvePerIteration must be " +
-              "lesser than equal to one.");
-      builder.setMaxDatanodesRatioToInvolvePerIteration(mdti);
+      Preconditions.checkState(mdti <= 100,
+          "maxDatanodesPercentageToInvolvePerIteration must be " +
+              "lesser than equal to hundred.");
+      builder.setMaxDatanodesPercentageToInvolvePerIteration(mdti);
     }
-    if (idleiterations.isPresent()) {
-      int idi = idleiterations.get();
-      Preconditions.checkState(idi > 0 || idi == -1,
-          "idleiterations must be positive or" +
-              " -1(infinitly run container balancer).");
-      builder.setIdleiterations(idi);
+    if (iterations.isPresent()) {
+      int i = iterations.get();
+      Preconditions.checkState(i > 0 || i == -1,
+          "number of iterations must be positive or" +
+              " -1 (for running container balancer infinitely).");
+      builder.setIterations(i);
     }
 
     if (maxSizeEnteringTargetInGB.isPresent()) {
diff --git a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto 
b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
index 3211d51..f8c6aa7 100644
--- a/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
+++ b/hadoop-hdds/interface-admin/src/main/proto/ScmAdminProtocol.proto
@@ -489,11 +489,14 @@ message GetContainerTokenResponseProto {
 message StartContainerBalancerRequestProto {
   optional string traceID = 1;
   optional double threshold = 2;
-  optional int32 idleiterations = 3;
-  optional double maxDatanodesRatioToInvolvePerIteration = 4;
+  optional int32 idleiterations = 3 [deprecated = true];
+  optional double maxDatanodesRatioToInvolvePerIteration = 4 [deprecated =
+      true];
   optional int64 maxSizeToMovePerIterationInGB = 5;
   optional int64 maxSizeEnteringTargetInGB = 6;
   optional int64 maxSizeLeavingSourceInGB = 7;
+  optional int32 maxDatanodesPercentageToInvolvePerIteration = 8;
+  optional int32 iterations = 9;
 }
 
 message StartContainerBalancerResponseProto {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
index cf3781f..ea32cfa 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
@@ -74,7 +74,7 @@ public class ContainerBalancer {
   private long maxSizeToMovePerIteration;
   private int countDatanodesInvolvedPerIteration;
   private long sizeMovedPerIteration;
-  private int idleIteration;
+  private int iterations;
   private List<DatanodeUsageInfo> unBalancedNodes;
   private List<DatanodeUsageInfo> overUtilizedNodes;
   private List<DatanodeUsageInfo> underUtilizedNodes;
@@ -159,6 +159,7 @@ public class ContainerBalancer {
       if (!validateConfiguration(config)) {
         return false;
       }
+      ozoneConfiguration.setFromObject(balancerConfiguration);
       balancerRunning = true;
       LOG.info("Starting Container Balancer...{}", this);
 
@@ -178,23 +179,12 @@ public class ContainerBalancer {
    * Balances the cluster.
    */
   private void balance() {
-    this.idleIteration = config.getIdleIteration();
-    if(this.idleIteration == -1) {
+    this.iterations = config.getIterations();
+    if(this.iterations == -1) {
       //run balancer infinitely
-      this.idleIteration = Integer.MAX_VALUE;
+      this.iterations = Integer.MAX_VALUE;
     }
-    this.threshold = config.getThreshold();
-    this.maxDatanodesRatioToInvolvePerIteration =
-        config.getMaxDatanodesRatioToInvolvePerIteration();
-    this.maxSizeToMovePerIteration = config.getMaxSizeToMovePerIteration();
-    if (config.getNetworkTopologyEnable()) {
-      findTargetStrategy = new FindTargetGreedyByNetworkTopology(
-          containerManager, placementPolicy, nodeManager, networkTopology);
-    } else {
-      findTargetStrategy = new FindTargetGreedyByUsageInfo(containerManager,
-          placementPolicy, nodeManager);
-    }
-    for (int i = 0; i < idleIteration && balancerRunning; i++) {
+    for (int i = 0; i < iterations && balancerRunning; i++) {
       // stop balancing if iteration is not initialized
       if (!initializeIteration()) {
         stop();
@@ -217,7 +207,7 @@ public class ContainerBalancer {
 
       // wait for configured time before starting next iteration, unless
       // this was the final iteration
-      if (i != idleIteration - 1) {
+      if (i != iterations - 1) {
         synchronized (this) {
           try {
             wait(config.getBalancingInterval().toMillis());
@@ -259,6 +249,17 @@ public class ContainerBalancer {
       }
       return false;
     }
+    this.threshold = config.getThresholdAsRatio();
+    this.maxDatanodesRatioToInvolvePerIteration =
+        config.getMaxDatanodesRatioToInvolvePerIteration();
+    this.maxSizeToMovePerIteration = config.getMaxSizeToMovePerIteration();
+    if (config.getNetworkTopologyEnable()) {
+      findTargetStrategy = new FindTargetGreedyByNetworkTopology(
+          containerManager, placementPolicy, nodeManager, networkTopology);
+    } else {
+      findTargetStrategy = new FindTargetGreedyByUsageInfo(containerManager,
+          placementPolicy, nodeManager);
+    }
     this.excludeNodes = config.getExcludeNodes();
     this.includeNodes = config.getIncludeNodes();
     // include/exclude nodes from balancing according to configs
@@ -522,7 +523,7 @@ public class ContainerBalancer {
   }
 
   /**
-   * Checks if limits maxDatanodesRatioToInvolvePerIteration and
+   * Checks if limits maxDatanodesPercentageToInvolvePerIteration and
    * maxSizeToMovePerIteration have not been hit.
    *
    * @return {@link IterationResult#MAX_DATANODES_TO_INVOLVE_REACHED} if 
reached
@@ -872,7 +873,7 @@ public class ContainerBalancer {
     return countDatanodesInvolvedPerIteration;
   }
 
-  long getSizeMovedPerIteration() {
+  public long getSizeMovedPerIteration() {
     return sizeMovedPerIteration;
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
index a51e0bd..8582347 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
@@ -43,27 +43,25 @@ public final class ContainerBalancerConfiguration {
       LoggerFactory.getLogger(ContainerBalancerConfiguration.class);
 
   @Config(key = "utilization.threshold", type = ConfigType.AUTO, defaultValue =
-      "0.1", tags = {ConfigTag.BALANCER},
-      description = "Threshold is a fraction in the range of 0 to 1. A " +
+      "10", tags = {ConfigTag.BALANCER},
+      description = "Threshold is a percentage in the range of 0 to 100. A " +
           "cluster is considered balanced if for each datanode, the " +
           "utilization of the datanode (used space to capacity ratio) differs" 
+
           " from the utilization of the cluster (used space to capacity ratio" 
+
-          " of the entire cluster) no more than the threshold value.")
-  private String threshold = "0.1";
+          " of the entire cluster) no more than the threshold.")
+  private String threshold = "10";
 
-  @Config(key = "datanodes.involved.max.ratio.per.iteration", type =
-      ConfigType.AUTO,
-      defaultValue = "0.2", tags = {ConfigTag.BALANCER}, description = "The " +
-      "ratio of maximum number of datanodes that should be involved in " +
-      "balancing in one iteration to the total number of healthy, in service " 
+
-      "nodes known to container balancer.")
-  private String maxDatanodesRatioToInvolvePerIteration = "0.2";
+  @Config(key = "datanodes.involved.max.percentage.per.iteration", type =
+      ConfigType.INT, defaultValue = "20", tags = {ConfigTag.BALANCER},
+      description = "Maximum percentage of healthy, in service datanodes " +
+          "that can be involved in balancing in one iteration.")
+  private int maxDatanodesPercentageToInvolvePerIteration = 20;
 
   @Config(key = "size.moved.max.per.iteration", type = ConfigType.SIZE,
-      defaultValue = "30GB", tags = {ConfigTag.BALANCER},
+      defaultValue = "500GB", tags = {ConfigTag.BALANCER},
       description = "The maximum size of data in bytes that will be moved " +
           "by Container Balancer in one iteration.")
-  private long maxSizeToMovePerIteration = 30 * OzoneConsts.GB;
+  private long maxSizeToMovePerIteration = 500 * OzoneConsts.GB;
 
   @Config(key = "size.entering.target.max", type = ConfigType.SIZE,
       defaultValue = "26GB", tags = {ConfigTag.BALANCER}, description = "The " 
+
@@ -81,10 +79,11 @@ public final class ContainerBalancerConfiguration {
       " (or default) ozone.scm.container.size.")
   private long maxSizeLeavingSource;
 
-  @Config(key = "idle.iterations", type = ConfigType.INT,
+  @Config(key = "iterations", type = ConfigType.INT,
       defaultValue = "10", tags = {ConfigTag.BALANCER},
-      description = "The idle iteration count of Container Balancer.")
-  private int idleIterations = 10;
+      description = "The number of iterations that Container Balancer will " +
+          "run for.")
+  private int iterations = 10;
 
   @Config(key = "exclude.containers", type = ConfigType.STRING, defaultValue =
       "", tags = {ConfigTag.BALANCER}, description = "List of container IDs " +
@@ -93,7 +92,7 @@ public final class ContainerBalancerConfiguration {
 
   @Config(key = "move.timeout", type = ConfigType.TIME, defaultValue = "30m",
       tags = {ConfigTag.BALANCER}, description =
-      "The amount of time in minutes to allow a single container to move " +
+      "The amount of time to allow a single container to move " +
           "from source to target.")
   private long moveTimeout = Duration.ofMinutes(30).toMillis();
 
@@ -101,7 +100,7 @@ public final class ContainerBalancerConfiguration {
       defaultValue = "70m", tags = {
       ConfigTag.BALANCER}, description = "The interval period between each " +
       "iteration of Container Balancer.")
-  private long balancingInterval;
+  private long balancingInterval = Duration.ofMinutes(70).toMillis();
 
   @Config(key = "include.datanodes", type = ConfigType.STRING, defaultValue =
       "", tags = {ConfigTag.BALANCER}, description = "A list of Datanode " +
@@ -127,46 +126,61 @@ public final class ContainerBalancerConfiguration {
   /**
    * Gets the threshold value for Container Balancer.
    *
-   * @return a fraction in the range 0 to 1
+   * @return percentage value in the range 0 to 100
    */
   public double getThreshold() {
     return Double.parseDouble(threshold);
   }
 
+  public double getThresholdAsRatio() {
+    return Double.parseDouble(threshold) / 100;
+  }
+
   /**
    * Sets the threshold value for Container Balancer.
    *
-   * @param threshold a fraction in the range 0 to 1
+   * @param threshold a percentage value in the range 0 to 100
    */
   public void setThreshold(double threshold) {
-    if (threshold < 0 || threshold > 1) {
+    if (threshold < 0d || threshold >= 100d) {
       throw new IllegalArgumentException(
-          "Threshold must be a fraction in the range 0 to 1.");
+          "Threshold must be a percentage(double) in the range 0 to 100.");
     }
     this.threshold = String.valueOf(threshold);
   }
 
   /**
-   * Gets the idle iteration value for Container Balancer.
+   * Gets the iteration count for Container Balancer. A value of -1 means
+   * infinite number of iterations.
    *
-   * @return a idle iteration count larger than 0
+   * @return a value greater than 0, or -1
    */
-  public int getIdleIteration() {
-    return idleIterations;
+  public int getIterations() {
+    return iterations;
   }
 
   /**
-   * Sets the idle iteration value for Container Balancer.
+   * Sets the number of iterations for Container Balancer.
    *
-   * @param count a idle iteration count larger than 0
+   * @param count a value greater than 0, or -1 for running balancer infinitely
    */
-  public void setIdleIteration(int count) {
+  public void setIterations(int count) {
     if (count < -1 || 0 == count) {
       throw new IllegalArgumentException(
-          "Idle iteration count must be larger than 0 or " +
-              "-1(for infinitely running).");
+          "Iteration count must be greater than 0, or " +
+              "-1(for running balancer infinitely).");
     }
-    this.idleIterations = count;
+    this.iterations = count;
+  }
+
+  /**
+   * Gets the maximum percentage of healthy, in-service datanodes that will be
+   * involved in balancing in one iteration.
+   *
+   * @return percentage as an integer from 0 up to and including 100
+   */
+  public int getMaxDatanodesPercentageToInvolvePerIteration() {
+    return maxDatanodesPercentageToInvolvePerIteration;
   }
 
   /**
@@ -188,37 +202,36 @@ public final class ContainerBalancerConfiguration {
   }
 
   /**
-   * Gets the ratio of maximum number of datanodes that will be involved in
-   * balancing by Container Balancer in one iteration to the total number of
-   * healthy, in-service nodes known to balancer.
+   * Gets the ratio of maximum datanodes involved in balancing to the total
+   * number of healthy, in-service datanodes known to SCM.
    *
-   * @return maximum datanodes to involve divided by total healthy,
-   * in-service nodes
+   * @return ratio as a double from 0 up to and including 1
    */
   public double getMaxDatanodesRatioToInvolvePerIteration() {
-    return Double.parseDouble(maxDatanodesRatioToInvolvePerIteration);
+    return maxDatanodesPercentageToInvolvePerIteration / 100d;
   }
 
   /**
-   * Sets the ratio of maximum number of datanodes that will be involved in
-   * balancing by Container Balancer in one iteration to the total number of
-   * healthy, in-service nodes known to balancer.
+   * Sets the maximum percentage of healthy, in-service datanodes that will be
+   * involved in balancing in one iteration.
    *
-   * @param maxDatanodesRatioToInvolvePerIteration number of datanodes to
-   *                                               involve divided by total
-   *                                               number of healthy, in
-   *                                               service nodes
+   * @param maxDatanodesPercentageToInvolvePerIteration number of datanodes
+   *                                                    to involve divided by
+   *                                                    total number of
+   *                                                    healthy, in-service
+   *                                                    datanodes multiplied
+   *                                                    by 100
    */
-  public void setMaxDatanodesRatioToInvolvePerIteration(
-      double maxDatanodesRatioToInvolvePerIteration) {
-    if (maxDatanodesRatioToInvolvePerIteration < 0 ||
-        maxDatanodesRatioToInvolvePerIteration > 1) {
-      throw new IllegalArgumentException("Max datanodes to involve ratio must" 
+
-          " be a double greater than equal to zero and lesser than equal to " +
-          "one.");
+  public void setMaxDatanodesPercentageToInvolvePerIteration(
+      int maxDatanodesPercentageToInvolvePerIteration) {
+    if (maxDatanodesPercentageToInvolvePerIteration < 0 ||
+        maxDatanodesPercentageToInvolvePerIteration > 100) {
+      throw new IllegalArgumentException(String.format("Argument %d is " +
+              "illegal. Percentage must be from 0 up to and including 100.",
+          maxDatanodesPercentageToInvolvePerIteration));
     }
-    this.maxDatanodesRatioToInvolvePerIteration =
-        String.valueOf(maxDatanodesRatioToInvolvePerIteration);
+    this.maxDatanodesPercentageToInvolvePerIteration =
+        maxDatanodesPercentageToInvolvePerIteration;
   }
 
   /**
@@ -347,12 +360,12 @@ public final class ContainerBalancerConfiguration {
     return String.format("Container Balancer Configuration values:%n" +
             "%-50s %s%n" +
             "%-50s %s%n" +
-            "%-50s %s%n" +
+            "%-50s %d%n" +
             "%-50s %dGB%n"+
             "%-50s %dGB%n"+
             "%-50s %dGB%n", "Key", "Value", "Threshold",
-        threshold, "Max Datanodes to Involve per Iteration(ratio)",
-        maxDatanodesRatioToInvolvePerIteration,
+        threshold, "Max Datanodes to Involve per Iteration(percent)",
+        maxDatanodesPercentageToInvolvePerIteration,
         "Max Size to Move per Iteration",
         maxSizeToMovePerIteration / OzoneConsts.GB,
         "Max Size Entering Target per Iteration",
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
index 38be88a..b839e99 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
@@ -718,8 +718,9 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
       StartContainerBalancerRequestProto request)
       throws IOException {
     Optional<Double> threshold = Optional.empty();
-    Optional<Integer> idleiterations = Optional.empty();
-    Optional<Double> maxDatanodesRatioToInvolvePerIteration = Optional.empty();
+    Optional<Integer> iterations = Optional.empty();
+    Optional<Integer> maxDatanodesPercentageToInvolvePerIteration =
+        Optional.empty();
     Optional<Long> maxSizeToMovePerIterationInGB = Optional.empty();
     Optional<Long> maxSizeEnteringTargetInGB = Optional.empty();
     Optional<Long> maxSizeLeavingSourceInGB = Optional.empty();
@@ -727,13 +728,23 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
     if(request.hasThreshold()) {
       threshold = Optional.of(request.getThreshold());
     }
-    if(request.hasIdleiterations()) {
-      idleiterations = Optional.of(request.getIdleiterations());
+
+    if (request.hasIterations()) {
+      iterations = Optional.of(request.getIterations());
+    } else if (request.hasIdleiterations()) {
+      iterations = Optional.of(request.getIdleiterations());
     }
-    if(request.hasMaxDatanodesRatioToInvolvePerIteration()) {
-      maxDatanodesRatioToInvolvePerIteration =
-          Optional.of(request.getMaxDatanodesRatioToInvolvePerIteration());
+
+    if (request.hasMaxDatanodesPercentageToInvolvePerIteration()) {
+      maxDatanodesPercentageToInvolvePerIteration =
+          
Optional.of(request.getMaxDatanodesPercentageToInvolvePerIteration());
+    } else if (request.hasMaxDatanodesRatioToInvolvePerIteration()) {
+      maxDatanodesPercentageToInvolvePerIteration =
+          Optional.of(
+              (int) (request.getMaxDatanodesRatioToInvolvePerIteration() *
+                  100));
     }
+
     if(request.hasMaxSizeToMovePerIterationInGB()) {
       maxSizeToMovePerIterationInGB =
           Optional.of(request.getMaxSizeToMovePerIterationInGB());
@@ -747,11 +758,9 @@ public final class 
StorageContainerLocationProtocolServerSideTranslatorPB
           Optional.of(request.getMaxSizeLeavingSourceInGB());
     }
 
-
-
     return StartContainerBalancerResponseProto.newBuilder().
         setStart(impl.startContainerBalancer(threshold,
-            idleiterations, maxDatanodesRatioToInvolvePerIteration,
+            iterations, maxDatanodesPercentageToInvolvePerIteration,
             maxSizeToMovePerIterationInGB,
             maxSizeEnteringTargetInGB, maxSizeLeavingSourceInGB)).build();
   }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index 5e3da50..fa1d316 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -744,8 +744,8 @@ public class SCMClientProtocolServer implements
 
   @Override
   public boolean startContainerBalancer(
-      Optional<Double> threshold, Optional<Integer> idleiterations,
-      Optional<Double> maxDatanodesRatioToInvolvePerIteration,
+      Optional<Double> threshold, Optional<Integer> iterations,
+      Optional<Integer> maxDatanodesPercentageToInvolvePerIteration,
       Optional<Long> maxSizeToMovePerIterationInGB,
       Optional<Long> maxSizeEnteringTarget,
       Optional<Long> maxSizeLeavingSource) throws IOException {
@@ -754,8 +754,8 @@ public class SCMClientProtocolServer implements
         scm.getConfiguration().getObject(ContainerBalancerConfiguration.class);
     if (threshold.isPresent()) {
       double tsd = threshold.get();
-      Preconditions.checkState(tsd >= 0.0D && tsd < 1.0D,
-          "threshold should to be specified in range [0.0, 1.0).");
+      Preconditions.checkState(tsd >= 0.0D && tsd < 100.0D,
+          "threshold should be specified in range [0.0, 100.0).");
       cbc.setThreshold(tsd);
     }
     if (maxSizeToMovePerIterationInGB.isPresent()) {
@@ -764,22 +764,22 @@ public class SCMClientProtocolServer implements
           "maxSizeToMovePerIterationInGB must be positive.");
       cbc.setMaxSizeToMovePerIteration(mstm * OzoneConsts.GB);
     }
-    if (maxDatanodesRatioToInvolvePerIteration.isPresent()) {
-      double mdti = maxDatanodesRatioToInvolvePerIteration.get();
-      Preconditions.checkState(mdti >= 0.0,
-          "maxDatanodesRatioToInvolvePerIteration must be " +
+    if (maxDatanodesPercentageToInvolvePerIteration.isPresent()) {
+      int mdti = maxDatanodesPercentageToInvolvePerIteration.get();
+      Preconditions.checkState(mdti >= 0,
+          "maxDatanodesPercentageToInvolvePerIteration must be " +
               "greater than equal to zero.");
-      Preconditions.checkState(mdti <= 1,
-          "maxDatanodesRatioToInvolvePerIteration must be " +
-              "lesser than or equal to one.");
-      cbc.setMaxDatanodesRatioToInvolvePerIteration(mdti);
+      Preconditions.checkState(mdti <= 100,
+          "maxDatanodesPercentageToInvolvePerIteration must be " +
+              "lesser than or equal to 100.");
+      cbc.setMaxDatanodesPercentageToInvolvePerIteration(mdti);
     }
-    if (idleiterations.isPresent()) {
-      int idi = idleiterations.get();
-      Preconditions.checkState(idi > 0 || idi == -1,
-          "idleiterations must be positive or" +
-              " -1(infinitly run container balancer).");
-      cbc.setIdleIteration(idi);
+    if (iterations.isPresent()) {
+      int i = iterations.get();
+      Preconditions.checkState(i > 0 || i == -1,
+          "number of iterations must be positive or" +
+              " -1 (for running container balancer infinitely).");
+      cbc.setIterations(i);
     }
 
     if (maxSizeEnteringTarget.isPresent()) {
@@ -807,7 +807,7 @@ public class SCMClientProtocolServer implements
       AUDIT.logWriteFailure(buildAuditMessageForSuccess(
           SCMAction.START_CONTAINER_BALANCER, null));
     }
-    return  isStartedSuccessfully;
+    return isStartedSuccessfully;
   }
 
   @Override
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java
index 3ad6269..e6f32e0 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/TestContainerBalancer.java
@@ -105,9 +105,9 @@ public class TestContainerBalancer {
 
     balancerConfiguration =
         conf.getObject(ContainerBalancerConfiguration.class);
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setIdleIteration(1);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setIterations(1);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeEnteringTarget(50 * OzoneConsts.GB);
     conf.setFromObject(balancerConfiguration);
@@ -176,7 +176,7 @@ public class TestContainerBalancer {
 
     // check for random threshold values
     for (int i = 0; i < 50; i++) {
-      double randomThreshold = RANDOM.nextDouble();
+      double randomThreshold = RANDOM.nextDouble() * 100;
 
       balancerConfiguration.setThreshold(randomThreshold);
       containerBalancer.start(balancerConfiguration);
@@ -211,7 +211,7 @@ public class TestContainerBalancer {
    */
   @Test
   public void unBalancedNodesListShouldBeEmptyWhenClusterIsBalanced() {
-    balancerConfiguration.setThreshold(0.99);
+    balancerConfiguration.setThreshold(99.99);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -231,10 +231,12 @@ public class TestContainerBalancer {
    */
   @Test
   public void containerBalancerShouldObeyMaxDatanodesToInvolveLimit() {
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(0.3d);
+    int percent = 20;
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(
+        percent);
     balancerConfiguration.setMaxSizeToMovePerIteration(100 * OzoneConsts.GB);
-    balancerConfiguration.setThreshold(0.01);
-    balancerConfiguration.setIdleIteration(1);
+    balancerConfiguration.setThreshold(1);
+    balancerConfiguration.setIterations(1);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -246,7 +248,7 @@ public class TestContainerBalancer {
 
     Assert.assertFalse(
         containerBalancer.getCountDatanodesInvolvedPerIteration() >
-            (int) (0.3 * numberOfNodes));
+            (percent * numberOfNodes / 100));
     containerBalancer.stop();
   }
 
@@ -256,7 +258,7 @@ public class TestContainerBalancer {
     for (ContainerInfo containerInfo : cidToInfoMap.values()) {
       containerInfo.setState(HddsProtos.LifeCycleState.OPEN);
     }
-    balancerConfiguration.setThreshold(0.1);
+    balancerConfiguration.setThreshold(10);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -298,9 +300,9 @@ public class TestContainerBalancer {
 
   @Test
   public void containerBalancerShouldObeyMaxSizeToMoveLimit() {
-    balancerConfiguration.setThreshold(0.01);
+    balancerConfiguration.setThreshold(1);
     balancerConfiguration.setMaxSizeToMovePerIteration(10 * OzoneConsts.GB);
-    balancerConfiguration.setIdleIteration(1);
+    balancerConfiguration.setIterations(1);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -318,9 +320,9 @@ public class TestContainerBalancer {
 
   @Test
   public void targetDatanodeShouldNotAlreadyContainSelectedContainer() {
-    balancerConfiguration.setThreshold(0.1);
+    balancerConfiguration.setThreshold(10);
     balancerConfiguration.setMaxSizeToMovePerIteration(100 * OzoneConsts.GB);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -345,9 +347,9 @@ public class TestContainerBalancer {
 
   @Test
   public void containerMoveSelectionShouldFollowPlacementPolicy() {
-    balancerConfiguration.setThreshold(0.1);
+    balancerConfiguration.setThreshold(10);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     containerBalancer.start(balancerConfiguration);
 
     // waiting for balance completed.
@@ -387,8 +389,8 @@ public class TestContainerBalancer {
   @Test
   public void targetDatanodeShouldBeInServiceHealthy()
       throws NodeNotFoundException {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeEnteringTarget(50 * OzoneConsts.GB);
     containerBalancer.start(balancerConfiguration);
@@ -414,8 +416,8 @@ public class TestContainerBalancer {
 
   @Test
   public void selectedContainerShouldNotAlreadyHaveBeenSelected() {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeEnteringTarget(50 * OzoneConsts.GB);
 
@@ -440,8 +442,8 @@ public class TestContainerBalancer {
 
   @Test
   public void balancerShouldNotSelectConfiguredExcludeContainers() {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeEnteringTarget(50 * OzoneConsts.GB);
     balancerConfiguration.setExcludeContainers("1, 4, 5");
@@ -467,8 +469,8 @@ public class TestContainerBalancer {
 
   @Test
   public void balancerShouldObeyMaxSizeEnteringTargetLimit() {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0d);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
     balancerConfiguration.setMaxSizeToMovePerIteration(50 * OzoneConsts.GB);
 
     // no containers should be selected when the limit is zero
@@ -498,11 +500,11 @@ public class TestContainerBalancer {
 
   @Test
   public void testMetrics() {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setIdleIteration(1);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setIterations(1);
     balancerConfiguration.setMaxSizeEnteringTarget(10 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeToMovePerIteration(100 * OzoneConsts.GB);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
 
     containerBalancer.start(balancerConfiguration);
 
@@ -533,11 +535,11 @@ public class TestContainerBalancer {
    */
   @Test
   public void balancerShouldFollowExcludeAndIncludeDatanodesConfigurations() {
-    balancerConfiguration.setThreshold(0.1);
-    balancerConfiguration.setIdleIteration(1);
+    balancerConfiguration.setThreshold(10);
+    balancerConfiguration.setIterations(1);
     balancerConfiguration.setMaxSizeEnteringTarget(10 * OzoneConsts.GB);
     balancerConfiguration.setMaxSizeToMovePerIteration(100 * OzoneConsts.GB);
-    balancerConfiguration.setMaxDatanodesRatioToInvolvePerIteration(1.0);
+    balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);
 
     // only these nodes should be included
     // the ones also specified in excludeNodes should be excluded
@@ -588,28 +590,30 @@ public class TestContainerBalancer {
     OzoneConfiguration ozoneConfiguration = new OzoneConfiguration();
     ozoneConfiguration.set("ozone.scm.container.size", "5GB");
     ozoneConfiguration.setDouble(
-        "hdds.container.balancer.utilization.threshold", 0.01);
+        "hdds.container.balancer.utilization.threshold", 1);
 
     ContainerBalancerConfiguration cbConf =
         ozoneConfiguration.getObject(ContainerBalancerConfiguration.class);
-    Assert.assertEquals(cbConf.getThreshold(), 0.01d, 0.001);
+    Assert.assertEquals(1, cbConf.getThreshold(), 0.001);
 
-    Assert.assertEquals(cbConf.getMaxSizeLeavingSource(),
-        26 * 1024 * 1024 * 1024L);
+    Assert.assertEquals(26 * 1024 * 1024 * 1024L,
+        cbConf.getMaxSizeLeavingSource());
 
-    Assert.assertEquals(cbConf.getMoveTimeout().toMillis(), 30 * 60 * 1000);
+    Assert.assertEquals(30 * 60 * 1000,
+        cbConf.getMoveTimeout().toMillis());
   }
 
   /**
    * Determines unBalanced nodes, that is, over and under utilized nodes,
    * according to the generated utilization values for nodes and the threshold.
    *
-   * @param threshold A fraction from range 0 to 1.
+   * @param threshold A percentage in the range 0 to 100
    * @return List of DatanodeUsageInfo containing the expected(correct)
    * unBalanced nodes.
    */
   private List<DatanodeUsageInfo> determineExpectedUnBalancedNodes(
       double threshold) {
+    threshold /= 100;
     double lowerLimit = averageUtilization - threshold;
     double upperLimit = averageUtilization + threshold;
 
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerCommands.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerCommands.java
index 3041651..7f24d84 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerCommands.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerCommands.java
@@ -41,24 +41,23 @@ import java.util.concurrent.Callable;
  * To start:
  *      ozone admin containerbalancer start
  *      [ -t/--threshold {@literal <threshold>}]
- *      [ -i/--idleiterations {@literal <idleiterations>}]
- *      [ -d/--maxDatanodesRatioToInvolvePerIteration
- *      {@literal <maxDatanodesRatioToInvolvePerIteration>}]
+ *      [ -i/--iterations {@literal <iterations>}]
+ *      [ -d/--maxDatanodesPercentageToInvolvePerIteration
+ *      {@literal <maxDatanodesPercentageToInvolvePerIteration>}]
  *      [ -s/--maxSizeToMovePerIterationInGB
  *      {@literal <maxSizeToMovePerIterationInGB>}]
  *      Examples:
  *      ozone admin containerbalancer start
  *        start balancer with default values in the configuration
- *      ozone admin containerbalancer start -t 0.05
+ *      ozone admin containerbalancer start -t 5
  *        start balancer with a threshold of 5%
  *      ozone admin containerbalancer start -i 20
- *        start balancer with maximum 20 consecutive idle iterations
- *      ozone admin containerbalancer start -i 0
+ *        start balancer with maximum 20 consecutive iterations
+ *      ozone admin containerbalancer start -i -1
  *        run balancer infinitely with default values in the configuration
- *      ozone admin containerbalancer start -d 0.4
- *        start balancer with the ratio of maximum datanodes to involve in
- *        balancing in one iteration to the total number of healthy datanodes 
as
- *        0.4
+ *      ozone admin containerbalancer start -d 40
+ *        start balancer with maximum 40% of healthy, in-service datanodes
+ *        involved in balancing
  *      ozone admin containerbalancer start -s 10
  *        start balancer with maximum size of 10GB to move in one iteration
  * To stop:
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStartSubcommand.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStartSubcommand.java
index a4ee0d2..73d8511 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStartSubcommand.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerBalancerStartSubcommand.java
@@ -36,44 +36,50 @@ import java.util.Optional;
 public class ContainerBalancerStartSubcommand extends ScmSubcommand {
 
   @Option(names = {"-t", "--threshold"},
-      description = "Threshold target whether the cluster is balanced")
+      description = "Percentage deviation from average utilization of " +
+          "the cluster after which a datanode will be rebalanced (for " +
+          "example, '10' for 10%).")
   private Optional<Double> threshold;
 
-  @Option(names = {"-i", "--idleiterations"},
-      description = "Maximum consecutive idle iterations")
-  private Optional<Integer> idleiterations;
+  @Option(names = {"-i", "--iterations"},
+      description = "Maximum consecutive iterations that" +
+          " balancer will run for.")
+  private Optional<Integer> iterations;
 
-  @Option(names = {"-d", "--maxDatanodesRatioToInvolvePerIteration"},
-      description = "The ratio of maximum number of datanodes that should be " 
+
-          "involved in balancing in one iteration to the total number of " +
-          "healthy, in service nodes known to container balancer.")
-  private Optional<Double> maxDatanodesRatioToInvolvePerIteration;
+  @Option(names = {"-d", "--maxDatanodesPercentageToInvolvePerIteration"},
+      description = "Max percentage of healthy, in service datanodes " +
+          "that can be involved in balancing in one iteration (for example, " +
+          "'20' for 20%).")
+  private Optional<Integer> maxDatanodesPercentageToInvolvePerIteration;
 
   @Option(names = {"-s", "--maxSizeToMovePerIterationInGB"},
-      description = "Maximum size to move per iteration of balancing in GB, " +
-          "for 10GB it should be set as 10")
+      description = "Maximum size that can be moved per iteration of " +
+          "balancing (for example, '500' for 500GB).")
   private Optional<Long> maxSizeToMovePerIterationInGB;
 
-  @Option(names = {"-e", "--maxSizeEnteringTarget"},
-      description = "the maximum size that can enter a target datanode while " 
+
-          "balancing in GB. This is the sum of data from multiple sources.")
+  @Option(names = {"-e", "--maxSizeEnteringTargetInGB"},
+      description = "Maximum size that can enter a target datanode while " +
+          "balancing. This is the sum of data from multiple sources (for " +
+          "example, '26' for 26GB).")
   private Optional<Long> maxSizeEnteringTargetInGB;
 
-  @Option(names = {"-l", "--maxSizeLeavingSource"},
-      description = "maximum size that can leave a source datanode while " +
-          "balancing in GB, it is the sum of data moving to multiple targets.")
+  @Option(names = {"-l", "--maxSizeLeavingSourceInGB"},
+      description = "Maximum size that can leave a source datanode while " +
+          "balancing. This is the sum of data moving to multiple targets " +
+          "(for example, '26' for 26GB).")
   private Optional<Long> maxSizeLeavingSourceInGB;
 
   @Override
   public void execute(ScmClient scmClient) throws IOException {
-    boolean result = scmClient.startContainerBalancer(threshold, 
idleiterations,
-        maxDatanodesRatioToInvolvePerIteration, maxSizeToMovePerIterationInGB,
-        maxSizeEnteringTargetInGB, maxSizeLeavingSourceInGB);
+    boolean result = scmClient.startContainerBalancer(threshold, iterations,
+        maxDatanodesPercentageToInvolvePerIteration,
+        maxSizeToMovePerIterationInGB, maxSizeEnteringTargetInGB,
+        maxSizeLeavingSourceInGB);
     if (result) {
-      System.out.println("Starting ContainerBalancer Successfully.");
+      System.out.println("Container Balancer started successfully.");
       return;
     }
-    System.out.println("ContainerBalancer is already running, " +
+    System.out.println("Container Balancer is already running. " +
         "Please stop it first.");
   }
 }
\ No newline at end of file
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
index 30f0ec8..123a74d 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
@@ -552,14 +552,14 @@ public class ContainerOperationClient implements 
ScmClient {
 
   @Override
   public boolean startContainerBalancer(
-      Optional<Double> threshold, Optional<Integer> idleiterations,
-      Optional<Double> maxDatanodesRatioToInvolvePerIteration,
+      Optional<Double> threshold, Optional<Integer> iterations,
+      Optional<Integer> maxDatanodesPercentageToInvolvePerIteration,
       Optional<Long> maxSizeToMovePerIterationInGB,
       Optional<Long> maxSizeEnteringTargetInGB,
       Optional<Long> maxSizeLeavingSourceInGB)
       throws IOException {
     return storageContainerLocationClient.startContainerBalancer(threshold,
-        idleiterations, maxDatanodesRatioToInvolvePerIteration,
+        iterations, maxDatanodesPercentageToInvolvePerIteration,
         maxSizeToMovePerIterationInGB, maxSizeEnteringTargetInGB,
         maxSizeLeavingSourceInGB);
   }
diff --git 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
index 8ed6acd..a7ef779 100644
--- 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
+++ 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestContainerBalancerSubCommand.java
@@ -119,8 +119,8 @@ public class TestContainerBalancerSubCommand {
         .thenAnswer(invocation -> true);
     startCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile("^Starting\\sContainerBalancer" +
-        "\\sSuccessfully.");
+    Pattern p = Pattern.compile("^Container\\sBalancer\\sstarted" +
+        "\\ssuccessfully.");
     Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
     assertTrue(m.find());
   }
@@ -134,8 +134,8 @@ public class TestContainerBalancerSubCommand {
         .thenAnswer(invocation -> false);
     startCmd.execute(scmClient);
 
-    Pattern p = Pattern.compile("^ContainerBalancer\\sis\\salready\\srunning," 
+
-        "\\sPlease\\sstop\\sit\\sfirst.");
+    Pattern p = Pattern.compile("^Container\\sBalancer\\sis\\salready" +
+        "\\srunning.\\sPlease\\sstop\\sit\\sfirst.");
     Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
     assertTrue(m.find());
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerBalancerOperations.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerBalancerOperations.java
index ac5b737..2b0dfc2 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerBalancerOperations.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerBalancerOperations.java
@@ -81,15 +81,17 @@ public class TestContainerBalancerOperations {
     boolean running = containerBalancerClient.getContainerBalancerStatus();
     assertFalse(running);
     Optional<Double> threshold = Optional.of(0.1);
-    Optional<Integer> idleiterations = Optional.of(10000);
-    Optional<Double> maxDatanodesRatioToInvolvePerIteration = Optional.of(1d);
+    Optional<Integer> iterations = Optional.of(10000);
+    Optional<Integer> maxDatanodesPercentageToInvolvePerIteration =
+        Optional.of(100);
     Optional<Long> maxSizeToMovePerIterationInGB = Optional.of(1L);
     Optional<Long> maxSizeEnteringTargetInGB = Optional.of(1L);
     Optional<Long> maxSizeLeavingSourceInGB = Optional.of(1L);
 
-    containerBalancerClient.startContainerBalancer(threshold, idleiterations,
-        maxDatanodesRatioToInvolvePerIteration, maxSizeToMovePerIterationInGB,
-        maxSizeEnteringTargetInGB, maxSizeLeavingSourceInGB);
+    containerBalancerClient.startContainerBalancer(threshold, iterations,
+        maxDatanodesPercentageToInvolvePerIteration,
+        maxSizeToMovePerIterationInGB, maxSizeEnteringTargetInGB,
+        maxSizeLeavingSourceInGB);
     running = containerBalancerClient.getContainerBalancerStatus();
     assertTrue(running);
 
@@ -104,9 +106,10 @@ public class TestContainerBalancerOperations {
     assertFalse(running);
 
     // test normally start , and stop it before balance is completed
-    containerBalancerClient.startContainerBalancer(threshold, idleiterations,
-        maxDatanodesRatioToInvolvePerIteration, maxSizeToMovePerIterationInGB,
-        maxSizeEnteringTargetInGB, maxSizeLeavingSourceInGB);
+    containerBalancerClient.startContainerBalancer(threshold, iterations,
+        maxDatanodesPercentageToInvolvePerIteration,
+        maxSizeToMovePerIterationInGB, maxSizeEnteringTargetInGB,
+        maxSizeLeavingSourceInGB);
     running = containerBalancerClient.getContainerBalancerStatus();
     assertTrue(running);
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to