1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver;
19
20 import java.io.IOException;
21 import java.util.Map;
22
23 import org.apache.hadoop.classification.InterfaceAudience;
24 import org.apache.hadoop.conf.Configuration;
25 import org.apache.hadoop.conf.Configured;
26 import org.apache.hadoop.hbase.HConstants;
27 import org.apache.hadoop.hbase.HTableDescriptor;
28 import org.apache.hadoop.util.ReflectionUtils;
29
30 import com.google.common.base.Preconditions;
31
32
33
34
35
36
37
38 @InterfaceAudience.Private
39 public abstract class RegionSplitPolicy extends Configured {
40 private static final Class<? extends RegionSplitPolicy>
41 DEFAULT_SPLIT_POLICY_CLASS = IncreasingToUpperBoundRegionSplitPolicy.class;
42
43
44
45
46 protected HRegion region;
47
48
49
50
51
52 protected void configureForRegion(HRegion region) {
53 Preconditions.checkState(
54 this.region == null,
55 "Policy already configured for region {}",
56 this.region);
57
58 this.region = region;
59 }
60
61
62
63
64 protected abstract boolean shouldSplit();
65
66
67
68
69
70
71 protected byte[] getSplitPoint() {
72 byte[] explicitSplitPoint = this.region.getExplicitSplitPoint();
73 if (explicitSplitPoint != null) {
74 return explicitSplitPoint;
75 }
76 Map<byte[], Store> stores = region.getStores();
77
78 byte[] splitPointFromLargestStore = null;
79 long largestStoreSize = 0;
80 for (Store s : stores.values()) {
81 byte[] splitPoint = s.getSplitPoint();
82 long storeSize = s.getSize();
83 if (splitPoint != null && largestStoreSize < storeSize) {
84 splitPointFromLargestStore = splitPoint;
85 largestStoreSize = storeSize;
86 }
87 }
88
89 return splitPointFromLargestStore;
90 }
91
92
93
94
95
96
97
98
99 public static RegionSplitPolicy create(HRegion region,
100 Configuration conf) throws IOException {
101 Class<? extends RegionSplitPolicy> clazz = getSplitPolicyClass(
102 region.getTableDesc(), conf);
103 RegionSplitPolicy policy = ReflectionUtils.newInstance(clazz, conf);
104 policy.configureForRegion(region);
105 return policy;
106 }
107
108 static Class<? extends RegionSplitPolicy> getSplitPolicyClass(
109 HTableDescriptor htd, Configuration conf) throws IOException {
110 String className = htd.getRegionSplitPolicyClassName();
111 if (className == null) {
112 className = conf.get(HConstants.HBASE_REGION_SPLIT_POLICY_KEY,
113 DEFAULT_SPLIT_POLICY_CLASS.getName());
114 }
115
116 try {
117 Class<? extends RegionSplitPolicy> clazz =
118 Class.forName(className).asSubclass(RegionSplitPolicy.class);
119 return clazz;
120 } catch (Exception e) {
121 throw new IOException(
122 "Unable to load configured region split policy '" +
123 className + "' for table '" + htd.getTableName() + "'",
124 e);
125 }
126 }
127 }