From 5a51c418216f9e314f693a97fbe4081504e30514 Mon Sep 17 00:00:00 2001 From: Guanghao Zhang Date: Mon, 19 Nov 2018 12:08:51 +0800 Subject: [PATCH] HBASE-21498 Master OOM when SplitTableRegionProcedure new CacheConfig and instantiate a new BlockCache --- .../apache/hadoop/hbase/io/hfile/CacheConfig.java | 44 ++++++---------------- .../apache/hadoop/hbase/mob/MobCacheConfig.java | 5 --- .../hadoop/hbase/regionserver/HRegionServer.java | 13 ++++--- .../hbase/io/hfile/TestBlockCacheReporting.java | 16 ++++---- .../apache/hadoop/hbase/io/hfile/TestPrefetch.java | 1 + .../hfile/TestScannerSelectionUsingKeyRange.java | 1 + .../hbase/regionserver/TestBlocksScanned.java | 2 +- .../hadoop/hbase/regionserver/TestHStoreFile.java | 2 +- 8 files changed, 31 insertions(+), 53 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java index 147568e..a022552 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java @@ -215,7 +215,7 @@ public class CacheConfig { * @param family column family configuration */ public CacheConfig(Configuration conf, ColumnFamilyDescriptor family) { - this(CacheConfig.instantiateBlockCache(conf), + this(GLOBAL_BLOCK_CACHE_INSTANCE, conf.getBoolean(CACHE_DATA_ON_READ_KEY, DEFAULT_CACHE_DATA_ON_READ) && family.isBlockCacheEnabled(), family.isInMemory(), @@ -245,14 +245,10 @@ public class CacheConfig { * @param conf hbase configuration */ public CacheConfig(Configuration conf) { - this(conf, true); - } - - public CacheConfig(Configuration conf, boolean enableBlockCache) { - this(conf, enableBlockCache, + this(GLOBAL_BLOCK_CACHE_INSTANCE, conf.getBoolean(CACHE_DATA_ON_READ_KEY, DEFAULT_CACHE_DATA_ON_READ), DEFAULT_IN_MEMORY, // This is a family-level setting so can't be set - // strictly from conf + // strictly from conf conf.getBoolean(CACHE_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_DATA_ON_WRITE), conf.getBoolean(CACHE_INDEX_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_INDEXES_ON_WRITE), conf.getBoolean(CACHE_BLOOM_BLOCKS_ON_WRITE_KEY, DEFAULT_CACHE_BLOOMS_ON_WRITE), @@ -263,28 +259,6 @@ public class CacheConfig { LOG.info("Created cacheConfig: " + this); } - private CacheConfig(Configuration conf, boolean enableBlockCache, - final boolean cacheDataOnRead, final boolean inMemory, - final boolean cacheDataOnWrite, final boolean cacheIndexesOnWrite, - final boolean cacheBloomsOnWrite, final boolean evictOnClose, - final boolean cacheDataCompressed, final boolean prefetchOnOpen, - final boolean dropBehindCompaction) { - if (enableBlockCache) { - this.blockCache = CacheConfig.instantiateBlockCache(conf); - } else { - this.blockCache = null; - } - this.cacheDataOnRead = cacheDataOnRead; - this.inMemory = inMemory; - this.cacheDataOnWrite = cacheDataOnWrite; - this.cacheIndexesOnWrite = cacheIndexesOnWrite; - this.cacheBloomsOnWrite = cacheBloomsOnWrite; - this.evictOnClose = evictOnClose; - this.cacheDataCompressed = cacheDataCompressed; - this.prefetchOnOpen = prefetchOnOpen; - this.dropBehindCompaction = dropBehindCompaction; - } - /** * Create a block cache configuration with the specified cache and configuration parameters. * @param blockCache reference to block cache, null if completely disabled @@ -669,12 +643,18 @@ public class CacheConfig { * @return The block cache or null. */ public static synchronized BlockCache instantiateBlockCache(Configuration conf) { - if (GLOBAL_BLOCK_CACHE_INSTANCE != null) return GLOBAL_BLOCK_CACHE_INSTANCE; - if (blockCacheDisabled) return null; + if (GLOBAL_BLOCK_CACHE_INSTANCE != null) { + return GLOBAL_BLOCK_CACHE_INSTANCE; + } + if (blockCacheDisabled) { + return null; + } LruBlockCache onHeapCache = getOnHeapCacheInternal(conf); // blockCacheDisabled is set as a side-effect of getL1Internal(), so check it again after the // call. - if (blockCacheDisabled) return null; + if (blockCacheDisabled) { + return null; + } boolean useExternal = conf.getBoolean(EXTERNAL_BLOCKCACHE_KEY, EXTERNAL_BLOCKCACHE_DEFAULT); if (useExternal) { L2_CACHE_INSTANCE = getExternalBlockcache(conf); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobCacheConfig.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobCacheConfig.java index 971bb92..2305eba 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobCacheConfig.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobCacheConfig.java @@ -42,11 +42,6 @@ public class MobCacheConfig extends CacheConfig { instantiateMobFileCache(conf); } - public MobCacheConfig(Configuration conf, boolean needBlockCache) { - super(conf, needBlockCache); - instantiateMobFileCache(conf); - } - /** * Instantiates the MobFileCache. * @param conf The current configuration. diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 24743b9..ee406e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -595,12 +595,15 @@ public class HRegionServer extends HasThread implements // init superusers and add the server principal (if using security) // or process owner as default super user. Superusers.initialize(conf); - regionServerAccounting = new RegionServerAccounting(conf); - boolean isMasterNotCarryTable = - this instanceof HMaster && !LoadBalancer.isTablesOnMaster(conf); - cacheConfig = new CacheConfig(conf, !isMasterNotCarryTable); - mobCacheConfig = new MobCacheConfig(conf, !isMasterNotCarryTable); + + // no need to instantiate global block cache when master not carry table + if (!(this instanceof HMaster && !LoadBalancer.isTablesOnMaster(conf))) { + CacheConfig.instantiateBlockCache(conf); + } + cacheConfig = new CacheConfig(conf); + mobCacheConfig = new MobCacheConfig(conf); + uncaughtExceptionHandler = new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestBlockCacheReporting.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestBlockCacheReporting.java index b8b5e88..19919e0 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestBlockCacheReporting.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestBlockCacheReporting.java @@ -19,8 +19,6 @@ package org.apache.hadoop.hbase.io.hfile; import static org.junit.Assert.*; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.databind.JsonMappingException; import java.io.IOException; import java.util.Map; import java.util.NavigableSet; @@ -84,9 +82,10 @@ public class TestBlockCacheReporting { } @Test - public void testBucketCache() throws JsonGenerationException, JsonMappingException, IOException { + public void testBucketCache() throws IOException { this.conf.set(HConstants.BUCKET_CACHE_IOENGINE_KEY, "offheap"); this.conf.setInt(HConstants.BUCKET_CACHE_SIZE_KEY, 100); + CacheConfig.instantiateBlockCache(this.conf); CacheConfig cc = new CacheConfig(this.conf); assertTrue(cc.getBlockCache() instanceof CombinedBlockCache); logPerBlock(cc.getBlockCache()); @@ -102,7 +101,8 @@ public class TestBlockCacheReporting { } @Test - public void testLruBlockCache() throws JsonGenerationException, JsonMappingException, IOException { + public void testLruBlockCache() throws IOException { + CacheConfig.instantiateBlockCache(this.conf); CacheConfig cc = new CacheConfig(this.conf); assertTrue(cc.isBlockCacheEnabled()); assertTrue(CacheConfig.DEFAULT_IN_MEMORY == cc.isInMemory()); @@ -131,8 +131,7 @@ public class TestBlockCacheReporting { } } - private void logPerFile(final BlockCacheUtil.CachedBlocksByFile cbsbf) - throws JsonGenerationException, JsonMappingException, IOException { + private void logPerFile(final BlockCacheUtil.CachedBlocksByFile cbsbf) throws IOException { for (Map.Entry> e: cbsbf.getCachedBlockStatsByFile().entrySet()) { int count = 0; @@ -154,10 +153,9 @@ public class TestBlockCacheReporting { } } - private BlockCacheUtil.CachedBlocksByFile logPerBlock(final BlockCache bc) - throws JsonGenerationException, JsonMappingException, IOException { + private BlockCacheUtil.CachedBlocksByFile logPerBlock(final BlockCache bc) throws IOException { BlockCacheUtil.CachedBlocksByFile cbsbf = new BlockCacheUtil.CachedBlocksByFile(); - for (CachedBlock cb: bc) { + for (CachedBlock cb : bc) { LOG.info(cb.toString()); LOG.info(BlockCacheUtil.toJSON(bc)); cbsbf.update(cb); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetch.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetch.java index 91a9238..811df14 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetch.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetch.java @@ -64,6 +64,7 @@ public class TestPrefetch { conf.setBoolean(CacheConfig.PREFETCH_BLOCKS_ON_OPEN_KEY, true); fs = HFileSystem.get(conf); CacheConfig.blockCacheDisabled = false; + CacheConfig.instantiateBlockCache(conf); cacheConf = new CacheConfig(conf); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java index c576329..d27b041 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java @@ -124,6 +124,7 @@ public class TestScannerSelectionUsingKeyRange { Scan scan = new Scan(Bytes.toBytes("aaa"), Bytes.toBytes("aaz")); CacheConfig.blockCacheDisabled = false; + CacheConfig.instantiateBlockCache(conf); CacheConfig cacheConf = new CacheConfig(conf); LruBlockCache cache = (LruBlockCache) cacheConf.getBlockCache(); cache.clearCache(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java index 7db34ac..0ba4e97 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java @@ -61,8 +61,8 @@ public class TestBlocksScanned extends HBaseTestCase { @Before public void setUp() throws Exception { super.setUp(); - TEST_UTIL = new HBaseTestingUtility(); + CacheConfig.instantiateBlockCache(TEST_UTIL.getConfiguration()); } @Test diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStoreFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStoreFile.java index 4b8f5f2..30ee3b2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStoreFile.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHStoreFile.java @@ -924,7 +924,6 @@ public class TestHStoreFile extends HBaseTestCase { scan.setTimeRange(27, 50); scan.setColumnFamilyTimeRange(family, 7, 50); assertTrue(scanner.shouldUseScanner(scan, store, Long.MIN_VALUE)); - } @Test @@ -935,6 +934,7 @@ public class TestHStoreFile extends HBaseTestCase { Path baseDir = new Path(new Path(testDir, "7e0102"),"twoCOWEOC"); // Grab the block cache and get the initial hit/miss counts + CacheConfig.instantiateBlockCache(conf); BlockCache bc = new CacheConfig(conf).getBlockCache(); assertNotNull(bc); CacheStats cs = bc.getStats(); -- 2.7.4