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.Closeable;
22 import java.io.IOException;
23 import java.util.HashMap;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.concurrent.ConcurrentHashMap;
27 import java.util.concurrent.ScheduledExecutorService;
28 import java.util.concurrent.ScheduledFuture;
29 import java.util.concurrent.TimeUnit;
30
31 import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
32 import org.apache.hadoop.hbase.HConstants;
33 import org.apache.hadoop.hbase.TableName;
34 import org.apache.hadoop.hbase.classification.InterfaceAudience;
35 import org.apache.hadoop.metrics2.MetricsExecutor;
36
37 import com.google.common.collect.Sets;
38
39 @InterfaceAudience.Private
40 public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggregate, Closeable {
41 private final HRegionServer regionServer;
42 private ScheduledExecutorService executor;
43 private Runnable runnable;
44 private long period;
45 private ScheduledFuture<?> tableMetricsUpdateTask;
46 private ConcurrentHashMap<TableName, MetricsTableValues> metricsTableMap = new ConcurrentHashMap<>();
47
48 public MetricsTableWrapperAggregateImpl(final HRegionServer regionServer) {
49 this.regionServer = regionServer;
50 this.period = regionServer.conf.getLong(HConstants.REGIONSERVER_METRICS_PERIOD,
51 HConstants.DEFAULT_REGIONSERVER_METRICS_PERIOD) + 1000;
52 this.executor = CompatibilitySingletonFactory.getInstance(MetricsExecutor.class).getExecutor();
53 this.runnable = new TableMetricsWrapperRunnable();
54 this.tableMetricsUpdateTask = this.executor.scheduleWithFixedDelay(this.runnable, period, this.period,
55 TimeUnit.MILLISECONDS);
56 }
57
58 public class TableMetricsWrapperRunnable implements Runnable {
59
60 @Override
61 public void run() {
62 Map<TableName, MetricsTableValues> localMetricsTableMap = new HashMap<>();
63
64 for (Region r : regionServer.getOnlineRegionsLocalContext()) {
65 TableName tbl= r.getTableDesc().getTableName();
66 MetricsTableValues metricsTable = localMetricsTableMap.get(tbl);
67 if (metricsTable == null) {
68 metricsTable = new MetricsTableValues();
69 localMetricsTableMap.put(tbl, metricsTable);
70 }
71 long tempStorefilesSize = 0;
72 for (Store store : r.getStores()) {
73 tempStorefilesSize += store.getStorefilesSize();
74 }
75 metricsTable.setMemstoresSize(metricsTable.getMemstoresSize() + r.getMemstoreSize());
76 metricsTable.setStoreFilesSize(metricsTable.getStoreFilesSize() + tempStorefilesSize);
77 metricsTable
78 .setTableSize(metricsTable.getMemstoresSize() + metricsTable.getStoreFilesSize());
79 metricsTable
80 .setReadRequestsCount(metricsTable.getReadRequestsCount() + r.getReadRequestsCount());
81 metricsTable.setWriteRequestsCount(
82 metricsTable.getWriteRequestsCount() + r.getWriteRequestsCount());
83 metricsTable.setTotalRequestsCount(
84 metricsTable.getReadRequestsCount() + metricsTable.getWriteRequestsCount());
85 metricsTable.setRegionCount(metricsTable.getRegionCount() + 1);
86 }
87
88 for(Map.Entry<TableName, MetricsTableValues> entry : localMetricsTableMap.entrySet()) {
89 TableName tbl = entry.getKey();
90 if (metricsTableMap.get(tbl) == null) {
91 MetricsTableSource tableSource = CompatibilitySingletonFactory
92 .getInstance(MetricsRegionServerSourceFactory.class).createTable(tbl.getNameAsString(),
93 MetricsTableWrapperAggregateImpl.this);
94 CompatibilitySingletonFactory
95 .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate()
96 .register(tbl.getNameAsString(), tableSource);
97 }
98 metricsTableMap.put(entry.getKey(), entry.getValue());
99 }
100 Set<TableName> existingTableNames = Sets.newHashSet(metricsTableMap.keySet());
101 existingTableNames.removeAll(localMetricsTableMap.keySet());
102 MetricsTableAggregateSource agg = CompatibilitySingletonFactory
103 .getInstance(MetricsRegionServerSourceFactory.class).getTableAggregate();
104 for (TableName table : existingTableNames) {
105 agg.deregister(table.getNameAsString());
106 if (metricsTableMap.get(table) != null) {
107 metricsTableMap.remove(table);
108 }
109 }
110 }
111 }
112
113 @Override
114 public long getReadRequestsCount(String table) {
115 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
116 if (metricsTable == null) {
117 return 0;
118 }
119 return metricsTable.getReadRequestsCount();
120 }
121
122 @Override
123 public long getWriteRequestsCount(String table) {
124 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
125 if (metricsTable == null) {
126 return 0;
127 }
128 return metricsTable.getWriteRequestsCount();
129 }
130
131 @Override
132 public long getTotalRequestsCount(String table) {
133 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
134 if (metricsTable == null) {
135 return 0;
136 }
137 return metricsTable.getTotalRequestsCount();
138 }
139
140 @Override
141 public long getMemstoresSize(String table) {
142 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
143 if (metricsTable == null) {
144 return 0;
145 }
146 return metricsTable.getMemstoresSize();
147 }
148
149 @Override
150 public long getStoreFilesSize(String table) {
151 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
152 if (metricsTable == null) {
153 return 0;
154 }
155 return metricsTable.getStoreFilesSize();
156 }
157
158 @Override
159 public long getTableSize(String table) {
160 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
161 if (metricsTable == null) {
162 return 0;
163 }
164 return metricsTable.getTableSize();
165 }
166
167 @Override
168 public long getNumRegions(String table) {
169 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
170 if (metricsTable == null) {
171 return 0;
172 }
173 return metricsTable.regionCount;
174 }
175
176 @Override
177 public long getAvgRegionSize(String table) {
178 MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table));
179 if (metricsTable == null) {
180 return 0;
181 }
182 return metricsTable.regionCount == 0 ? 0
183 : (metricsTable.getMemstoresSize() + metricsTable.getStoreFilesSize())
184 / metricsTable.getRegionCount();
185 }
186
187 @Override
188 public void close() throws IOException {
189 tableMetricsUpdateTask.cancel(true);
190 }
191
192 private static class MetricsTableValues {
193
194 private long totalRequestsCount;
195 private long readRequestsCount;
196 private long writeRequestsCount;
197 private long memstoresSize;
198 private long storeFilesSize;
199 private long tableSize;
200 private long regionCount;
201
202 public long getTotalRequestsCount() {
203 return totalRequestsCount;
204 }
205
206 public void setTotalRequestsCount(long totalRequestsCount) {
207 this.totalRequestsCount = totalRequestsCount;
208 }
209
210 public long getReadRequestsCount() {
211 return readRequestsCount;
212 }
213
214 public void setReadRequestsCount(long readRequestsCount) {
215 this.readRequestsCount = readRequestsCount;
216 }
217
218 public long getWriteRequestsCount() {
219 return writeRequestsCount;
220 }
221
222 public void setWriteRequestsCount(long writeRequestsCount) {
223 this.writeRequestsCount = writeRequestsCount;
224 }
225
226 public long getMemstoresSize() {
227 return memstoresSize;
228 }
229
230 public void setMemstoresSize(long memstoresSize) {
231 this.memstoresSize = memstoresSize;
232 }
233
234 public long getStoreFilesSize() {
235 return storeFilesSize;
236 }
237
238 public void setStoreFilesSize(long storeFilesSize) {
239 this.storeFilesSize = storeFilesSize;
240 }
241
242 public long getTableSize() {
243 return tableSize;
244 }
245
246 public void setTableSize(long tableSize) {
247 this.tableSize = tableSize;
248 }
249
250 public long getRegionCount() {
251 return regionCount;
252 }
253
254 public void setRegionCount(long regionCount) {
255 this.regionCount = regionCount;
256 }
257 }
258
259 }