From d0bcfd2bcb15b9c3706c56a9e48433c6cbdc78a5 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 | 45 +++++++--------------- .../apache/hadoop/hbase/mob/MobCacheConfig.java | 5 --- .../hadoop/hbase/regionserver/HRegionServer.java | 14 ++++--- 3 files changed, 23 insertions(+), 41 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..14ab7a0 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,13 @@ public class CacheConfig { * @param conf hbase configuration */ public CacheConfig(Configuration conf) { - this(conf, true); + this(conf, GLOBAL_BLOCK_CACHE_INSTANCE); } - public CacheConfig(Configuration conf, boolean enableBlockCache) { - this(conf, enableBlockCache, - conf.getBoolean(CACHE_DATA_ON_READ_KEY, DEFAULT_CACHE_DATA_ON_READ), + public CacheConfig(Configuration conf, BlockCache blockCache) { + this(blockCache, 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 +262,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 +646,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..2127e5c 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,16 @@ 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); + + if (this instanceof HMaster && !LoadBalancer.isTablesOnMaster(conf)) { + // no need to instantiate block cache when master not carry table + cacheConfig = new CacheConfig(conf); + } else { + cacheConfig = new CacheConfig(conf, CacheConfig.instantiateBlockCache(conf)); + } + mobCacheConfig = new MobCacheConfig(conf); + uncaughtExceptionHandler = new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { -- 2.7.4