finish making MAX_SEGMENTS_TO_MOVE a config item

This commit is contained in:
Nelson Ray 2013-01-07 16:56:55 -08:00
parent ba82fe746a
commit 6fda5330fd
7 changed files with 43 additions and 11 deletions

View File

@ -44,7 +44,7 @@ import java.util.Set;
public class BalancerCostAnalyzer public class BalancerCostAnalyzer
{ {
private static final Logger log = new Logger(BalancerCostAnalyzer.class); private static final Logger log = new Logger(BalancerCostAnalyzer.class);
private final int MAX_SEGMENTS_TO_MOVE; private int MAX_SEGMENTS_TO_MOVE;
private static final int DAY_IN_MILLIS = 1000 * 60 * 60 * 24; private static final int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
private static final int SEVEN_DAYS_IN_MILLIS = 7 * DAY_IN_MILLIS; private static final int SEVEN_DAYS_IN_MILLIS = 7 * DAY_IN_MILLIS;
private static final int THIRTY_DAYS_IN_MILLIS = 30 * DAY_IN_MILLIS; private static final int THIRTY_DAYS_IN_MILLIS = 30 * DAY_IN_MILLIS;
@ -58,20 +58,21 @@ public class BalancerCostAnalyzer
private double totalCostChange; private double totalCostChange;
private int totalSegments; private int totalSegments;
public BalancerCostAnalyzer(DateTime referenceTimestamp, int MAX_SEGMENTS_TO_MOVE) public BalancerCostAnalyzer(DateTime referenceTimestamp)
{ {
this.referenceTimestamp = referenceTimestamp; this.referenceTimestamp = referenceTimestamp;
this.MAX_SEGMENTS_TO_MOVE = MAX_SEGMENTS_TO_MOVE;
rand = new Random(0); rand = new Random(0);
totalCostChange = 0; totalCostChange = 0;
} }
public void init(List<ServerHolder> serverHolderList, DruidMasterRuntimeParams params) public void init(List<ServerHolder> serverHolderList, DruidMasterRuntimeParams params)
{ {
this.serverHolderList = serverHolderList;
this.initialTotalCost = calculateInitialTotalCost(serverHolderList); this.initialTotalCost = calculateInitialTotalCost(serverHolderList);
this.normalization = calculateNormalization(serverHolderList); this.normalization = calculateNormalization(serverHolderList);
this.serverHolderList = serverHolderList;
this.totalSegments = params.getAvailableSegments().size(); this.totalSegments = params.getAvailableSegments().size();
this.MAX_SEGMENTS_TO_MOVE = params.getMaxSegmentsToMove();
} }
public double getInitialTotalCost() public double getInitialTotalCost()

View File

@ -575,6 +575,7 @@ public class DruidMaster
.withEmitter(emitter) .withEmitter(emitter)
.withMergeBytesLimit(config.getMergeBytesLimit()) .withMergeBytesLimit(config.getMergeBytesLimit())
.withMergeSegmentsLimit(config.getMergeSegmentsLimit()) .withMergeSegmentsLimit(config.getMergeSegmentsLimit())
.withMaxSegmentsToMove(config.getMaxSegmentsToMove())
.build(); .build();
for (DruidMasterHelper helper : helpers) { for (DruidMasterHelper helper : helpers) {
@ -680,7 +681,7 @@ public class DruidMaster
}, },
new DruidMasterRuleRunner(DruidMaster.this), new DruidMasterRuleRunner(DruidMaster.this),
new DruidMasterCleanup(DruidMaster.this), new DruidMasterCleanup(DruidMaster.this),
new DruidMasterBalancer(DruidMaster.this, new BalancerCostAnalyzer(DateTime.now(), config.getMaxSegmentsToMove())), new DruidMasterBalancer(DruidMaster.this, new BalancerCostAnalyzer(DateTime.now())),
new DruidMasterLogger() new DruidMasterLogger()
) )
); );

View File

