From eb3ee1488ea59f0f24e228a5f105e5df8118faf8 Mon Sep 17 00:00:00 2001 From: Elliott Neil Clark Date: Tue, 24 Sep 2013 17:00:33 -0700 Subject: [PATCH] HBASE-9653 Add compaction metrics to trunk --- .../regionserver/MetricsRegionServerSource.java | 2 ++ .../regionserver/MetricsRegionServerWrapper.java | 4 ++++ .../hbase/regionserver/MetricsRegionSource.java | 12 ++++++++++++ .../hbase/regionserver/MetricsRegionWrapper.java | 5 +++++ .../regionserver/MetricsRegionServerSourceImpl.java | 6 ++++++ .../hbase/regionserver/MetricsRegionSourceImpl.java | 10 ++++++++++ .../regionserver/TestMetricsRegionSourceImpl.java | 15 +++++++++++++++ .../hbase/regionserver/MetricsRegionSourceImpl.java | 10 ++++++++++ .../regionserver/TestMetricsRegionSourceImpl.java | 15 +++++++++++++++ .../hbase/regionserver/CompactSplitThread.java | 10 ++++++++++ .../apache/hadoop/hbase/regionserver/HRegion.java | 15 ++++++++++++--- .../org/apache/hadoop/hbase/regionserver/HStore.java | 3 ++- .../regionserver/MetricsRegionServerWrapperImpl.java | 18 ++++++++++++++++++ .../hbase/regionserver/MetricsRegionWrapperImpl.java | 15 +++++++++++++++ .../regionserver/MetricsRegionServerWrapperStub.java | 10 ++++++++++ .../hbase/regionserver/MetricsRegionWrapperStub.java | 15 +++++++++++++++ 16 files changed, 161 insertions(+), 4 deletions(-) diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index 48adeb2..f9bf964 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -155,6 +155,8 @@ public interface MetricsRegionServerSource extends BaseSource { String PERCENT_FILES_LOCAL_DESC = "The percent of HFiles that are stored on the local hdfs data node."; String COMPACTION_QUEUE_LENGTH = "compactionQueueLength"; + String LARGE_COMPACTION_QUEUE_LENGTH = "largeCompactionQueueLength"; + String SMALL_COMPACTION_QUEUE_LENGTH = "smallCompactionQueueLength"; String COMPACTION_QUEUE_LENGTH_DESC = "Length of the queue for compactions."; String FLUSH_QUEUE_LENGTH = "flushQueueLength"; String FLUSH_QUEUE_LENGTH_DESC = "Length of the queue for region flushes"; diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java index 0abff25..f1c9ea8 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java @@ -148,6 +148,10 @@ public interface MetricsRegionServerWrapper { */ int getCompactionQueueSize(); + int getSmallCompactionQueueSize(); + + int getLargeCompactionQueueSize(); + /** * Get the size of the flush queue. */ diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java index afff80e..5f5e4ab 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSource.java @@ -27,6 +27,18 @@ public interface MetricsRegionSource extends Comparable { String OPS_SAMPLE_NAME = "ops"; String SIZE_VALUE_NAME = "size"; + String COMPACTIONS_COMPLETED_COUNT = "compactionsCompletedCount"; + String NUM_BYTES_COMPACTED_COUNT = "numBytesCompactedCount"; + String NUM_FILES_COMPACTED_COUNT = "numFilesCompactedCount"; + String + COMPACTIONS_COMPLETED_DESC = + "Number of compactions that have completed."; + String + NUM_BYTES_COMPACTED_DESC = + "Sum of filesize on all files entering a successful compaction"; + String + NUM_FILES_COMPACTED_DESC = + "Number of files that were input for successful compactions"; /** * Close the region's metrics as this region is closing. diff --git hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java index 2c533ea..258043c 100644 --- hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java +++ hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java @@ -68,4 +68,9 @@ public interface MetricsRegionWrapper { */ long getWriteRequestCount(); + long getNumFilesCompacted(); + + long getNumBytesCompacted(); + + long getNumCompactionsCompleted(); } diff --git hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java index 0716c91..52cf361 100644 --- hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java +++ hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java @@ -174,6 +174,12 @@ public class MetricsRegionServerSourceImpl .addGauge(COMPACTION_QUEUE_LENGTH, COMPACTION_QUEUE_LENGTH_DESC, rsWrap.getCompactionQueueSize()) + .addGauge(LARGE_COMPACTION_QUEUE_LENGTH, + COMPACTION_QUEUE_LENGTH_DESC, + rsWrap.getLargeCompactionQueueSize()) + .addGauge(SMALL_COMPACTION_QUEUE_LENGTH, + COMPACTION_QUEUE_LENGTH_DESC, + rsWrap.getSmallCompactionQueueSize()) .addGauge(FLUSH_QUEUE_LENGTH, FLUSH_QUEUE_LENGTH_DESC, rsWrap.getFlushQueueSize()) .addGauge(BLOCK_CACHE_FREE_SIZE, BLOCK_CACHE_FREE_DESC, rsWrap.getBlockCacheFreeSize()) .addGauge(BLOCK_CACHE_COUNT, BLOCK_CACHE_COUNT_DESC, rsWrap.getBlockCacheCount()) diff --git hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java index 385c645..65f43a9 100644 --- hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java +++ hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java @@ -179,6 +179,16 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { mrb.addCounter(regionNamePrefix + MetricsRegionServerSource.WRITE_REQUEST_COUNT, MetricsRegionServerSource.WRITE_REQUEST_COUNT_DESC, this.regionWrapper.getWriteRequestCount()); + mrb.addCounter(regionNamePrefix + MetricsRegionSource.COMPACTIONS_COMPLETED_COUNT, + MetricsRegionSource.COMPACTIONS_COMPLETED_DESC, + this.regionWrapper.getNumCompactionsCompleted()); + mrb.addCounter(regionNamePrefix + MetricsRegionSource.NUM_BYTES_COMPACTED_COUNT, + MetricsRegionSource.NUM_BYTES_COMPACTED_DESC, + this.regionWrapper.getNumBytesCompacted()); + mrb.addCounter(regionNamePrefix + MetricsRegionSource.NUM_FILES_COMPACTED_COUNT, + MetricsRegionSource.NUM_FILES_COMPACTED_DESC, + this.regionWrapper.getNumFilesCompacted()); + } } diff --git hbase-hadoop1-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java hbase-hadoop1-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java index 89c0762..923ed9a 100644 --- hbase-hadoop1-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java +++ hbase-hadoop1-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java @@ -97,5 +97,20 @@ public class TestMetricsRegionSourceImpl { public long getWriteRequestCount() { return 0; //To change body of implemented methods use File | Settings | File Templates. } + + @Override + public long getNumFilesCompacted() { + return 0; + } + + @Override + public long getNumBytesCompacted() { + return 0; + } + + @Override + public long getNumCompactionsCompleted() { + return 0; + } } } diff --git hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java index 05eadfc..41e10c7 100644 --- hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java +++ hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java @@ -180,5 +180,15 @@ public class MetricsRegionSourceImpl implements MetricsRegionSource { mrb.addGauge(Interns.info(regionNamePrefix + MetricsRegionServerSource.STOREFILE_SIZE, MetricsRegionServerSource.STOREFILE_SIZE_DESC), this.regionWrapper.getStoreFileSize()); + mrb.addCounter(Interns.info(regionNamePrefix + MetricsRegionSource.COMPACTIONS_COMPLETED_COUNT, + MetricsRegionSource.COMPACTIONS_COMPLETED_DESC), + this.regionWrapper.getNumCompactionsCompleted()); + mrb.addCounter(Interns.info(regionNamePrefix + MetricsRegionSource.NUM_BYTES_COMPACTED_COUNT, + MetricsRegionSource.NUM_BYTES_COMPACTED_DESC), + this.regionWrapper.getNumBytesCompacted()); + mrb.addCounter(Interns.info(regionNamePrefix + MetricsRegionSource.NUM_FILES_COMPACTED_COUNT, + MetricsRegionSource.NUM_FILES_COMPACTED_DESC), + this.regionWrapper.getNumFilesCompacted()); + } } diff --git hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java index 89c0762..923ed9a 100644 --- hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java +++ hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java @@ -97,5 +97,20 @@ public class TestMetricsRegionSourceImpl { public long getWriteRequestCount() { return 0; //To change body of implemented methods use File | Settings | File Templates. } + + @Override + public long getNumFilesCompacted() { + return 0; + } + + @Override + public long getNumBytesCompacted() { + return 0; + } + + @Override + public long getNumCompactionsCompleted() { + return 0; + } } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java index 1f3bf48..6a054dc 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java @@ -381,6 +381,16 @@ public class CompactSplitThread implements CompactionRequestor { return largeCompactions.getQueue().size() + smallCompactions.getQueue().size(); } + public int getLargeCompactionQueueSize() { + return largeCompactions.getQueue().size(); + } + + + public int getSmallCompactionQueueSize() { + return smallCompactions.getQueue().size(); + } + + private boolean shouldSplitRegion() { return (regionSplitLimit > server.getNumberOfOnlineRegions()); } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 786dd97..963be4c 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -250,8 +250,11 @@ public class HRegion implements HeapSize { // , Writable{ final Counter readRequestsCount = new Counter(); final Counter writeRequestsCount = new Counter(); - //How long operations were blocked by a memstore over highwater. - final Counter updatesBlockedMs = new Counter(); + // Compaction counters + final AtomicLong compactionsFinished = new AtomicLong(0L); + final AtomicLong compactionNumFilesCompacted = new AtomicLong(0L); + final AtomicLong compactionNumBytesCompacted = new AtomicLong(0L); + private final HLog log; private final HRegionFileSystem fs; @@ -5496,8 +5499,14 @@ public class HRegion implements HeapSize { // , Writable{ (isMajor ? majorInProgress : minorInProgress).incrementAndGet(); } - public void reportCompactionRequestEnd(boolean isMajor){ + public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted){ int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet(); + + // metrics + compactionsFinished.incrementAndGet(); + compactionNumFilesCompacted.addAndGet(numFiles); + compactionNumBytesCompacted.addAndGet(filesSizeCompacted); + assert newValue >= 0; } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java index dd82d90..acc32ae 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java @@ -985,6 +985,7 @@ public class HStore implements Store { try { // Commence the compaction. List newFiles = compaction.compact(); + // TODO: get rid of this! if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) { LOG.warn("hbase.hstore.compaction.complete is set to false"); @@ -1333,7 +1334,7 @@ public class HStore implements Store { } private void finishCompactionRequest(CompactionRequest cr) { - this.region.reportCompactionRequestEnd(cr.isMajor()); + this.region.reportCompactionRequestEnd(cr.isMajor(), cr.getFiles().size(), cr.getSize()); if (cr.isOffPeak()) { offPeakCompactionTracker.set(false); cr.setOffPeak(false); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java index f44ea43..3d54103 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java @@ -156,6 +156,24 @@ class MetricsRegionServerWrapperImpl } @Override + public int getSmallCompactionQueueSize() { + //The thread could be zero. if so assume there is no queue. + if (this.regionServer.compactSplitThread == null) { + return 0; + } + return this.regionServer.compactSplitThread.getSmallCompactionQueueSize(); + } + + @Override + public int getLargeCompactionQueueSize() { + //The thread could be zero. if so assume there is no queue. + if (this.regionServer.compactSplitThread == null) { + return 0; + } + return this.regionServer.compactSplitThread.getLargeCompactionQueueSize(); + } + + @Override public int getFlushQueueSize() { //If there is no flusher there should be no queue. if (this.regionServer.cacheFlusher == null) { diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java index 146ed3a..cb4c6c3 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java @@ -103,6 +103,21 @@ public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable return this.region.getWriteRequestsCount(); } + @Override + public long getNumFilesCompacted() { + return this.region.compactionNumFilesCompacted.get(); + } + + @Override + public long getNumBytesCompacted() { + return this.region.compactionNumBytesCompacted.get(); + } + + @Override + public long getNumCompactionsCompleted() { + return this.region.compactionsFinished.get(); + } + public class HRegionMetricsWrapperRunnable implements Runnable { @Override diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java index 9f3f349..60b49b8 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java @@ -136,6 +136,16 @@ public class MetricsRegionServerWrapperStub implements MetricsRegionServerWrappe } @Override + public int getSmallCompactionQueueSize() { + return 0; + } + + @Override + public int getLargeCompactionQueueSize() { + return 0; + } + + @Override public int getFlushQueueSize() { return 412; } diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java index eebec6a..265bfc9 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java @@ -59,4 +59,19 @@ public class MetricsRegionWrapperStub implements MetricsRegionWrapper { public long getWriteRequestCount() { return 106; } + + @Override + public long getNumFilesCompacted() { + return 0; + } + + @Override + public long getNumBytesCompacted() { + return 0; + } + + @Override + public long getNumCompactionsCompleted() { + return 0; + } } -- 1.7.10.2 (Apple Git-33)