Skip to content

Commit ea41bf2

Browse files
Use a single setting to limit normalizer plans size
1 parent b169ee8 commit ea41bf2

File tree

5 files changed

+62
-54
lines changed

5 files changed

+62
-54
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/MergeNormalizationPlan.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ public List<NormalizationTarget> getNormalizationTargets() {
5858
return normalizationTargets;
5959
}
6060

61+
@Override
62+
public long getPlanSizeMb() {
63+
long total = 0;
64+
for (NormalizationTarget target : normalizationTargets) {
65+
total += target.getRegionSizeMb();
66+
}
67+
return total;
68+
}
69+
6170
@Override
6271
public String toString() {
6372
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/NormalizationPlan.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ enum PlanType {
3434

3535
/** Returns the type of this plan */
3636
PlanType getType();
37+
38+
long getPlanSizeMb();
3739
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.time.Instant;
2323
import java.time.Period;
2424
import java.util.ArrayList;
25-
import java.util.Collection;
2625
import java.util.Collections;
2726
import java.util.LinkedList;
2827
import java.util.List;
@@ -80,10 +79,8 @@ class SimpleRegionNormalizer implements RegionNormalizer, ConfigurationObserver
8079
static final int DEFAULT_MERGE_MIN_REGION_AGE_DAYS = 3;
8180
static final String MERGE_MIN_REGION_SIZE_MB_KEY = "hbase.normalizer.merge.min_region_size.mb";
8281
static final int DEFAULT_MERGE_MIN_REGION_SIZE_MB = 0;
83-
static final String CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY = "hbase.normalizer.merge.plans_size_limit.mb";
84-
static final long DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB = Long.MAX_VALUE;
85-
static final String CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY = "hbase.normalizer.split.plans_size_limit.mb";
86-
static final long DEFAULT_CUMULATIVE_SPLIT_SIZE_LIMIT_MB = Long.MAX_VALUE;
82+
static final String CUMULATIVE_SIZE_LIMIT_MB_KEY = "hbase.normalizer.plans_size_limit.mb";
83+
static final long DEFAULT_CUMULATIVE_SIZE_LIMIT_MB = Long.MAX_VALUE;
8784

8885
private MasterServices masterServices;
8986
private NormalizerConfiguration normalizerConfiguration;
@@ -220,7 +217,7 @@ public List<NormalizationPlan> computePlansForTable(final TableDescriptor tableD
220217
LOG.debug("Computing normalization plan for table: {}, number of regions: {}", table,
221218
ctx.getTableRegions().size());
222219

223-
final List<NormalizationPlan> plans = new ArrayList<>();
220+
List<NormalizationPlan> plans = new ArrayList<>();
224221
int splitPlansCount = 0;
225222
if (proceedWithSplitPlanning) {
226223
List<NormalizationPlan> splitPlans = computeSplitNormalizationPlans(ctx);
@@ -234,19 +231,13 @@ public List<NormalizationPlan> computePlansForTable(final TableDescriptor tableD
234231
plans.addAll(mergePlans);
235232
}
236233

234+
plans = truncateForSize(plans);
235+
237236
LOG.debug("Computed normalization plans for table {}. Total plans: {}, split plans: {}, "
238237
+ "merge plans: {}", table, plans.size(), splitPlansCount, mergePlansCount);
239238
return plans;
240239
}
241240

242-
private long getTotalRegionSizeMB(Collection<NormalizationTarget> targets) {
243-
long total = 0;
244-
for (NormalizationTarget target : targets) {
245-
total += target.getRegionSizeMb();
246-
}
247-
return total;
248-
}
249-
250241
/** Returns size of region in MB and if region is not found than -1 */
251242
private long getRegionSizeMB(RegionInfo hri) {
252243
ServerName sn =
@@ -370,7 +361,6 @@ private List<NormalizationPlan> computeMergeNormalizationPlans(final NormalizeCo
370361
final List<NormalizationPlan> plans = new LinkedList<>();
371362
final List<NormalizationTarget> rangeMembers = new LinkedList<>();
372363
long sumRangeMembersSizeMb;
373-
long cumulativePlansSizeMb = 0;
374364
int current = 0;
375365
for (int rangeStart = 0; rangeStart < ctx.getTableRegions().size() - 1
376366
&& current < ctx.getTableRegions().size();) {
@@ -408,12 +398,7 @@ private List<NormalizationPlan> computeMergeNormalizationPlans(final NormalizeCo
408398
break;
409399
}
410400
if (rangeMembers.size() > 1) {
411-
cumulativePlansSizeMb += getTotalRegionSizeMB(rangeMembers);
412-
if (cumulativePlansSizeMb > normalizerConfiguration.getCumulativeMergePlansSizeLimitMb()) {
413-
return plans;
414-
} else {
415-
plans.add(new MergeNormalizationPlan.Builder().setTargets(rangeMembers).build());
416-
}
401+
plans.add(new MergeNormalizationPlan.Builder().setTargets(rangeMembers).build());
417402
}
418403
}
419404
return plans;
@@ -441,7 +426,6 @@ private List<NormalizationPlan> computeSplitNormalizationPlans(final NormalizeCo
441426
LOG.debug("Table {}, average region size: {} MB", ctx.getTableName(),
442427
String.format("%.3f", avgRegionSize));
443428

444-
long cumulativePlansSizeMb = 0;
445429
final List<NormalizationPlan> plans = new ArrayList<>();
446430
for (final RegionInfo hri : ctx.getTableRegions()) {
447431
if (skipForSplit(ctx.getRegionStates().getRegionState(hri), hri)) {
@@ -454,12 +438,7 @@ private List<NormalizationPlan> computeSplitNormalizationPlans(final NormalizeCo
454438
+ "splitting",
455439
ctx.getTableName(), hri.getRegionNameAsString(), regionSizeMb,
456440
String.format("%.3f", avgRegionSize));
457-
cumulativePlansSizeMb += getRegionSizeMB(hri);
458-
if (cumulativePlansSizeMb > normalizerConfiguration.getCumulativeSplitPlansSizeLimitMb()) {
459-
return plans;
460-
} else {
461-
plans.add(new SplitNormalizationPlan(hri, regionSizeMb));
462-
}
441+
plans.add(new SplitNormalizationPlan(hri, regionSizeMb));
463442
}
464443
}
465444
return plans;
@@ -489,6 +468,27 @@ private boolean isLargeEnoughForMerge(final NormalizerConfiguration normalizerCo
489468
return getRegionSizeMB(regionInfo) >= normalizerConfiguration.getMergeMinRegionSizeMb(ctx);
490469
}
491470

471+
private List<NormalizationPlan> truncateForSize(List<NormalizationPlan> plans) {
472+
if (
473+
normalizerConfiguration.getCumulativePlansSizeLimitMb() != DEFAULT_CUMULATIVE_SIZE_LIMIT_MB
474+
) {
475+
// If we are going to truncate our list of plans, shuffle the split and merge plans together
476+
// so that the merge plans, which are listed last, are not starved out.
477+
List<NormalizationPlan> maybeTruncatedPlans = new ArrayList<>();
478+
Collections.shuffle(plans);
479+
long cumulativeSizeMb = 0;
480+
for (NormalizationPlan plan : plans) {
481+
cumulativeSizeMb += plan.getPlanSizeMb();
482+
if (cumulativeSizeMb < normalizerConfiguration.getCumulativePlansSizeLimitMb()) {
483+
maybeTruncatedPlans.add(plan);
484+
}
485+
}
486+
return maybeTruncatedPlans;
487+
} else {
488+
return plans;
489+
}
490+
}
491+
492492
private static boolean logTraceReason(final BooleanSupplier predicate, final String fmtWhenTrue,
493493
final Object... args) {
494494
final boolean value = predicate.getAsBoolean();
@@ -509,8 +509,7 @@ private static final class NormalizerConfiguration {
509509
private final int mergeMinRegionCount;
510510
private final Period mergeMinRegionAge;
511511
private final long mergeMinRegionSizeMb;
512-
private final long cumulativeMergePlansSizeLimitMb;
513-
private final long cumulativeSplitPlansSizeLimitMb;
512+
private final long cumulativePlansSizeLimitMb;
514513

515514
private NormalizerConfiguration() {
516515
conf = null;
@@ -519,8 +518,7 @@ private NormalizerConfiguration() {
519518
mergeMinRegionCount = DEFAULT_MERGE_MIN_REGION_COUNT;
520519
mergeMinRegionAge = Period.ofDays(DEFAULT_MERGE_MIN_REGION_AGE_DAYS);
521520
mergeMinRegionSizeMb = DEFAULT_MERGE_MIN_REGION_SIZE_MB;
522-
cumulativeMergePlansSizeLimitMb = DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB;
523-
cumulativeSplitPlansSizeLimitMb = DEFAULT_CUMULATIVE_SPLIT_SIZE_LIMIT_MB;
521+
cumulativePlansSizeLimitMb = DEFAULT_CUMULATIVE_SIZE_LIMIT_MB;
524522
}
525523

526524
private NormalizerConfiguration(final Configuration conf,
@@ -531,8 +529,8 @@ private NormalizerConfiguration(final Configuration conf,
531529
mergeMinRegionCount = parseMergeMinRegionCount(conf);
532530
mergeMinRegionAge = parseMergeMinRegionAge(conf);
533531
mergeMinRegionSizeMb = parseMergeMinRegionSizeMb(conf);
534-
cumulativeSplitPlansSizeLimitMb = conf.getLong(CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY, DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB);
535-
cumulativeMergePlansSizeLimitMb = conf.getLong(CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY, DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB);
532+
cumulativePlansSizeLimitMb =
533+
conf.getLong(CUMULATIVE_SIZE_LIMIT_MB_KEY, DEFAULT_CUMULATIVE_SIZE_LIMIT_MB);
536534
logConfigurationUpdated(SPLIT_ENABLED_KEY, currentConfiguration.isSplitEnabled(),
537535
splitEnabled);
538536
logConfigurationUpdated(MERGE_ENABLED_KEY, currentConfiguration.isMergeEnabled(),
@@ -543,8 +541,8 @@ private NormalizerConfiguration(final Configuration conf,
543541
currentConfiguration.getMergeMinRegionAge(), mergeMinRegionAge);
544542
logConfigurationUpdated(MERGE_MIN_REGION_SIZE_MB_KEY,
545543
currentConfiguration.getMergeMinRegionSizeMb(), mergeMinRegionSizeMb);
546-
logConfigurationUpdated(CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY, currentConfiguration.getCumulativeSplitPlansSizeLimitMb(), cumulativeSplitPlansSizeLimitMb);
547-
logConfigurationUpdated(CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY, currentConfiguration.getCumulativeMergePlansSizeLimitMb(), cumulativeMergePlansSizeLimitMb);
544+
logConfigurationUpdated(CUMULATIVE_SIZE_LIMIT_MB_KEY,
545+
currentConfiguration.getCumulativePlansSizeLimitMb(), cumulativePlansSizeLimitMb);
548546
}
549547

550548
public Configuration getConf() {
@@ -608,12 +606,8 @@ public long getMergeMinRegionSizeMb(NormalizeContext context) {
608606
return mergeMinRegionSizeMb;
609607
}
610608

611-
public long getCumulativeSplitPlansSizeLimitMb() {
612-
return cumulativeSplitPlansSizeLimitMb;
613-
}
614-
615-
public long getCumulativeMergePlansSizeLimitMb() {
616-
return cumulativeMergePlansSizeLimitMb;
609+
public long getCumulativePlansSizeLimitMb() {
610+
return cumulativePlansSizeLimitMb;
617611
}
618612
}
619613

hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SplitNormalizationPlan.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ public NormalizationTarget getSplitTarget() {
4545
return splitTarget;
4646
}
4747

48+
@Override
49+
public long getPlanSizeMb() {
50+
return splitTarget.getRegionSizeMb();
51+
}
52+
4853
@Override
4954
public String toString() {
5055
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

hbase-server/src/test/java/org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizer.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
package org.apache.hadoop.hbase.master.normalizer;
1919

2020
import static java.lang.String.format;
21-
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY;
22-
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY;
21+
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.CUMULATIVE_SIZE_LIMIT_MB_KEY;
2322
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.DEFAULT_MERGE_MIN_REGION_AGE_DAYS;
2423
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.MERGE_ENABLED_KEY;
2524
import static org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer.MERGE_MIN_REGION_AGE_DAYS_KEY;
@@ -613,35 +612,34 @@ public void testNormalizerCannotMergeNonAdjacentRegions() {
613612
@Test
614613
public void testMergeSizeLimit() {
615614
conf.setBoolean(SPLIT_ENABLED_KEY, false);
616-
conf.setLong(CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY, 5);
615+
conf.setLong(CUMULATIVE_SIZE_LIMIT_MB_KEY, 5);
617616
final TableName tableName = name.getTableName();
618617
final List<RegionInfo> regionInfos = createRegionInfos(tableName, 6);
619-
final Map<byte[], Integer> regionSizes =
620-
createRegionSizesMap(regionInfos,1, 1, 1, 1, 1, 1);
618+
final Map<byte[], Integer> regionSizes = createRegionSizesMap(regionInfos, 1, 1, 1, 1, 1, 1);
621619
setupMocksForNormalizer(regionSizes, regionInfos);
622620
when(tableDescriptor.getNormalizerTargetRegionSize()).thenReturn(2L);
623621

624622
assertTrue(normalizer.isMergeEnabled());
625623
assertFalse(normalizer.isSplitEnabled());
626-
assertThat(normalizer.computePlansForTable(tableDescriptor),
627-
hasSize(2)); // creates 2 merge plans, even though there are 3 otherwise eligible pairs of regions
624+
// creates 2 merge plans, even though there are 3 otherwise eligible pairs of regions
625+
assertThat(normalizer.computePlansForTable(tableDescriptor), hasSize(2));
628626
}
629627

630628
@Test
631629
public void testSplitSizeLimit() {
632630
conf.setBoolean(MERGE_ENABLED_KEY, false);
633-
conf.setLong(CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY, 10);
631+
conf.setLong(CUMULATIVE_SIZE_LIMIT_MB_KEY, 10);
634632
final TableName tableName = name.getTableName();
635633
final List<RegionInfo> regionInfos = createRegionInfos(tableName, 4);
636-
final Map<byte[], Integer> regionSizes =
637-
createRegionSizesMap(regionInfos, 3, 3, 3, 3);
634+
final Map<byte[], Integer> regionSizes = createRegionSizesMap(regionInfos, 3, 3, 3, 3);
638635
setupMocksForNormalizer(regionSizes, regionInfos);
639636
when(tableDescriptor.getNormalizerTargetRegionSize()).thenReturn(1L);
640637

641638
assertTrue(normalizer.isSplitEnabled());
642639
assertFalse(normalizer.isMergeEnabled());
643-
assertThat(normalizer.computePlansForTable(tableDescriptor),
644-
hasSize(3)); // the plan includes only 3 regions, even though the table has 4 otherwise split-eligible regions
640+
// the plan includes only 3 regions, even though the table has 4 otherwise split-eligible
641+
// regions
642+
assertThat(normalizer.computePlansForTable(tableDescriptor), hasSize(3));
645643
}
646644

647645
@SuppressWarnings("MockitoCast")

0 commit comments

Comments
 (0)