@ -49,6 +49,7 @@ public class DruidMasterRuntimeParams
private final MasterStats stats; private final MasterStats stats;
private final long mergeBytesLimit; private final long mergeBytesLimit;
private final int mergeSegmentsLimit; private final int mergeSegmentsLimit;
private final int maxSegmentsToMove;
public DruidMasterRuntimeParams( public DruidMasterRuntimeParams(
long startTime, long startTime,
@ -62,7 +63,8 @@ public class DruidMasterRuntimeParams
long millisToWaitBeforeDeleting, long millisToWaitBeforeDeleting,
MasterStats stats, MasterStats stats,
long mergeBytesLimit, long mergeBytesLimit,
int mergeSegmentsLimit int mergeSegmentsLimit,
int maxSegmentsToMove
) )
{ {
this.startTime = startTime; this.startTime = startTime;
@ -77,6 +79,12 @@ public class DruidMasterRuntimeParams
this.stats = stats; this.stats = stats;
this.mergeBytesLimit = mergeBytesLimit; this.mergeBytesLimit = mergeBytesLimit;
this.mergeSegmentsLimit = mergeSegmentsLimit; this.mergeSegmentsLimit = mergeSegmentsLimit;
this.maxSegmentsToMove = maxSegmentsToMove;
}
public int getMaxSegmentsToMove()
{
return maxSegmentsToMove;
} }
public long getStartTime() public long getStartTime()
@ -163,7 +171,8 @@ public class DruidMasterRuntimeParams
millisToWaitBeforeDeleting, millisToWaitBeforeDeleting,
stats, stats,
mergeBytesLimit, mergeBytesLimit,
mergeSegmentsLimit mergeSegmentsLimit,
maxSegmentsToMove
); );
} }
@ -181,6 +190,7 @@ public class DruidMasterRuntimeParams
private MasterStats stats; private MasterStats stats;
private long mergeBytesLimit; private long mergeBytesLimit;
private int mergeSegmentsLimit; private int mergeSegmentsLimit;
private int maxSegmentsToMove;
Builder() Builder()
{ {
@ -196,6 +206,7 @@ public class DruidMasterRuntimeParams
this.stats = new MasterStats(); this.stats = new MasterStats();
this.mergeBytesLimit = 0; this.mergeBytesLimit = 0;
this.mergeSegmentsLimit = 0; this.mergeSegmentsLimit = 0;
this.maxSegmentsToMove = 0;
} }
Builder( Builder(
@ -210,7 +221,8 @@ public class DruidMasterRuntimeParams
long millisToWaitBeforeDeleting, long millisToWaitBeforeDeleting,
MasterStats stats, MasterStats stats,
long mergeBytesLimit, long mergeBytesLimit,
int mergeSegmentsLimit int mergeSegmentsLimit,
int maxSegmentsToMove
) )
{ {
this.startTime = startTime; this.startTime = startTime;
@ -225,6 +237,7 @@ public class DruidMasterRuntimeParams
this.stats = stats; this.stats = stats;
this.mergeBytesLimit = mergeBytesLimit; this.mergeBytesLimit = mergeBytesLimit;
this.mergeSegmentsLimit = mergeSegmentsLimit; this.mergeSegmentsLimit = mergeSegmentsLimit;
this.maxSegmentsToMove = maxSegmentsToMove;
} }
public DruidMasterRuntimeParams build() public DruidMasterRuntimeParams build()
@ -241,7 +254,8 @@ public class DruidMasterRuntimeParams
millisToWaitBeforeDeleting, millisToWaitBeforeDeleting,
stats, stats,
mergeBytesLimit, mergeBytesLimit,
mergeSegmentsLimit mergeSegmentsLimit,
maxSegmentsToMove
); );
} }
@ -316,5 +330,11 @@ public class DruidMasterRuntimeParams
this.mergeSegmentsLimit = mergeSegmentsLimit; this.mergeSegmentsLimit = mergeSegmentsLimit;
return this; return this;
} }
public Builder withMaxSegmentsToMove(int maxSegmentsToMove)
{
this.maxSegmentsToMove = maxSegmentsToMove;
return this;
}
} }
} }

View File

