Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ private void balance() {
//if no new move option is generated, it means the cluster can
//not be balanced any more , so just stop
IterationResult iR = doIteration();
metrics.incrementCountIterations(1);
LOG.info("Result of this iteration of Container Balancer: {}", iR);
if (iR == IterationResult.CAN_NOT_BALANCE_ANY_MORE) {
stop();
Expand Down Expand Up @@ -313,11 +314,6 @@ private boolean initializeIteration() {
}
if (Double.compare(utilization, upperLimit) > 0) {
overUtilizedNodes.add(datanodeUsageInfo);
metrics.incrementDatanodesNumToBalance(1);

metrics.setMaxDatanodeUtilizedPercentage(Math.max(
metrics.getMaxDatanodeUtilizedPercentage(),
ratioToPercent(utilization)));

// amount of bytes greater than upper limit in this node
Long overUtilizedBytes = ratioToBytes(
Expand All @@ -328,7 +324,6 @@ private boolean initializeIteration() {
totalOverUtilizedBytes += overUtilizedBytes;
} else if (Double.compare(utilization, lowerLimit) < 0) {
underUtilizedNodes.add(datanodeUsageInfo);
metrics.incrementDatanodesNumToBalance(1);

// amount of bytes lesser than lower limit in this node
Long underUtilizedBytes = ratioToBytes(
Expand All @@ -341,9 +336,6 @@ private boolean initializeIteration() {
withinThresholdUtilizedNodes.add(datanodeUsageInfo);
}
}
metrics.setDataSizeToBalanceGB(
Math.max(totalOverUtilizedBytes, totalUnderUtilizedBytes) /
OzoneConsts.GB);
Collections.reverse(underUtilizedNodes);

unBalancedNodes = new ArrayList<>(
Expand All @@ -364,6 +356,8 @@ private boolean initializeIteration() {
nodeManager, replicationManager, containerManager, findSourceStrategy);
sourceToTargetMap = new HashMap<>(overUtilizedNodes.size() +
withinThresholdUtilizedNodes.size());
metrics.resetDataSizeMovedGB();
metrics.resetMovedContainersNum();
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
import org.apache.hadoop.metrics2.annotation.Metric;
import org.apache.hadoop.metrics2.annotation.Metrics;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
import org.apache.hadoop.metrics2.lib.MutableGaugeInt;
import org.apache.hadoop.metrics2.lib.MutableGaugeLong;
import org.apache.hadoop.metrics2.lib.MutableCounterLong;

/**
* Metrics related to Container Balancer running in SCM.
Expand All @@ -37,27 +36,16 @@ public final class ContainerBalancerMetrics {

private final MetricsSystem ms;

@Metric(about = "The total amount of used space in GigaBytes that needs to " +
"be balanced.")
private MutableGaugeLong dataSizeToBalanceGB;
@Metric(about = "The amount of Gigabytes that Container Balancer moved" +
" in the last iteration.")
private MutableCounterLong dataSizeMovedGB;

@Metric(about = "The amount of Giga Bytes that have been moved to achieve " +
"balance.")
private MutableGaugeLong dataSizeMovedGB;
@Metric(about = "Number of containers that Container Balancer moved" +
" in the last iteration.")
private MutableCounterLong movedContainersNum;
Comment thread
lokeshj1703 marked this conversation as resolved.
Outdated

@Metric(about = "Number of containers that Container Balancer has moved" +
" until now.")
private MutableGaugeLong movedContainersNum;

@Metric(about = "The total number of datanodes that need to be balanced.")
private MutableGaugeLong datanodesNumToBalance;
Comment thread
lokeshj1703 marked this conversation as resolved.

@Metric(about = "Number of datanodes that Container Balancer has balanced " +
"until now.")
private MutableGaugeLong datanodesNumBalanced;

@Metric(about = "Utilisation value of the current maximum utilised datanode.")
private MutableGaugeInt maxDatanodeUtilizedPercentage;
@Metric(about = "Number of iterations that Container Balancer has run for.")
private MutableCounterLong countIterations;

/**
* Create and register metrics named {@link ContainerBalancerMetrics#NAME}
Expand All @@ -75,82 +63,48 @@ private ContainerBalancerMetrics(MetricsSystem ms) {
this.ms = ms;
}

public long getDataSizeToBalanceGB() {
return dataSizeToBalanceGB.value();
}

public void setDataSizeToBalanceGB(long size) {
this.dataSizeToBalanceGB.set(size);
}

/**
* Gets the amount of data moved by Container Balancer in the last iteration.
* @return size in GB
*/
public long getDataSizeMovedGB() {
return dataSizeMovedGB.value();
}

public void setDataSizeMovedGB(long dataSizeMovedGB) {
this.dataSizeMovedGB.set(dataSizeMovedGB);
}

public long incrementDataSizeMovedGB(long valueToAdd) {
public void incrementDataSizeMovedGB(long valueToAdd) {
this.dataSizeMovedGB.incr(valueToAdd);
return this.dataSizeMovedGB.value();
}

public long getMovedContainersNum() {
return movedContainersNum.value();
}

public void setMovedContainersNum(long movedContainersNum) {
this.movedContainersNum.set(movedContainersNum);
}

public long incrementMovedContainersNum(long valueToAdd) {
this.movedContainersNum.incr(valueToAdd);
return this.movedContainersNum.value();
}

public long getDatanodesNumToBalance() {
return datanodesNumToBalance.value();
}

public void setDatanodesNumToBalance(long datanodesNumToBalance) {
this.datanodesNumToBalance.set(datanodesNumToBalance);
public void resetDataSizeMovedGB() {
dataSizeMovedGB.incr(-getDataSizeMovedGB());
}

/**
* Add specified valueToAdd to the number of datanodes that need to be
* balanced.
*
* @param valueToAdd number of datanodes to add
* Gets the number of containers moved by Container Balancer in the last
* iteration.
* @return number of containers
*/
public void incrementDatanodesNumToBalance(long valueToAdd) {
this.datanodesNumToBalance.incr(valueToAdd);
public long getMovedContainersNum() {
return movedContainersNum.value();
}

public long getDatanodesNumBalanced() {
return datanodesNumBalanced.value();
public void incrementMovedContainersNum(long valueToAdd) {
this.movedContainersNum.incr(valueToAdd);
}

public void setDatanodesNumBalanced(long datanodesNumBalanced) {
this.datanodesNumBalanced.set(datanodesNumBalanced);
public void resetMovedContainersNum() {
movedContainersNum.incr(-getMovedContainersNum());
}

/**
* Add specified valueToAdd to datanodesNumBalanced.
*
* @param valueToAdd The value to add.
* @return The result after addition.
* Gets the number of iterations that Container Balancer has run for.
* @return number of iterations
*/
public long incrementDatanodesNumBalanced(long valueToAdd) {
datanodesNumBalanced.incr(valueToAdd);
return datanodesNumBalanced.value();
}

public int getMaxDatanodeUtilizedPercentage() {
return maxDatanodeUtilizedPercentage.value();
public long getCountIterations() {
return countIterations.value();
}

public void setMaxDatanodeUtilizedPercentage(int percentage) {
this.maxDatanodeUtilizedPercentage.set(percentage);
public void incrementCountIterations(long valueToAdd) {
countIterations.incr(valueToAdd);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;

import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
Expand Down Expand Up @@ -500,29 +501,22 @@ public void balancerShouldObeyMaxSizeEnteringTargetLimit() {

@Test
public void testMetrics() {
conf.set("hdds.datanode.du.refresh.period", "1ms");
balancerConfiguration.setBalancingInterval(Duration.ofMillis(2));
balancerConfiguration.setThreshold(10);
balancerConfiguration.setIterations(1);
balancerConfiguration.setMaxSizeEnteringTarget(10 * OzoneConsts.GB);
balancerConfiguration.setMaxSizeToMovePerIteration(100 * OzoneConsts.GB);
balancerConfiguration.setIterations(2);
balancerConfiguration.setMaxSizeEnteringTarget(6 * OzoneConsts.GB);
// deliberately set max size per iteration to a low value, 6GB
balancerConfiguration.setMaxSizeToMovePerIteration(6 * OzoneConsts.GB);
balancerConfiguration.setMaxDatanodesPercentageToInvolvePerIteration(100);

containerBalancer.start(balancerConfiguration);
sleepWhileBalancing(500);

// waiting for balance completed.
// TODO: this is a temporary implementation for now
// modify this after balancer is fully completed
try {
Thread.sleep(500);
} catch (InterruptedException e) {}

containerBalancer.stop();
ContainerBalancerMetrics metrics = containerBalancer.getMetrics();
Assert.assertEquals(determineExpectedUnBalancedNodes(
balancerConfiguration.getThreshold()).size(),
metrics.getDatanodesNumToBalance());
Assert.assertEquals(ContainerBalancer.ratioToPercent(
nodeUtilizations.get(nodeUtilizations.size() - 1)),
metrics.getMaxDatanodeUtilizedPercentage());
Assert.assertTrue(metrics.getDataSizeMovedGB() <= 6);
Assert.assertEquals(2, metrics.getCountIterations());
containerBalancer.stop();
Comment thread
lokeshj1703 marked this conversation as resolved.
Outdated
}

/**
Expand Down