Search in sources :

Example 1 with Action

use of org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action in project hbase by apache.

the class StochasticLoadBalancer method balanceCluster.

/**
   * Given the cluster state this will try and approach an optimal balance. This
   * should always approach the optimal state given enough steps.
   */
@Override
public synchronized List<RegionPlan> balanceCluster(Map<ServerName, List<HRegionInfo>> clusterState) {
    List<RegionPlan> plans = balanceMasterRegions(clusterState);
    if (plans != null || clusterState == null || clusterState.size() <= 1) {
        return plans;
    }
    if (masterServerName != null && clusterState.containsKey(masterServerName)) {
        if (clusterState.size() <= 2) {
            return null;
        }
        clusterState = new HashMap<>(clusterState);
        clusterState.remove(masterServerName);
    }
    // On clusters with lots of HFileLinks or lots of reference files,
    // instantiating the storefile infos can be quite expensive.
    // Allow turning this feature off if the locality cost is not going to
    // be used in any computations.
    RegionLocationFinder finder = null;
    if (this.localityCost != null && this.localityCost.getMultiplier() > 0) {
        finder = this.regionFinder;
    }
    //The clusterState that is given to this method contains the state
    //of all the regions in the table(s) (that's true today)
    // Keep track of servers to iterate through them.
    Cluster cluster = new Cluster(clusterState, loads, finder, rackManager);
    long startTime = EnvironmentEdgeManager.currentTime();
    initCosts(cluster);
    if (!needsBalance(cluster)) {
        return null;
    }
    double currentCost = computeCost(cluster, Double.MAX_VALUE);
    curOverallCost = currentCost;
    for (int i = 0; i < this.curFunctionCosts.length; i++) {
        curFunctionCosts[i] = tempFunctionCosts[i];
    }
    LOG.info("start StochasticLoadBalancer.balancer, initCost=" + currentCost + ", functionCost=" + functionCost());
    double initCost = currentCost;
    double newCost = currentCost;
    long computedMaxSteps = Math.min(this.maxSteps, ((long) cluster.numRegions * (long) this.stepsPerRegion * (long) cluster.numServers));
    // Perform a stochastic walk to see if we can get a good fit.
    long step;
    for (step = 0; step < computedMaxSteps; step++) {
        int generatorIdx = RANDOM.nextInt(candidateGenerators.length);
        CandidateGenerator p = candidateGenerators[generatorIdx];
        Cluster.Action action = p.generate(cluster);
        if (action.type == Type.NULL) {
            continue;
        }
        cluster.doAction(action);
        updateCostsWithAction(cluster, action);
        newCost = computeCost(cluster, currentCost);
        // Should this be kept?
        if (newCost < currentCost) {
            currentCost = newCost;
            // save for JMX
            curOverallCost = currentCost;
            for (int i = 0; i < this.curFunctionCosts.length; i++) {
                curFunctionCosts[i] = tempFunctionCosts[i];
            }
        } else {
            // Put things back the way they were before.
            // TODO: undo by remembering old values
            Action undoAction = action.undoAction();
            cluster.doAction(undoAction);
            updateCostsWithAction(cluster, undoAction);
        }
        if (EnvironmentEdgeManager.currentTime() - startTime > maxRunningTime) {
            break;
        }
    }
    long endTime = EnvironmentEdgeManager.currentTime();
    metricsBalancer.balanceCluster(endTime - startTime);
    // update costs metrics
    updateStochasticCosts(tableName, curOverallCost, curFunctionCosts);
    if (initCost > currentCost) {
        plans = createRegionPlans(cluster);
        if (LOG.isDebugEnabled()) {
            LOG.debug("Finished computing new load balance plan.  Computation took " + (endTime - startTime) + "ms to try " + step + " different iterations.  Found a solution that moves " + plans.size() + " regions; Going from a computed cost of " + initCost + " to a new cost of " + currentCost);
        }
        return plans;
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("Could not find a better load balance plan.  Tried " + step + " different configurations in " + (endTime - startTime) + "ms, and did not find anything with a computed cost less than " + initCost);
    }
    return null;
}
Also used : Action(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action) MoveRegionAction(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction) SwapRegionsAction(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction) AssignRegionAction(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction) Action(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action) RegionPlan(org.apache.hadoop.hbase.master.RegionPlan)

Aggregations

RegionPlan (org.apache.hadoop.hbase.master.RegionPlan)1 Action (org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.Action)1 AssignRegionAction (org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.AssignRegionAction)1 MoveRegionAction (org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.MoveRegionAction)1 SwapRegionsAction (org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster.SwapRegionsAction)1