From d6f51788af000a5a30560259df869d5dfe26c8d9 Mon Sep 17 00:00:00 2001 From: chenheng Date: Wed, 2 Mar 2016 14:57:56 +0800 Subject: [PATCH] HBASE-15376 ScanNext metric is size-based while every other per-operation metric is time based --- .../regionserver/MetricsRegionServerSource.java | 8 ++++ .../hbase/regionserver/MetricsRegionSource.java | 6 +++ .../MetricsRegionServerSourceImpl.java | 7 +++ .../regionserver/MetricsRegionSourceImpl.java | 12 ++++++ .../hadoop/hbase/regionserver/MetricsRegion.java | 4 ++ .../hbase/regionserver/MetricsRegionServer.java | 4 ++ .../hadoop/hbase/regionserver/RSRpcServices.java | 4 ++ .../regionserver/TestRegionServerMetrics.java | 50 ++++++++++++++++++++++ 8 files changed, 95 insertions(+) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index 9b59af7..dc76bfe 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -95,6 +95,11 @@ public interface MetricsRegionServerSource extends BaseSource { void updateScannerNext(long scanSize); /** + * Update the scan time. + * */ + void updateScannerNextTime(long t); + + /** * Increment the number of slow Puts that have happened. */ void incrSlowPut(); @@ -258,7 +263,10 @@ public interface MetricsRegionServerSource extends BaseSource { String MUTATE_KEY = "mutate"; String APPEND_KEY = "append"; String REPLAY_KEY = "replay"; + @Deprecated String SCAN_NEXT_KEY = "scanNext"; + String SCAN_NEXT_TIME_KEY = "scanNextTime"; + String SLOW_MUTATE_KEY = "slowPutCount"; String SLOW_GET_KEY = "slowGetCount"; String SLOW_DELETE_KEY = "slowDeleteCount"; diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java index 874be31..c89431a 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java @@ -66,6 +66,12 @@ public interface MetricsRegionSource extends Comparable { * @param scanSize Size in bytes of the resulting key values for a next() */ void updateScan(long scanSize); + + /** + * Update time used of resultScanner.next(). + * */ + void updateScanTime(long mills); + /** * Update related counts of increments. */ diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java index 4a2d8cc..07945e6 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java @@ -44,6 +44,7 @@ public class MetricsRegionServerSourceImpl private final MetricHistogram appendHisto; private final MetricHistogram replayHisto; private final MetricHistogram scanNextHisto; + private final MetricHistogram scanNextTimeHisto; private final MutableFastCounter slowPut; private final MutableFastCounter slowDelete; @@ -85,6 +86,7 @@ public class MetricsRegionServerSourceImpl replayHisto = getMetricsRegistry().newTimeHistogram(REPLAY_KEY); scanNextHisto = getMetricsRegistry().newTimeHistogram(SCAN_NEXT_KEY); + scanNextTimeHisto = getMetricsRegistry().newTimeHistogram(SCAN_NEXT_TIME_KEY); splitTimeHisto = getMetricsRegistry().newTimeHistogram(SPLIT_KEY); flushTimeHisto = getMetricsRegistry().newTimeHistogram(FLUSH_KEY); @@ -129,6 +131,11 @@ public class MetricsRegionServerSourceImpl } @Override + public void updateScannerNextTime(long t) { + scanNextTimeHisto.add(t); + } + + @Override public void incrSlowPut() { slowPut.incr(); } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java index c6b7d12..2332df1 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java @@ -52,6 +52,7 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { private final String regionIncrementKey; private final String regionAppendKey; private final String regionScanNextKey; + private final String regionScanNextTimeKey; private final MutableFastCounter regionPut; private final MutableFastCounter regionDelete; @@ -59,6 +60,7 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { private final MutableFastCounter regionAppend; private final MetricHistogram regionGet; private final MetricHistogram regionScanNext; + private final MetricHistogram regionScanNextTime; private final int hashCode; public MetricsRegionSourceImpl(MetricsRegionWrapper regionWrapper, @@ -97,6 +99,9 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { regionScanNextKey = regionNamePrefix + MetricsRegionServerSource.SCAN_NEXT_KEY; regionScanNext = registry.newTimeHistogram(regionScanNextKey); + regionScanNextTimeKey = regionNamePrefix + MetricsRegionServerSource.SCAN_NEXT_TIME_KEY; + regionScanNextTime = registry.newTimeHistogram(regionScanNextTimeKey); + hashCode = regionWrapper.getRegionHashCode(); } @@ -126,8 +131,10 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { registry.removeMetric(regionAppendKey); registry.removeMetric(regionGetKey); registry.removeMetric(regionScanNextKey); + registry.removeMetric(regionScanNextTimeKey); registry.removeHistogramMetrics(regionGetKey); registry.removeHistogramMetrics(regionScanNextKey); + registry.removeHistogramMetrics(regionScanNextTimeKey); regionWrapper = null; } @@ -154,6 +161,11 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { } @Override + public void updateScanTime(long mills) { + regionScanNextTime.add(mills); + } + + @Override public void updateIncrement() { regionIncrement.incr(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java index 48395a3..bdfd1aa 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java @@ -57,6 +57,10 @@ public class MetricsRegion { source.updateScan(scanSize); } + public void updateScanNextTime(final long t) { + source.updateScanTime(t); + } + public void updateAppend() { source.updateAppend(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java index 91f494a..4cf4c44 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java @@ -101,6 +101,10 @@ public class MetricsRegionServer { serverSource.updateScannerNext(scanSize); } + public void updateScannerNextTime(long t) { + serverSource.updateScannerNextTime(t); + } + public void updateSplitTime(long t) { serverSource.updateSplitTime(t); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 7bcde52..3f792ef 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -2652,6 +2652,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, region.startRegionOperation(Operation.SCAN); try { int i = 0; + long before = EnvironmentEdgeManager.currentTime(); synchronized(scanner) { boolean stale = (region.getRegionInfo().getReplicaId() != 0); boolean clientHandlesPartials = @@ -2784,10 +2785,13 @@ public class RSRpcServices implements HBaseRPCErrorHandler, } } region.updateReadRequestsCount(i); + long end = EnvironmentEdgeManager.currentTime(); long responseCellSize = context != null ? context.getResponseCellSize() : 0; region.getMetrics().updateScanNext(responseCellSize); + region.getMetrics().updateScanNextTime(end - before); if (regionServer.metricsRegionServer != null) { regionServer.metricsRegionServer.updateScannerNext(responseCellSize); + regionServer.metricsRegionServer.updateScannerNextTime(end - before); } } finally { region.closeRegionOperation(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java index 1ec0bf7..f30e19e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java @@ -398,6 +398,56 @@ public class TestRegionServerMetrics { } @Test + public void testScanNextTime() throws IOException { + String tableNameString = "testScanNextTime"; + TableName tableName = TableName.valueOf(tableNameString); + byte[] cf = Bytes.toBytes("d"); + byte[] qualifier = Bytes.toBytes("qual"); + byte[] val = Bytes.toBytes("One"); + + List puts = new ArrayList<>(); + for (int insertCount =0; insertCount < 100; insertCount++) { + Put p = new Put(Bytes.toBytes("" + insertCount + "row")); + p.addColumn(cf, qualifier, val); + puts.add(p); + } + try (Table t = TEST_UTIL.createTable(tableName, cf)) { + t.put(puts); + + Scan s = new Scan(); + s.setBatch(1); + s.setCaching(1); + ResultScanner resultScanners = t.getScanner(s); + + for (int nextCount = 0; nextCount < NUM_SCAN_NEXT; nextCount++) { + Result result = resultScanners.next(); + assertNotNull(result); + assertEquals(1, result.size()); + } + } + numScanNext += NUM_SCAN_NEXT; + try (RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) { + for ( HRegionLocation location: locator.getAllRegionLocations()) { + HRegionInfo i = location.getRegionInfo(); + MetricsRegionAggregateSource agg = rs.getRegion(i.getRegionName()) + .getMetrics() + .getSource() + .getAggregateSource(); + String prefix = "namespace_"+NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR+ + "_table_"+tableNameString + + "_region_" + i.getEncodedName()+ + "_metric"; + metricsHelper.assertCounter(prefix + "_scanNextTimeNumOps", NUM_SCAN_NEXT, agg); + } + metricsHelper.assertCounter("ScanNextTime_num_ops", numScanNext, serverSource); + } + try (Admin admin = TEST_UTIL.getHBaseAdmin()) { + admin.disableTable(tableName); + admin.deleteTable(tableName); + } + } + + @Test public void testScanNextForSmallScan() throws IOException { String tableNameString = "testScanNextSmall"; TableName tableName = TableName.valueOf(tableNameString); -- 1.9.3 (Apple Git-50)