@ -65,7 +65,7 @@ public abstract class LoadRule implements Rule
totalReplicants, totalReplicants,
serverQueue, serverQueue,
segment, segment,
master.getConfig().getMaxSegmentsToMove() params.getMaxSegmentsToMove()
) )
); );
stats.accumulate(drop(expectedReplicants, clusterReplicants, segment, params)); stats.accumulate(drop(expectedReplicants, clusterReplicants, segment, params));
@ -87,7 +87,7 @@ public abstract class LoadRule implements Rule
List<ServerHolder> assignedServers = Lists.newArrayList(); List<ServerHolder> assignedServers = Lists.newArrayList();
while (totalReplicants < expectedReplicants) { while (totalReplicants < expectedReplicants) {
BalancerCostAnalyzer analyzer = new BalancerCostAnalyzer(DateTime.now(), MAX_SEGMENTS_TO_MOVE); BalancerCostAnalyzer analyzer = new BalancerCostAnalyzer(DateTime.now());
BalancerCostAnalyzer.BalancerCostAnalyzerHelper helper = analyzer.new BalancerCostAnalyzerHelper(serverHolderList, segment); BalancerCostAnalyzer.BalancerCostAnalyzerHelper helper = analyzer.new BalancerCostAnalyzerHelper(serverHolderList, segment);
helper.computeAllCosts(); helper.computeAllCosts();
Pair<Double, ServerHolder> minPair = helper.getCostsServerHolderPairs().pollFirst(); Pair<Double, ServerHolder> minPair = helper.getCostsServerHolderPairs().pollFirst();

View File

@ -44,6 +44,7 @@ import java.util.Map;
*/ */
public class DruidMasterBalancerTest public class DruidMasterBalancerTest
{ {
private static final int MAX_SEGMENTS_TO_MOVE = 5;
private DruidMaster master; private DruidMaster master;
private DruidServer druidServer1; private DruidServer druidServer1;
private DruidServer druidServer2; private DruidServer druidServer2;
@ -222,6 +223,7 @@ public class DruidMasterBalancerTest
) )
.withLoadManagementPeons(ImmutableMap.of("from", peon, "to", peon)) .withLoadManagementPeons(ImmutableMap.of("from", peon, "to", peon))
.withAvailableSegments(segments.values()) .withAvailableSegments(segments.values())
.withMaxSegmentsToMove(MAX_SEGMENTS_TO_MOVE)
.build(); .build();
params = new DruidMasterBalancer(master, new BalancerCostAnalyzer(new DateTime("2013-01-01"))).run(params); params = new DruidMasterBalancer(master, new BalancerCostAnalyzer(new DateTime("2013-01-01"))).run(params);
@ -370,6 +372,7 @@ public class DruidMasterBalancerTest
) )
.withLoadManagementPeons(ImmutableMap.of("1", peon, "2", peon, "3", peon, "4", peon)) .withLoadManagementPeons(ImmutableMap.of("1", peon, "2", peon, "3", peon, "4", peon))
.withAvailableSegments(segments.values()) .withAvailableSegments(segments.values())
.withMaxSegmentsToMove(MAX_SEGMENTS_TO_MOVE)
.build(); .build();
params = new DruidMasterBalancer(master, new BalancerCostAnalyzer(new DateTime("2013-01-01"))).run(params); params = new DruidMasterBalancer(master, new BalancerCostAnalyzer(new DateTime("2013-01-01"))).run(params);

View File

@ -175,6 +175,7 @@ public class DruidMasterRuleRunnerTest
.withAvailableSegments(availableSegments) .withAvailableSegments(availableSegments)
.withDatabaseRuleManager(databaseRuleManager) .withDatabaseRuleManager(databaseRuleManager)
.withSegmentReplicantLookup(SegmentReplicantLookup.make(new DruidCluster())) .withSegmentReplicantLookup(SegmentReplicantLookup.make(new DruidCluster()))
.withMaxSegmentsToMove(5)
.build(); .build();
DruidMasterRuntimeParams afterParams = ruleRunner.run(params); DruidMasterRuntimeParams afterParams = ruleRunner.run(params);

View File

@ -124,6 +124,12 @@ public class DruidMasterTest
{ {
return ""; return "";
} }
@Override
public int getMaxSegmentsToMove()
{
return 0;
}
}, },
null, null,
null, null,