You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by ji...@apache.org on 2019/10/28 22:33:14 UTC
[helix] 36/50: Load soft constraint weight from
resources/properties file (#492)
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 <i3...@gmail.com>
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