Skip to content

Commit d285c6b

Browse files
ddupginfraio
authored andcommitted
HBASE-24416 RegionNormalizer spliting region should not be limited by hbase.normalizer.min.region.count (#1770)
Signed-off-by: Guanghao Zhang <zghao@apache.org>
1 parent 51a8402 commit d285c6b

File tree

4 files changed

+69
-19
lines changed

4 files changed

+69
-19
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.ArrayList;
2323
import java.util.List;
2424
import java.util.Objects;
25+
2526
import org.apache.hadoop.hbase.RegionMetrics;
2627
import org.apache.hadoop.hbase.ServerName;
2728
import org.apache.hadoop.hbase.Size;
@@ -42,8 +43,14 @@
4243
@InterfaceAudience.Private
4344
public abstract class AbstractRegionNormalizer implements RegionNormalizer {
4445
private static final Logger LOG = LoggerFactory.getLogger(AbstractRegionNormalizer.class);
46+
47+
public static final String HBASE_REGION_NORMALIZER_MIN_REGION_COUNT_KEY =
48+
"hbase.normalizer.min.region.count";
49+
public static final int HBASE_REGION_NORMALIZER_MIN_REGION_COUNT_DEFAULT = 3;
50+
4551
protected MasterServices masterServices;
4652
protected MasterRpcServices masterRpcServices;
53+
protected int minRegionCount;
4754

4855
/**
4956
* Set the master service.
@@ -52,6 +59,9 @@ public abstract class AbstractRegionNormalizer implements RegionNormalizer {
5259
@Override
5360
public void setMasterServices(MasterServices masterServices) {
5461
this.masterServices = masterServices;
62+
minRegionCount = masterServices.getConfiguration().getInt(
63+
HBASE_REGION_NORMALIZER_MIN_REGION_COUNT_KEY,
64+
HBASE_REGION_NORMALIZER_MIN_REGION_COUNT_DEFAULT);
5565
}
5666

5767
@Override

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
import java.util.List;
2424
import java.util.concurrent.TimeUnit;
2525
import org.apache.hadoop.conf.Configuration;
26-
import org.apache.hadoop.hbase.HBaseConfiguration;
2726
import org.apache.hadoop.hbase.HBaseIOException;
2827
import org.apache.hadoop.hbase.TableName;
2928
import org.apache.hadoop.hbase.client.RegionInfo;
29+
import org.apache.hadoop.hbase.master.MasterServices;
3030
import org.apache.yetus.audience.InterfaceAudience;
3131
import org.slf4j.Logger;
3232
import org.slf4j.LoggerFactory;
@@ -63,13 +63,13 @@
6363
public class MergeNormalizer extends AbstractRegionNormalizer {
6464
private static final Logger LOG = LoggerFactory.getLogger(MergeNormalizer.class);
6565

66-
private int minRegionCount;
6766
private int minRegionAge;
6867
private static long[] skippedCount = new long[NormalizationPlan.PlanType.values().length];
6968

70-
public MergeNormalizer() {
71-
Configuration conf = HBaseConfiguration.create();
72-
minRegionCount = conf.getInt("hbase.normalizer.min.region.count", 3);
69+
@Override
70+
public void setMasterServices(MasterServices masterServices) {
71+
super.setMasterServices(masterServices);
72+
Configuration conf = masterServices.getConfiguration();
7373
minRegionAge = conf.getInt("hbase.normalizer.min.region.merge.age", 3);
7474
}
7575

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

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import java.util.Collections;
2323
import java.util.Comparator;
2424
import java.util.List;
25-
import org.apache.hadoop.hbase.HBaseConfiguration;
25+
2626
import org.apache.hadoop.hbase.HBaseIOException;
2727
import org.apache.hadoop.hbase.TableName;
2828
import org.apache.hadoop.hbase.client.RegionInfo;
@@ -51,13 +51,8 @@
5151
public class SimpleRegionNormalizer extends AbstractRegionNormalizer {
5252

5353
private static final Logger LOG = LoggerFactory.getLogger(SimpleRegionNormalizer.class);
54-
private int minRegionCount;
5554
private static long[] skippedCount = new long[NormalizationPlan.PlanType.values().length];
5655

57-
public SimpleRegionNormalizer() {
58-
minRegionCount = HBaseConfiguration.create().getInt("hbase.normalizer.min.region.count", 3);
59-
}
60-
6156
@Override
6257
public void planSkipped(RegionInfo hri, PlanType type) {
6358
skippedCount[type.ordinal()]++;
@@ -112,11 +107,7 @@ public List<NormalizationPlan> computePlanForTable(TableName table) throws HBase
112107
List<RegionInfo> tableRegions =
113108
masterServices.getAssignmentManager().getRegionStates().getRegionsOfTable(table);
114109

115-
if (tableRegions == null || tableRegions.size() < minRegionCount) {
116-
int nrRegions = tableRegions == null ? 0 : tableRegions.size();
117-
LOG.debug("Table {} has {} regions, required min number of regions for normalizer to run is "
118-
+ "{}, not running normalizer",
119-
table, nrRegions, minRegionCount);
110+
if (tableRegions == null) {
120111
return null;
121112
}
122113

@@ -131,9 +122,15 @@ public List<NormalizationPlan> computePlanForTable(TableName table) throws HBase
131122
}
132123

133124
if (mergeEnabled) {
134-
List<NormalizationPlan> mergePlans = getMergeNormalizationPlan(table);
135-
if (mergePlans != null) {
136-
plans.addAll(mergePlans);
125+
if (tableRegions.size() < minRegionCount) {
126+
LOG.debug("Table {} has {} regions, required min number of regions for normalizer to run" +
127+
" is {}, not running normalizer",
128+
table, tableRegions.size(), minRegionCount);
129+
} else {
130+
List<NormalizationPlan> mergePlans = getMergeNormalizationPlan(table);
131+
if (mergePlans != null) {
132+
plans.addAll(mergePlans);
133+
}
137134
}
138135
}
139136
if (plans.isEmpty()) {

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import static java.lang.String.format;
2121
import static org.junit.Assert.assertEquals;
22+
import static org.junit.Assert.assertNotNull;
2223
import static org.junit.Assert.assertNull;
2324
import static org.junit.Assert.assertTrue;
2425
import static org.mockito.ArgumentMatchers.any;
@@ -30,7 +31,10 @@
3031
import java.util.LinkedList;
3132
import java.util.List;
3233
import java.util.Map;
34+
35+
import org.apache.hadoop.conf.Configuration;
3336
import org.apache.hadoop.hbase.HBaseClassTestRule;
37+
import org.apache.hadoop.hbase.HBaseConfiguration;
3438
import org.apache.hadoop.hbase.HBaseIOException;
3539
import org.apache.hadoop.hbase.RegionMetrics;
3640
import org.apache.hadoop.hbase.ServerName;
@@ -526,6 +530,45 @@ public void testSplitWithTargetRegionSize() throws Exception {
526530
assertEquals(hri2, ((MergeNormalizationPlan) plan).getSecondRegion());
527531
}
528532

533+
@Test
534+
public void testSplitIfTooFewRegions() throws HBaseIOException {
535+
final TableName tableName = TableName.valueOf(name.getMethodName());
536+
List<RegionInfo> RegionInfo = new ArrayList<>();
537+
Map<byte[], Integer> regionSizes = new HashMap<>();
538+
539+
RegionInfo hri1 = RegionInfoBuilder.newBuilder(tableName)
540+
.setStartKey(Bytes.toBytes("aaa"))
541+
.setEndKey(Bytes.toBytes("bbb"))
542+
.build();
543+
RegionInfo.add(hri1);
544+
regionSizes.put(hri1.getRegionName(), 1);
545+
546+
RegionInfo hri2 = RegionInfoBuilder.newBuilder(tableName)
547+
.setStartKey(Bytes.toBytes("bbb"))
548+
.setEndKey(Bytes.toBytes("ccc"))
549+
.build();
550+
RegionInfo.add(hri2);
551+
regionSizes.put(hri2.getRegionName(), 1);
552+
// the third region is huge one
553+
RegionInfo hri3 = RegionInfoBuilder.newBuilder(tableName)
554+
.setStartKey(Bytes.toBytes("ccc"))
555+
.setEndKey(Bytes.toBytes("ddd"))
556+
.build();
557+
RegionInfo.add(hri3);
558+
regionSizes.put(hri3.getRegionName(), 10);
559+
560+
setupMocksForNormalizer(regionSizes, RegionInfo);
561+
562+
Configuration configuration = HBaseConfiguration.create();
563+
configuration.setInt(AbstractRegionNormalizer.HBASE_REGION_NORMALIZER_MIN_REGION_COUNT_KEY, 4);
564+
when(masterServices.getConfiguration()).thenReturn(configuration);
565+
566+
List<NormalizationPlan> plans = normalizer.computePlanForTable(tableName);
567+
assertNotNull(plans);
568+
NormalizationPlan plan = plans.get(0);
569+
assertEquals(hri3, ((SplitNormalizationPlan) plan).getRegionInfo());
570+
}
571+
529572
@SuppressWarnings("MockitoCast")
530573
private void setupMocksForNormalizer(Map<byte[], Integer> regionSizes,
531574
List<RegionInfo> RegionInfo) {

0 commit comments

Comments
 (0)