Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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.incrementNumIterations(1);
LOG.info("Result of this iteration of Container Balancer: {}", iR);
if (iR == IterationResult.CAN_NOT_BALANCE_ANY_MORE) {
stop();
Expand Down Expand Up @@ -267,15 +268,9 @@ private boolean initializeIteration() {
datanodeUsageInfo.getDatanodeDetails()));

this.totalNodesInCluster = datanodeUsageInfos.size();
this.clusterCapacity = 0L;
this.clusterUsed = 0L;
this.clusterRemaining = 0L;
this.selectedContainers.clear();
this.overUtilizedNodes.clear();
this.underUtilizedNodes.clear();
this.unBalancedNodes.clear();
this.countDatanodesInvolvedPerIteration = 0;
this.sizeMovedPerIteration = 0;

// reset some variables and metrics for this iteration
resetState();

clusterAvgUtilisation = calculateAvgUtilization(datanodeUsageInfos);
if (LOG.isDebugEnabled()) {
Expand Down Expand Up @@ -313,11 +308,7 @@ private boolean initializeIteration() {
}
if (Double.compare(utilization, upperLimit) > 0) {
overUtilizedNodes.add(datanodeUsageInfo);
metrics.incrementDatanodesNumToBalance(1);

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

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

// amount of bytes lesser than lower limit in this node
Long underUtilizedBytes = ratioToBytes(
Expand All @@ -341,7 +332,7 @@ private boolean initializeIteration() {
withinThresholdUtilizedNodes.add(datanodeUsageInfo);
}
}
metrics.setDataSizeToBalanceGB(
metrics.incrementDataSizeUnbalancedGB(
Math.max(totalOverUtilizedBytes, totalUnderUtilizedBytes) /
OzoneConsts.GB);
Collections.reverse(underUtilizedNodes);
Expand Down Expand Up @@ -451,7 +442,7 @@ private void checkIterationMoveResults(Set<DatanodeDetails> selectedTargets) {
ContainerInfo container =
containerManager.getContainer(moveSelection.getContainerID());
this.sizeMovedPerIteration += container.getUsedBytes();
metrics.incrementMovedContainersNum(1);
metrics.incrementNumMovedContainersInLatestIteration(1);
LOG.info("Move completed for container {} to target {}",
container.containerID(),
moveSelection.getTargetNode().getUuidString());
Expand All @@ -462,7 +453,8 @@ private void checkIterationMoveResults(Set<DatanodeDetails> selectedTargets) {
}
}
} catch (InterruptedException e) {
LOG.warn("Container move for container {} was interrupted.",
LOG.warn("Interrupted while waiting for container move result for " +
"container {}.",
moveSelection.getContainerID(), e);
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
Expand All @@ -475,7 +467,9 @@ private void checkIterationMoveResults(Set<DatanodeDetails> selectedTargets) {
}
countDatanodesInvolvedPerIteration =
sourceToTargetMap.size() + selectedTargets.size();
metrics.incrementDataSizeMovedGB(
metrics.incrementNumDatanodesInvolvedInLatestIteration(
countDatanodesInvolvedPerIteration);
metrics.incrementDataSizeMovedGBInLatestIteration(
sizeMovedPerIteration / OzoneConsts.GB);
LOG.info("Number of datanodes involved in this iteration: {}. Size moved " +
"in this iteration: {}B.",
Expand Down Expand Up @@ -740,6 +734,26 @@ private void incSizeSelectedForMoving(DatanodeDetails source,
findTargetStrategy.increaseSizeEntering(target, size);
}

/**
* Resets some variables and metrics for this iteration.
*/
private void resetState() {
this.clusterCapacity = 0L;
this.clusterUsed = 0L;
this.clusterRemaining = 0L;
this.selectedContainers.clear();
this.overUtilizedNodes.clear();
this.underUtilizedNodes.clear();
this.unBalancedNodes.clear();
this.countDatanodesInvolvedPerIteration = 0;
this.sizeMovedPerIteration = 0;
metrics.resetDataSizeMovedGBInLatestIteration();
metrics.resetNumMovedContainersInLatestIteration();
metrics.resetNumDatanodesInvolvedInLatestIteration();
metrics.resetDataSizeUnbalancedGB();
metrics.resetNumDatanodesUnbalanced();
}

/**
* Stops ContainerBalancer.
*/
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,26 @@ 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 = "Amount of Gigabytes that Container Balancer moved" +
" in the latest iteration.")
private MutableCounterLong dataSizeMovedGBInLatestIteration;

@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 latest iteration.")
private MutableCounterLong numMovedContainersInLatestIteration;

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

@Metric(about = "The total number of datanodes that need to be balanced.")
private MutableGaugeLong datanodesNumToBalance;
@Metric(about = "Number of datanodes that were involved in balancing in the" +
" latest iteration.")
private MutableCounterLong numDatanodesInvolvedInLatestIteration;

@Metric(about = "Number of datanodes that Container Balancer has balanced " +
"until now.")
private MutableGaugeLong datanodesNumBalanced;
@Metric(about = "Amount of data in Gigabytes that is causing unbalance.")
private MutableCounterLong dataSizeUnbalancedGB;

@Metric(about = "Utilisation value of the current maximum utilised datanode.")
private MutableGaugeInt maxDatanodeUtilizedPercentage;
@Metric(about = "Number of unbalanced datanodes.")
private MutableCounterLong numDatanodesUnbalanced;

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

public long getDataSizeToBalanceGB() {
return dataSizeToBalanceGB.value();
/**
* Gets the amount of data moved by Container Balancer in the latest
* iteration.
* @return size in GB
*/
public long getDataSizeMovedGBInLatestIteration() {
return dataSizeMovedGBInLatestIteration.value();
}

public void incrementDataSizeMovedGBInLatestIteration(long valueToAdd) {
this.dataSizeMovedGBInLatestIteration.incr(valueToAdd);
}

public void setDataSizeToBalanceGB(long size) {
this.dataSizeToBalanceGB.set(size);
public void resetDataSizeMovedGBInLatestIteration() {
dataSizeMovedGBInLatestIteration.incr(
-getDataSizeMovedGBInLatestIteration());
}

public long getDataSizeMovedGB() {
return dataSizeMovedGB.value();
/**
* Gets the number of containers moved by Container Balancer in the latest
* iteration.
* @return number of containers
*/
public long getNumMovedContainersInLatestIteration() {
return numMovedContainersInLatestIteration.value();
}

public void setDataSizeMovedGB(long dataSizeMovedGB) {
this.dataSizeMovedGB.set(dataSizeMovedGB);
public void incrementNumMovedContainersInLatestIteration(long valueToAdd) {
this.numMovedContainersInLatestIteration.incr(valueToAdd);
}

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

public long getMovedContainersNum() {
return movedContainersNum.value();
/**
* Gets the number of iterations that Container Balancer has run for.
* @return number of iterations
*/
public long getNumIterations() {
return numIterations.value();
}

public void setMovedContainersNum(long movedContainersNum) {
this.movedContainersNum.set(movedContainersNum);
public void incrementNumIterations(long valueToAdd) {
numIterations.incr(valueToAdd);
}

public long incrementMovedContainersNum(long valueToAdd) {
this.movedContainersNum.incr(valueToAdd);
return this.movedContainersNum.value();
/**
* Gets number of datanodes that were involved in balancing in the latest
* iteration.
* @return number of datanodes
*/
public long getNumDatanodesInvolvedInLatestIteration() {
return numDatanodesInvolvedInLatestIteration.value();
}

public long getDatanodesNumToBalance() {
return datanodesNumToBalance.value();
public void incrementNumDatanodesInvolvedInLatestIteration(long valueToAdd) {
numDatanodesInvolvedInLatestIteration.incr(valueToAdd);
}

public void setDatanodesNumToBalance(long datanodesNumToBalance) {
this.datanodesNumToBalance.set(datanodesNumToBalance);
public void resetNumDatanodesInvolvedInLatestIteration() {
numDatanodesInvolvedInLatestIteration.incr(
-getNumDatanodesInvolvedInLatestIteration());
}

/**
* Add specified valueToAdd to the number of datanodes that need to be
* balanced.
*
* @param valueToAdd number of datanodes to add
* Gets the amount of data in Gigabytes that is causing unbalance.
* @return size of data as a long value
*/
public void incrementDatanodesNumToBalance(long valueToAdd) {
this.datanodesNumToBalance.incr(valueToAdd);
public long getDataSizeUnbalancedGB() {
return dataSizeUnbalancedGB.value();
}

public long getDatanodesNumBalanced() {
return datanodesNumBalanced.value();
public void incrementDataSizeUnbalancedGB(long valueToAdd) {
dataSizeUnbalancedGB.incr(valueToAdd);
}

public void setDatanodesNumBalanced(long datanodesNumBalanced) {
this.datanodesNumBalanced.set(datanodesNumBalanced);
public void resetDataSizeUnbalancedGB() {
dataSizeUnbalancedGB.incr(-getDataSizeUnbalancedGB());
}

/**
* Add specified valueToAdd to datanodesNumBalanced.
*
* @param valueToAdd The value to add.
* @return The result after addition.
* Gets the number of datanodes that are unbalanced.
* @return long value
*/
public long incrementDatanodesNumBalanced(long valueToAdd) {
datanodesNumBalanced.incr(valueToAdd);
return datanodesNumBalanced.value();
public long getNumDatanodesUnbalanced() {
return numDatanodesUnbalanced.value();
}

public int getMaxDatanodeUtilizedPercentage() {
return maxDatanodeUtilizedPercentage.value();
public void incrementNumDatanodesUnbalanced(long valueToAdd) {
numDatanodesUnbalanced.incr(valueToAdd);
}

public void setMaxDatanodeUtilizedPercentage(int percentage) {
this.maxDatanodeUtilizedPercentage.set(percentage);
public void resetNumDatanodesUnbalanced() {
numDatanodesUnbalanced.incr(-getNumDatanodesUnbalanced());
}
}
Loading