This is an automated email from the ASF dual-hosted git repository. jiajunwang pushed a commit to branch wagedRebalancer in repository https://gitbox.apache.org/repos/asf/helix.git
commit e2d3d358ab68a5a2e67d210b47b2f47a36c9c928 Author: Yi Wang <[email protected]> AuthorDate: Wed Oct 2 16:29:40 2019 -0700 Load soft constraint weight from resources/properties file (#492) Load the soft constraint's weight from a properties file. It makes easier for us to adjust weights in the future. --- .../java/org/apache/helix/SystemPropertyKeys.java | 2 + .../ConstraintBasedAlgorithmFactory.java | 48 +++++++++++++++++----- .../resources/soft-constraint-weight.properties | 24 +++++++++++ 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/helix-core/src/main/java/org/apache/helix/SystemPropertyKeys.java b/helix-core/src/main/java/org/apache/helix/SystemPropertyKeys.java index 1a6a797..d316986 100644 --- a/helix-core/src/main/java/org/apache/helix/SystemPropertyKeys.java +++ b/helix-core/src/main/java/org/apache/helix/SystemPropertyKeys.java @@ -6,6 +6,8 @@ public class SystemPropertyKeys { // ZKHelixManager public static final String CLUSTER_MANAGER_VERSION = "cluster-manager-version.properties"; + // soft constraints weight definitions + public static final String SOFT_CONSTRAINT_WEIGHTS = "soft-constraint-weight.properties"; public static final String FLAPPING_TIME_WINDOW = "helixmanager.flappingTimeWindow"; diff --git a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ConstraintBasedAlgorithmFactory.java b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ConstraintBasedAlgorithmFactory.java index 657fc82..f70de9a 100644 --- a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ConstraintBasedAlgorithmFactory.java +++ b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ConstraintBasedAlgorithmFactory.java @@ -19,14 +19,19 @@ package org.apache.helix.controller.rebalancer.waged.constraints; * under the License. */ +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; +import org.apache.helix.HelixManagerProperties; +import org.apache.helix.SystemPropertyKeys; import org.apache.helix.controller.rebalancer.waged.RebalanceAlgorithm; import org.apache.helix.model.ClusterConfig; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; + /** * The factory class to create an instance of {@link ConstraintBasedAlgorithm} */ @@ -36,11 +41,29 @@ public class ConstraintBasedAlgorithmFactory { // enlarge the overall weight of the evenness constraints compared with the movement constraint. // TODO: Tune or make the following factor configurable. private static final int EVENNESS_PREFERENCE_NORMALIZE_FACTOR = 50; + private static final Map<String, Float> MODEL = new HashMap<>() { + { + // The default setting + put(PartitionMovementConstraint.class.getSimpleName(), 1f); + put(InstancePartitionsCountConstraint.class.getSimpleName(), 0.3f); + put(ResourcePartitionAntiAffinityConstraint.class.getSimpleName(), 0.1f); + put(ResourceTopStateAntiAffinityConstraint.class.getSimpleName(), 0.1f); + put(MaxCapacityUsageInstanceConstraint.class.getSimpleName(), 0.5f); + } + }; + + static { + Properties properties = + new HelixManagerProperties(SystemPropertyKeys.SOFT_CONSTRAINT_WEIGHTS).getProperties(); + // overwrite the default value with data load from property file + properties.forEach((constraintName, weight) -> MODEL.put(String.valueOf(constraintName), + Float.valueOf(String.valueOf(weight)))); + } public static RebalanceAlgorithm getInstance( Map<ClusterConfig.GlobalRebalancePreferenceKey, Integer> preferences) { - List<HardConstraint> hardConstraints = ImmutableList - .of(new FaultZoneAwareConstraint(), new NodeCapacityConstraint(), + List<HardConstraint> hardConstraints = + ImmutableList.of(new FaultZoneAwareConstraint(), new NodeCapacityConstraint(), new ReplicaActivateConstraint(), new NodeMaxPartitionLimitConstraint(), new ValidGroupTagConstraint(), new SamePartitionOnInstanceConstraint()); @@ -52,13 +75,16 @@ public class ConstraintBasedAlgorithmFactory { float evennessRatio = (float) evennessPreference / (evennessPreference + movementPreference); float movementRatio = (float) movementPreference / (evennessPreference + movementPreference); - Map<SoftConstraint, Float> softConstraints = ImmutableMap.<SoftConstraint, Float>builder() - .put(new PartitionMovementConstraint(), movementRatio) - .put(new InstancePartitionsCountConstraint(), 0.3f * evennessRatio) - .put(new ResourcePartitionAntiAffinityConstraint(), 0.1f * evennessRatio) - .put(new ResourceTopStateAntiAffinityConstraint(), 0.1f * evennessRatio) - .put(new MaxCapacityUsageInstanceConstraint(), 0.5f * evennessRatio).build(); + List<SoftConstraint> softConstraints = ImmutableList.of(new PartitionMovementConstraint(), + new InstancePartitionsCountConstraint(), new ResourcePartitionAntiAffinityConstraint(), + new ResourceTopStateAntiAffinityConstraint(), new MaxCapacityUsageInstanceConstraint()); + Map<SoftConstraint, Float> softConstraintsWithWeight = Maps.toMap(softConstraints, key -> { + String name = key.getClass().getSimpleName(); + float weight = MODEL.get(name); + return name.equals(PartitionMovementConstraint.class.getSimpleName()) ? movementRatio * weight + : evennessRatio * weight; + }); - return new ConstraintBasedAlgorithm(hardConstraints, softConstraints); + return new ConstraintBasedAlgorithm(hardConstraints, softConstraintsWithWeight); } } diff --git a/helix-core/src/main/resources/soft-constraint-weight.properties b/helix-core/src/main/resources/soft-constraint-weight.properties new file mode 100644 index 0000000..3e87c9d --- /dev/null +++ b/helix-core/src/main/resources/soft-constraint-weight.properties @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +PartitionMovementConstraint=1f +InstancePartitionsCountConstraint=0.3f +ResourcePartitionAntiAffinityConstraint=0.1f +ResourceTopStateAntiAffinityConstraint=0.1f +MaxCapacityUsageInstanceConstraint=0.5f \ No newline at end of file
