View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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 }