1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.regionserver;
20
21 import java.io.IOException;
22 import java.util.List;
23
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.conf.Configuration;
26 import org.apache.hadoop.fs.Path;
27 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
28 import org.apache.hadoop.hbase.KeyValue.KVComparator;
29 import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;
30 import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;
31 import org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy;
32 import org.apache.hadoop.hbase.regionserver.compactions.DefaultCompactor;
33 import org.apache.hadoop.hbase.regionserver.compactions.CompactionThroughputController;
34 import org.apache.hadoop.hbase.security.User;
35 import org.apache.hadoop.hbase.util.ReflectionUtils;
36
37
38
39
40
41 @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)
42 public class DefaultStoreEngine extends StoreEngine<
43 DefaultStoreFlusher, RatioBasedCompactionPolicy, DefaultCompactor, DefaultStoreFileManager> {
44
45 public static final String DEFAULT_STORE_FLUSHER_CLASS_KEY =
46 "hbase.hstore.defaultengine.storeflusher.class";
47 public static final String DEFAULT_COMPACTOR_CLASS_KEY =
48 "hbase.hstore.defaultengine.compactor.class";
49 public static final String DEFAULT_COMPACTION_POLICY_CLASS_KEY =
50 "hbase.hstore.defaultengine.compactionpolicy.class";
51
52 private static final Class<? extends DefaultStoreFlusher>
53 DEFAULT_STORE_FLUSHER_CLASS = DefaultStoreFlusher.class;
54 private static final Class<? extends DefaultCompactor>
55 DEFAULT_COMPACTOR_CLASS = DefaultCompactor.class;
56 private static final Class<? extends RatioBasedCompactionPolicy>
57 DEFAULT_COMPACTION_POLICY_CLASS = ExploringCompactionPolicy.class;
58
59 @Override
60 public boolean needsCompaction(List<StoreFile> filesCompacting) {
61 return compactionPolicy.needsCompaction(
62 this.storeFileManager.getStorefiles(), filesCompacting);
63 }
64
65 @Override
66 protected void createComponents(
67 Configuration conf, Store store, KVComparator kvComparator) throws IOException {
68 createCompactor(conf, store);
69 createCompactionPolicy(conf, store);
70 createStoreFlusher(conf, store);
71 storeFileManager = new DefaultStoreFileManager(kvComparator, StoreFile.Comparators.SEQ_ID,
72 conf, compactionPolicy.getConf());
73 }
74
75 protected void createCompactor(Configuration conf, Store store) throws IOException {
76 String className = conf.get(DEFAULT_COMPACTOR_CLASS_KEY, DEFAULT_COMPACTOR_CLASS.getName());
77 try {
78 compactor = ReflectionUtils.instantiateWithCustomCtor(className,
79 new Class[] { Configuration.class, Store.class }, new Object[] { conf, store });
80 } catch (Exception e) {
81 throw new IOException("Unable to load configured compactor '" + className + "'", e);
82 }
83 }
84
85 protected void createCompactionPolicy(Configuration conf, Store store) throws IOException {
86 String className = conf.get(
87 DEFAULT_COMPACTION_POLICY_CLASS_KEY, DEFAULT_COMPACTION_POLICY_CLASS.getName());
88 className = conf.get(
89 DEFAULT_COMPACTION_POLICY_CLASS_KEY, DEFAULT_COMPACTION_POLICY_CLASS.getName());
90 try {
91 compactionPolicy = ReflectionUtils.instantiateWithCustomCtor(className,
92 new Class[] { Configuration.class, StoreConfigInformation.class },
93 new Object[] { conf, store });
94 } catch (Exception e) {
95 throw new IOException("Unable to load configured compaction policy '" + className + "'", e);
96 }
97 }
98
99 protected void createStoreFlusher(Configuration conf, Store store) throws IOException {
100 String className = conf.get(
101 DEFAULT_STORE_FLUSHER_CLASS_KEY, DEFAULT_STORE_FLUSHER_CLASS.getName());
102 try {
103 storeFlusher = ReflectionUtils.instantiateWithCustomCtor(className,
104 new Class[] { Configuration.class, Store.class }, new Object[] { conf, store });
105 } catch (Exception e) {
106 throw new IOException("Unable to load configured store flusher '" + className + "'", e);
107 }
108 }
109
110 @Override
111 public CompactionContext createCompaction() {
112 return new DefaultCompactionContext();
113 }
114
115 private class DefaultCompactionContext extends CompactionContext {
116 @Override
117 public boolean select(List<StoreFile> filesCompacting, boolean isUserCompaction,
118 boolean mayUseOffPeak, boolean forceMajor) throws IOException {
119 request = compactionPolicy.selectCompaction(storeFileManager.getStorefiles(),
120 filesCompacting, isUserCompaction, mayUseOffPeak, forceMajor);
121 return request != null;
122 }
123
124 @Override
125 public List<Path> compact(CompactionThroughputController throughputController)
126 throws IOException {
127 return compact(throughputController, null);
128 }
129
130 @Override
131 public List<Path> compact(CompactionThroughputController throughputController, User user)
132 throws IOException {
133 return compactor.compact(request, throughputController, user);
134 }
135
136 @Override
137 public List<StoreFile> preSelect(List<StoreFile> filesCompacting) {
138 return compactionPolicy.preSelectCompactionForCoprocessor(
139 storeFileManager.getStorefiles(), filesCompacting);
140 }
141 }
142
143 }