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.conf.Configuration;
24 import org.apache.hadoop.conf.Configured;
25 import org.apache.hadoop.hbase.HConstants;
26 import org.apache.hadoop.hbase.HTableDescriptor;
27 import org.apache.hadoop.util.ReflectionUtils;
28
29 import com.google.common.base.Preconditions;
30
31
32
33
34
35
36
37 public abstract class RegionSplitPolicy extends Configured {
38 private static final Class<? extends RegionSplitPolicy>
39 DEFAULT_SPLIT_POLICY_CLASS = IncreasingToUpperBoundRegionSplitPolicy.class;
40
41
42
43
44 protected HRegion region;
45
46
47
48
49
50 protected void configureForRegion(HRegion region) {
51 Preconditions.checkState(
52 this.region == null,
53 "Policy already configured for region {}",
54 this.region);
55
56 this.region = region;
57 }
58
59
60
61
62 protected abstract boolean shouldSplit();
63
64
65
66
67
68
69 protected byte[] getSplitPoint() {
70 byte[] explicitSplitPoint = this.region.getExplicitSplitPoint();
71 if (explicitSplitPoint != null) {
72 return explicitSplitPoint;
73 }
74 Map<byte[], Store> stores = region.getStores();
75
76 byte[] splitPointFromLargestStore = null;
77 long largestStoreSize = 0;
78 for (Store s : stores.values()) {
79 byte[] splitPoint = s.getSplitPoint();
80 long storeSize = s.getSize();
81 if (splitPoint != null && largestStoreSize < storeSize) {
82 splitPointFromLargestStore = splitPoint;
83 largestStoreSize = storeSize;
84 }
85 }
86
87 return splitPointFromLargestStore;
88 }
89
90
91
92
93
94
95
96
97
98 public static RegionSplitPolicy create(HRegion region,
99 Configuration conf) throws IOException {
100
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.getNameAsString() + "'",
124 e);
125 }
126 }
127
128 }