From 025a01c40ee2de467a5d2e659e027586c0756e7e Mon Sep 17 00:00:00 2001 From: Reid Chan Date: Tue, 27 Feb 2018 14:38:14 +0800 Subject: [PATCH] HBASE-20064 Disable MOB threads that are running whether you MOB or not --- hbase-common/src/main/resources/hbase-default.xml | 9 ++++++ .../org/apache/hadoop/hbase/master/HMaster.java | 32 ++++++++++++++++++++-- .../org/apache/hadoop/hbase/mob/MobConstants.java | 10 ++++++- .../java/org/apache/hadoop/hbase/mob/MobUtils.java | 9 ++++++ .../hadoop/hbase/regionserver/HRegionServer.java | 11 ++++++-- .../hadoop/hbase/client/TestAsyncAdminBase.java | 2 ++ .../hbase/mob/compactions/TestMobCompactor.java | 1 + src/main/asciidoc/_chapters/hbase_mob.adoc | 3 +- 8 files changed, 70 insertions(+), 7 deletions(-) diff --git a/hbase-common/src/main/resources/hbase-default.xml b/hbase-common/src/main/resources/hbase-default.xml index 61f0461f84..32c3a96c57 100644 --- a/hbase-common/src/main/resources/hbase-default.xml +++ b/hbase-common/src/main/resources/hbase-default.xml @@ -1678,6 +1678,15 @@ possible configurations would overwhelm and obscure the important. 1 Abort only all of the handers have died. + + hbase.mob.enable + false + + Flag to enable mob, false by default to avoid unnecessary threads and chores in master side, + and cache in regionserver side. If true, master will create cleaner chores and compaction + threads for mob files, and regionservers will create a cache for mob file. + + hbase.mob.file.cache.size 1000 diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 8a54264d14..6b90006eb7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -137,6 +137,7 @@ import org.apache.hadoop.hbase.master.replication.ReplicationPeerManager; import org.apache.hadoop.hbase.master.replication.UpdatePeerConfigProcedure; import org.apache.hadoop.hbase.master.snapshot.SnapshotManager; import org.apache.hadoop.hbase.mob.MobConstants; +import org.apache.hadoop.hbase.mob.MobUtils; import org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer; import org.apache.hadoop.hbase.monitoring.MonitoredTask; import org.apache.hadoop.hbase.monitoring.TaskMonitor; @@ -961,8 +962,17 @@ public class HMaster extends HRegionServer implements MasterServices { status.setStatus("Checking ZNode ACLs"); zooKeeper.checkAndSetZNodeAcls(); - status.setStatus("Initializing MOB Cleaner"); - initMobCleaner(); + if (MobUtils.isMobEnable(conf)) { + status.setStatus("Initializing MOB Cleaner"); + initMobCleaner(); + } else { + // If any table has mob column family, master should not let mob turn off. + // Here we do the check. + if (checkColumnFamilyMobEnable()) { + throw new IllegalArgumentException( + "There is MOB column family, not allow to turn MOB off."); + } + } status.setStatus("Calling postStartMaster coprocessors"); if (this.cpHost != null) { @@ -1015,6 +1025,24 @@ public class HMaster extends HRegionServer implements MasterServices { this.mobCompactThread = new MasterMobCompactionThread(this); } + /** + * Check whether any table has mob column family. + * @return true if there is, false otherwise + * @throws IOException ioe possibly happens while getting all TableDescriptors + */ + private boolean checkColumnFamilyMobEnable() throws IOException { + TableDescriptors tds = getTableDescriptors(); + // Can we expect no ioe? since this method only called at master start up. + for (TableDescriptor td : tds.getAll().values()) { + for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) { + if (cfd.isMobEnabled()) { + return true; + } + } + } + return false; + } + /** * Create a {@link MasterMetaBootstrap} instance. */ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobConstants.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobConstants.java index 4afd75b9c6..f26c84b9ee 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobConstants.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobConstants.java @@ -97,7 +97,15 @@ public final class MobConstants { public static final String MOB_COMPACTION_THREADS_MAX = "hbase.mob.compaction.threads.max"; public static final int DEFAULT_MOB_COMPACTION_THREADS_MAX = 1; - private MobConstants() { + /** + * Flag to enable mob, false by default to avoid unnecessary threads and chores in master side, + * and cache in regionserver side. + * If true, master will create cleaner chores and compaction threads for mob files, + * and regionserver will create a cache for mob file too. + */ + public static final String MOB_ENABLE = "hbase.mob.enable"; + + private MobConstants() { } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java index 9fa4e4cf83..445b6e68c2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mob/MobUtils.java @@ -1012,4 +1012,13 @@ public final class MobUtils { id.setDate(dateStr); return skipCompcation; } + + /** + * If mob is enable. + * @param conf configuration file + * @return true is enable, false otherwise + */ + public static boolean isMobEnable(Configuration conf) { + return conf.getBoolean(MobConstants.MOB_ENABLE, false); + } } 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 b306948f68..3619a416e4 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 @@ -114,6 +114,7 @@ import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.LoadBalancer; import org.apache.hadoop.hbase.master.RegionState.State; import org.apache.hadoop.hbase.mob.MobCacheConfig; +import org.apache.hadoop.hbase.mob.MobUtils; import org.apache.hadoop.hbase.procedure.RegionServerProcedureManagerHost; import org.apache.hadoop.hbase.procedure2.RSProcedureCallable; import org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore; @@ -409,7 +410,7 @@ public class HRegionServer extends HasThread implements // Cache configuration and block cache reference protected CacheConfig cacheConfig; // Cache configuration for mob - final MobCacheConfig mobCacheConfig; + MobCacheConfig mobCacheConfig; /** The health check chore. */ private HealthCheckChore healthCheckChore; @@ -592,7 +593,9 @@ public class HRegionServer extends HasThread implements regionServerAccounting = new RegionServerAccounting(conf); cacheConfig = new CacheConfig(conf); - mobCacheConfig = new MobCacheConfig(conf); + if (MobUtils.isMobEnable(conf)) { + mobCacheConfig = new MobCacheConfig(conf); + } uncaughtExceptionHandler = new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { @@ -1032,7 +1035,9 @@ public class HRegionServer extends HasThread implements if (cacheConfig != null && cacheConfig.isBlockCacheEnabled()) { cacheConfig.getBlockCache().shutdown(); } - mobCacheConfig.getMobFileCache().shutdown(); + if (mobCacheConfig != null) { + mobCacheConfig.getMobFileCache().shutdown(); + } if (movedRegionsCleaner != null) { movedRegionsCleaner.stop("Region Server stopping"); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminBase.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminBase.java index 525fa4c93f..2ce3c25581 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminBase.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncAdminBase.java @@ -30,6 +30,7 @@ import org.apache.commons.io.IOUtils; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.mob.MobConstants; import org.apache.hadoop.hbase.util.Bytes; import org.junit.After; import org.junit.AfterClass; @@ -83,6 +84,7 @@ public abstract class TestAsyncAdminBase { TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, 120000); TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 2); TEST_UTIL.getConfiguration().setInt(START_LOG_ERRORS_AFTER_COUNT_KEY, 0); + TEST_UTIL.getConfiguration().setBoolean(MobConstants.MOB_ENABLE, true); TEST_UTIL.startMiniCluster(2); ASYNC_CONN = ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get(); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java index 7c67cd8e79..088a9d35c7 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java @@ -184,6 +184,7 @@ public class TestMobCompactor { TEST_UTIL.getConfiguration().setInt("hbase.client.retries.number", 1); TEST_UTIL.getConfiguration().setInt("hbase.hfile.compaction.discharger.interval", 100); TEST_UTIL.getConfiguration().setBoolean("hbase.online.schema.update.enable", true); + TEST_UTIL.getConfiguration().setBoolean(MobConstants.MOB_ENABLE, true); TEST_UTIL.startMiniCluster(1); pool = createThreadPool(TEST_UTIL.getConfiguration()); conn = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration(), pool); diff --git a/src/main/asciidoc/_chapters/hbase_mob.adoc b/src/main/asciidoc/_chapters/hbase_mob.adoc index 5da0343958..8500e3aaf4 100644 --- a/src/main/asciidoc/_chapters/hbase_mob.adoc +++ b/src/main/asciidoc/_chapters/hbase_mob.adoc @@ -44,7 +44,8 @@ take advantage of MOB, you need to use <>. Optionally, configure the MOB file reader's cache settings for each RegionServer (see <>), then configure specific columns to hold MOB data. Client code does not need to change to take advantage of HBase MOB support. The -feature is transparent to the client. +feature is transparent to the client. But `hbase.mob.enable` should be set true +explicitly enable in configuration, and restart cluster. === Configuring Columns for MOB -- 2.15.0