From a0b3366a9cc143cba49db3c7ef285b6f19e6109e 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 | 9 ++- .../hbase/regionserver/MetricsRegionSource.java | 6 ++ .../MetricsRegionServerSourceImpl.java | 13 ++++- .../regionserver/MetricsRegionSourceImpl.java | 26 ++++++--- .../hadoop/hbase/regionserver/MetricsRegion.java | 4 ++ .../hbase/regionserver/MetricsRegionServer.java | 4 ++ .../hadoop/hbase/regionserver/RSRpcServices.java | 4 ++ .../regionserver/TestRegionServerMetrics.java | 66 +++++++++++++++++++--- 8 files changed, 113 insertions(+), 19 deletions(-) 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..4e564fe 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,9 @@ public interface MetricsRegionServerSource extends BaseSource { String MUTATE_KEY = "mutate"; String APPEND_KEY = "append"; String REPLAY_KEY = "replay"; - String SCAN_NEXT_KEY = "scanNext"; + String SCAN_SIZE_KEY = "scanSize"; + String SCAN_TIME_KEY = "scanTime"; + 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..ec5434b 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 @@ -43,7 +43,8 @@ public class MetricsRegionServerSourceImpl private final MetricHistogram incrementHisto; private final MetricHistogram appendHisto; private final MetricHistogram replayHisto; - private final MetricHistogram scanNextHisto; + private final MetricHistogram scanSizeHisto; + private final MetricHistogram scanTimeHisto; private final MutableFastCounter slowPut; private final MutableFastCounter slowDelete; @@ -84,7 +85,8 @@ public class MetricsRegionServerSourceImpl slowAppend = getMetricsRegistry().newCounter(SLOW_APPEND_KEY, SLOW_APPEND_DESC, 0L); replayHisto = getMetricsRegistry().newTimeHistogram(REPLAY_KEY); - scanNextHisto = getMetricsRegistry().newTimeHistogram(SCAN_NEXT_KEY); + scanSizeHisto = getMetricsRegistry().newSizeHistogram(SCAN_SIZE_KEY); + scanTimeHisto = getMetricsRegistry().newTimeHistogram(SCAN_TIME_KEY); splitTimeHisto = getMetricsRegistry().newTimeHistogram(SPLIT_KEY); flushTimeHisto = getMetricsRegistry().newTimeHistogram(FLUSH_KEY); @@ -125,7 +127,12 @@ public class MetricsRegionServerSourceImpl @Override public void updateScannerNext(long scanSize) { - scanNextHisto.add(scanSize); + scanSizeHisto.add(scanSize); + } + + @Override + public void updateScannerNextTime(long t) { + scanTimeHisto.add(t); } @Override 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..6d1093d 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 @@ -51,14 +51,16 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { private final String regionGetKey; private final String regionIncrementKey; private final String regionAppendKey; - private final String regionScanNextKey; + private final String regionScanSizeKey; + private final String regionScanTimeKey; private final MutableFastCounter regionPut; private final MutableFastCounter regionDelete; private final MutableFastCounter regionIncrement; private final MutableFastCounter regionAppend; private final MetricHistogram regionGet; - private final MetricHistogram regionScanNext; + private final MetricHistogram regionScanSize; + private final MetricHistogram regionScanTime; private final int hashCode; public MetricsRegionSourceImpl(MetricsRegionWrapper regionWrapper, @@ -94,8 +96,11 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { regionGetKey = regionNamePrefix + MetricsRegionServerSource.GET_KEY; regionGet = registry.newTimeHistogram(regionGetKey); - regionScanNextKey = regionNamePrefix + MetricsRegionServerSource.SCAN_NEXT_KEY; - regionScanNext = registry.newTimeHistogram(regionScanNextKey); + regionScanSizeKey = regionNamePrefix + MetricsRegionServerSource.SCAN_SIZE_KEY; + regionScanSize = registry.newSizeHistogram(regionScanSizeKey); + + regionScanTimeKey = regionNamePrefix + MetricsRegionServerSource.SCAN_TIME_KEY; + regionScanTime = registry.newTimeHistogram(regionScanTimeKey); hashCode = regionWrapper.getRegionHashCode(); } @@ -125,9 +130,11 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { registry.removeMetric(regionIncrementKey); registry.removeMetric(regionAppendKey); registry.removeMetric(regionGetKey); - registry.removeMetric(regionScanNextKey); + registry.removeMetric(regionScanSizeKey); + registry.removeMetric(regionScanTimeKey); registry.removeHistogramMetrics(regionGetKey); - registry.removeHistogramMetrics(regionScanNextKey); + registry.removeHistogramMetrics(regionScanSizeKey); + registry.removeHistogramMetrics(regionScanTimeKey); regionWrapper = null; } @@ -150,7 +157,12 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { @Override public void updateScan(long scanSize) { - regionScanNext.add(scanSize); + regionScanSize.add(scanSize); + } + + @Override + public void updateScanTime(long mills) { + regionScanTime.add(mills); } @Override 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..4754058 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 @@ -348,8 +348,8 @@ public class TestRegionServerMetrics { } @Test - public void testScanNext() throws IOException { - String tableNameString = "testScanNext"; + public void testScanSize() throws IOException { + String tableNameString = "testScanSize"; TableName tableName = TableName.valueOf(tableNameString); byte[] cf = Bytes.toBytes("d"); byte[] qualifier = Bytes.toBytes("qual"); @@ -387,9 +387,9 @@ public class TestRegionServerMetrics { "_table_"+tableNameString + "_region_" + i.getEncodedName()+ "_metric"; - metricsHelper.assertCounter(prefix + "_scanNextNumOps", NUM_SCAN_NEXT, agg); + metricsHelper.assertCounter(prefix + "_scanSizeNumOps", NUM_SCAN_NEXT, agg); } - metricsHelper.assertCounter("ScanNext_num_ops", numScanNext, serverSource); + metricsHelper.assertCounter("ScanSize_num_ops", numScanNext, serverSource); } try (Admin admin = TEST_UTIL.getHBaseAdmin()) { admin.disableTable(tableName); @@ -398,8 +398,58 @@ public class TestRegionServerMetrics { } @Test - public void testScanNextForSmallScan() throws IOException { - String tableNameString = "testScanNextSmall"; + public void testScanTime() throws IOException { + String tableNameString = "testScanTime"; + 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 + "_scanTimeNumOps", NUM_SCAN_NEXT, agg); + } + metricsHelper.assertCounter("ScanTime_num_ops", numScanNext, serverSource); + } + try (Admin admin = TEST_UTIL.getHBaseAdmin()) { + admin.disableTable(tableName); + admin.deleteTable(tableName); + } + } + + @Test + public void testScanSizeForSmallScan() throws IOException { + String tableNameString = "testScanSizeSmall"; TableName tableName = TableName.valueOf(tableNameString); byte[] cf = Bytes.toBytes("d"); byte[] qualifier = Bytes.toBytes("qual"); @@ -437,9 +487,9 @@ public class TestRegionServerMetrics { "_table_"+tableNameString + "_region_" + i.getEncodedName()+ "_metric"; - metricsHelper.assertCounter(prefix + "_scanNextNumOps", NUM_SCAN_NEXT, agg); + metricsHelper.assertCounter(prefix + "_scanSizeNumOps", NUM_SCAN_NEXT, agg); } - metricsHelper.assertCounter("ScanNext_num_ops", numScanNext, serverSource); + metricsHelper.assertCounter("ScanSize_num_ops", numScanNext, serverSource); } try (Admin admin = TEST_UTIL.getHBaseAdmin()) { admin.disableTable(tableName); -- 1.9.3 (Apple Git-50)