You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2017/12/21 22:07:25 UTC

hbase git commit: HBASE-19148 Reevaluate default values of configurations

Repository: hbase
Updated Branches:
  refs/heads/master 59baf12c0 -> 4d6b92868


HBASE-19148 Reevaluate default values of configurations

Removed unused:
    <name>hbase.fs.tmp.dir</name>
Added hbase.master.loadbalance.bytable

Edit of description text. Moved stuff around  to put configs beside each
other.

M hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java

 Emit some hbase configs in log on startup.

Signed-off-by: Michael Stack <st...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4d6b9286
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4d6b9286
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4d6b9286

Branch: refs/heads/master
Commit: 4d6b928682cc2a17f3dfd0179fb3fd46fd9e0a1f
Parents: 59baf12
Author: Michael Stack <st...@apache.org>
Authored: Fri Dec 15 17:56:38 2017 -0800
Committer: Michael Stack <st...@apache.org>
Committed: Thu Dec 21 14:07:16 2017 -0800

----------------------------------------------------------------------
 .../src/main/resources/hbase-default.xml        | 177 +++++++++++--------
 .../org/apache/hadoop/hbase/master/HMaster.java |   2 +-
 .../assignment/SplitTableRegionProcedure.java   |   7 +-
 .../hbase/regionserver/wal/AbstractFSWAL.java   |  14 +-
 .../hadoop/hbase/util/ServerCommandLine.java    |  28 ++-
 5 files changed, 140 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/4d6b9286/hbase-common/src/main/resources/hbase-default.xml
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/resources/hbase-default.xml b/hbase-common/src/main/resources/hbase-default.xml
index 7995c41..b42ce3f 100644
--- a/hbase-common/src/main/resources/hbase-default.xml
+++ b/hbase-common/src/main/resources/hbase-default.xml
@@ -63,13 +63,6 @@ possible configurations would overwhelm and obscure the important.
     machine restart.</description>
   </property>
   <property >
-    <name>hbase.fs.tmp.dir</name>
-    <value>/user/${user.name}/hbase-staging</value>
-    <description>A staging directory in default file system (HDFS)
-    for keeping temporary data.
-    </description>
-  </property>
-  <property >
     <name>hbase.cluster.distributed</name>
     <value>false</value>
     <description>The mode the cluster will be in. Possible values are
@@ -146,8 +139,8 @@ possible configurations would overwhelm and obscure the important.
   <property>
     <name>hbase.master.procedurewalcleaner.ttl</name>
     <value>604800000</value>
-    <description>How long a Procedure WAL stays will remain in the
-    {hbase.rootdir}/oldWALs/masterProcedureWALs directory, after which it will be cleaned
+    <description>How long a Procedure WAL will remain in the
+    {hbase.rootdir}/MasterProcedureWALs directory, after which it will be cleaned
     by a Master thread. The value is in milliseconds.</description>
   </property>
   <property>
@@ -166,7 +159,19 @@ possible configurations would overwhelm and obscure the important.
     <value>true</value>
     <description>Whether or not the Master listens to the Master web
       UI port (hbase.master.info.port) and redirects requests to the web
-      UI server shared by the Master and RegionServer.</description>
+      UI server shared by the Master and RegionServer. Config. makes
+      sense when Master is serving Regions (not the default).</description>
+  </property>
+  <property>
+    <name>hbase.master.fileSplitTimeout</name>
+    <value>600000</value>
+    <description>Splitting a region, how long to wait on the file-splitting
+      step before aborting the attempt. Default: 600000. This setting used
+      to be known as hbase.regionserver.fileSplitTimeout in hbase-1.x.
+      Split is now run master-side hence the rename (If a
+      'hbase.master.fileSplitTimeout' setting found, will use it to
+      prime the current 'hbase.master.fileSplitTimeout'
+      Configuration.</description>
   </property>
 
   <!--RegionServer configurations-->
@@ -198,7 +203,10 @@ possible configurations would overwhelm and obscure the important.
     <name>hbase.regionserver.handler.count</name>
     <value>30</value>
     <description>Count of RPC Listener instances spun up on RegionServers.
-    Same property is used by the Master for count of master handlers.</description>
+      Same property is used by the Master for count of master handlers.
+      Too many handlers can be counter-productive. Make it a multiple of
+      CPU count. If mostly read-only, handlers count close to cpu count
+      does well. Start with twice the CPU count and tune from there.</description>
   </property>
   <property>
     <name>hbase.ipc.server.callqueue.handler.factor</name>
@@ -292,31 +300,37 @@ possible configurations would overwhelm and obscure the important.
       Updates are blocked and flushes are forced until size of all memstores
       in a region server hits hbase.regionserver.global.memstore.size.lower.limit.
       The default value in this configuration has been intentionally left empty in order to
-      honor the old hbase.regionserver.global.memstore.upperLimit property if present.</description>
+      honor the old hbase.regionserver.global.memstore.upperLimit property if present.
+    </description>
   </property>
   <property>
     <name>hbase.regionserver.global.memstore.size.lower.limit</name>
     <value></value>
-    <description>Maximum size of all memstores in a region server before flushes are forced.
-      Defaults to 95% of hbase.regionserver.global.memstore.size (0.95).
-      A 100% value for this value causes the minimum possible flushing to occur when updates are
-      blocked due to memstore limiting.
-      The default value in this configuration has been intentionally left empty in order to
-      honor the old hbase.regionserver.global.memstore.lowerLimit property if present.</description>
+    <description>Maximum size of all memstores in a region server before flushes
+      are forced. Defaults to 95% of hbase.regionserver.global.memstore.size
+      (0.95). A 100% value for this value causes the minimum possible flushing
+      to occur when updates are blocked due to memstore limiting. The default
+      value in this configuration has been intentionally left empty in order to
+      honor the old hbase.regionserver.global.memstore.lowerLimit property if
+      present.
+    </description>
   </property>
   <property>
     <name>hbase.systemtables.compacting.memstore.type</name>
     <value>NONE</value>
-    <description>Determines the type of memstore to be used for system tables like META, namespace tables etc.
-    By default NONE is the type and hence we use the default memstore for all the system tables. If we
-    need to use compacting memstore for system tables then set this property to BASIC/EAGER</description>
+    <description>Determines the type of memstore to be used for system tables like
+      META, namespace tables etc. By default NONE is the type and hence we use the
+      default memstore for all the system tables. If we need to use compacting
+      memstore for system tables then set this property to BASIC/EAGER
+    </description>
   </property>
   <property>
     <name>hbase.regionserver.optionalcacheflushinterval</name>
     <value>3600000</value>
     <description>
     Maximum amount of time an edit lives in memory before being automatically flushed.
-    Default 1 hour. Set it to 0 to disable automatic flushing.</description>
+    Default 1 hour. Set it to 0 to disable automatic flushing.
+  </description>
   </property>
   <property>
     <name>hbase.regionserver.dns.interface</name>
@@ -335,19 +349,21 @@ possible configurations would overwhelm and obscure the important.
     <name>hbase.regionserver.region.split.policy</name>
     <value>org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy</value>
     <description>
-      A split policy determines when a region should be split. The various other split policies that
-      are available currently are BusyRegionSplitPolicy, ConstantSizeRegionSplitPolicy, DisabledRegionSplitPolicy,
-      DelimitedKeyPrefixRegionSplitPolicy, KeyPrefixRegionSplitPolicy, and SteppingSplitPolicy.
-      DisabledRegionSplitPolicy blocks manual region splitting.
+      A split policy determines when a region should be split. The various
+      other split policies that are available currently are BusyRegionSplitPolicy,
+      ConstantSizeRegionSplitPolicy, DisabledRegionSplitPolicy,
+      DelimitedKeyPrefixRegionSplitPolicy, KeyPrefixRegionSplitPolicy, and
+      SteppingSplitPolicy. DisabledRegionSplitPolicy blocks manual region splitting.
     </description>
   </property>
   <property>
     <name>hbase.regionserver.regionSplitLimit</name>
     <value>1000</value>
     <description>
-      Limit for the number of regions after which no more region splitting should take place.
-      This is not hard limit for the number of regions but acts as a guideline for the regionserver
-      to stop splitting after a certain limit. Default is set to 1000.
+      Limit for the number of regions after which no more region splitting
+      should take place. This is not hard limit for the number of regions
+      but acts as a guideline for the regionserver to stop splitting after
+      a certain limit. Default is set to 1000.
     </description>
   </property>
 
@@ -357,14 +373,15 @@ possible configurations would overwhelm and obscure the important.
     <value>90000</value>
     <description>ZooKeeper session timeout in milliseconds. It is used in two different ways.
       First, this value is used in the ZK client that HBase uses to connect to the ensemble.
-      It is also used by HBase when it starts a ZK server and it is passed as the 'maxSessionTimeout'. See
-      http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions.
+      It is also used by HBase when it starts a ZK server and it is passed as the 'maxSessionTimeout'.
+      See http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions.
       For example, if an HBase region server connects to a ZK ensemble that's also managed
-      by HBase, then the
-      session timeout will be the one specified by this configuration. But, a region server that connects
-      to an ensemble managed with a different configuration will be subjected that ensemble's maxSessionTimeout. So,
-      even though HBase might propose using 90 seconds, the ensemble can have a max timeout lower than this and
-      it will take precedence. The current default that ZK ships with is 40 seconds, which is lower than HBase's.
+      by HBase, then the session timeout will be the one specified by this configuration.
+      But, a region server that connects to an ensemble managed with a different configuration
+      will be subjected that ensemble's maxSessionTimeout. So, even though HBase might propose
+      using 90 seconds, the ensemble can have a max timeout lower than this and it will take
+      precedence. The current default that ZK ships with is 40 seconds, which is lower than
+      HBase's.
     </description>
   </property>
   <property>
@@ -373,7 +390,8 @@ possible configurations would overwhelm and obscure the important.
     <description>Root ZNode for HBase in ZooKeeper. All of HBase's ZooKeeper
       files that are configured with a relative path will go under this node.
       By default, all of HBase's ZooKeeper file paths are configured with a
-      relative path, so they will all go under this directory unless changed.</description>
+      relative path, so they will all go under this directory unless changed.
+    </description>
   </property>
   <property>
     <name>zookeeper.znode.acl.parent</name>
@@ -1120,6 +1138,26 @@ possible configurations would overwhelm and obscure the important.
     HBase shell.</description>
   </property>
   <property>
+    <name>hbase.coprocessor.master.classes</name>
+    <value></value>
+    <description>A comma-separated list of
+    org.apache.hadoop.hbase.coprocessor.MasterObserver coprocessors that are
+    loaded by default on the active HMaster process. For any implemented
+    coprocessor methods, the listed classes will be called in order. After
+    implementing your own MasterObserver, just put it in HBase's classpath
+    and add the fully qualified class name here.</description>
+  </property>
+  <property>
+      <name>hbase.coprocessor.abortonerror</name>
+      <value>true</value>
+      <description>Set to true to cause the hosting server (master or regionserver)
+      to abort if a coprocessor fails to load, fails to initialize, or throws an
+      unexpected Throwable object. Setting this to false will allow the server to
+      continue execution but the system wide state of the coprocessor in question
+      will become inconsistent as it will be properly executing in only a subset
+      of servers, so this is most useful for debugging only.</description>
+  </property>
+  <property>
     <name>hbase.rest.port</name>
     <value>8080</value>
     <description>The port for the HBase REST server.</description>
@@ -1172,26 +1210,6 @@ possible configurations would overwhelm and obscure the important.
     version is X.X.X-SNAPSHOT"</description>
   </property>
   <property>
-    <name>hbase.coprocessor.master.classes</name>
-    <value></value>
-    <description>A comma-separated list of
-    org.apache.hadoop.hbase.coprocessor.MasterObserver coprocessors that are
-    loaded by default on the active HMaster process. For any implemented
-    coprocessor methods, the listed classes will be called in order. After
-    implementing your own MasterObserver, just put it in HBase's classpath
-    and add the fully qualified class name here.</description>
-  </property>
-  <property>
-      <name>hbase.coprocessor.abortonerror</name>
-      <value>true</value>
-      <description>Set to true to cause the hosting server (master or regionserver)
-      to abort if a coprocessor fails to load, fails to initialize, or throws an
-      unexpected Throwable object. Setting this to false will allow the server to
-      continue execution but the system wide state of the coprocessor in question
-      will become inconsistent as it will be properly executing in only a subset
-      of servers, so this is most useful for debugging only.</description>
-  </property>
-  <property>
     <name>hbase.table.lock.enable</name>
     <value>true</value>
     <description>Set to true to enable locking the table in zookeeper for schema change operations.
@@ -1388,7 +1406,6 @@ possible configurations would overwhelm and obscure the important.
       are NULL, CRC32, CRC32C.
     </description>
   </property>
-
   <property>
     <name>hbase.client.scanner.max.result.size</name>
     <value>2097152</value>
@@ -1398,7 +1415,6 @@ possible configurations would overwhelm and obscure the important.
     With faster and/or high latency networks this value should be increased.
     </description>
   </property>
-
   <property>
     <name>hbase.server.scanner.max.result.size</name>
     <value>104857600</value>
@@ -1408,7 +1424,6 @@ possible configurations would overwhelm and obscure the important.
     This is a safety setting to protect the server from OOM situations.
     </description>
   </property>
-
   <property>
     <name>hbase.status.published</name>
     <value>false</value>
@@ -1447,7 +1462,6 @@ possible configurations would overwhelm and obscure the important.
       Multicast port to use for the status publication by multicast.
     </description>
   </property>
-
   <property>
     <name>hbase.dynamic.jars.dir</name>
     <value>${hbase.rootdir}/lib</value>
@@ -1487,6 +1501,13 @@ possible configurations would overwhelm and obscure the important.
     </description>
   </property>
   <property>
+    <name>hbase.master.loadbalance.bytable</name>
+    <value>false</value>
+    <description>Factor Table name when the balancer runs.
+      Default: false.
+    </description>
+  </property>
+  <property>
     <name>hbase.master.normalizer.class</name>
     <value>org.apache.hadoop.hbase.master.normalizer.SimpleRegionNormalizer</value>
     <description>
@@ -1604,8 +1625,8 @@ possible configurations would overwhelm and obscure the important.
     <name>hbase.security.visibility.mutations.checkauths</name>
     <value>false</value>
     <description>
-      This property if enabled, will check whether the labels in the visibility expression are associated
-      with the user issuing the mutation
+      This property if enabled, will check whether the labels in the visibility
+      expression are associated with the user issuing the mutation
     </description>
   </property>
   <property>
@@ -1633,9 +1654,9 @@ possible configurations would overwhelm and obscure the important.
     <description>
         The maximum number of threads any replication source will use for
         shipping edits to the sinks in parallel. This also limits the number of
-        chunks each replication batch is broken into.
-        Larger values can improve the replication throughput between the master and
-        slave clusters. The default of 10 will rarely need to be changed.
+        chunks each replication batch is broken into. Larger values can improve
+        the replication throughput between the master and slave clusters. The
+        default of 10 will rarely need to be changed.
     </description>
   </property>
   <property>
@@ -1644,22 +1665,22 @@ possible configurations would overwhelm and obscure the important.
     <description>
       By default, in replication we can not make sure the order of operations in slave cluster is
       same as the order in master. If set REPLICATION_SCOPE to 2, we will push edits by the order
-      of written. This configure is to set how long (in ms) we will wait before next checking if a
-      log can not push right now because there are some logs written before it have not been pushed.
-      A larger waiting will decrease the number of queries on hbase:meta but will enlarge the delay
-      of replication. This feature relies on zk-less assignment, so users must set
+      of written. This configuration is to set how long (in ms) we will wait before next checking if
+      a log can NOT be pushed because there are some logs written before it that have yet to be
+      pushed. A larger waiting will decrease the number of queries on hbase:meta but will enlarge
+      the delay of replication. This feature relies on zk-less assignment, so users must set
       hbase.assignment.usezk to false to support it.
     </description>
   </property>
   <!-- Static Web User Filter properties. -->
   <property>
+    <name>hbase.http.staticuser.user</name>
+    <value>dr.stack</value>
     <description>
       The user name to filter as, on static web filters
       while rendering content. An example use is the HDFS
       web UI (user to be used for browsing files).
     </description>
-    <name>hbase.http.staticuser.user</name>
-    <value>dr.stack</value>
   </property>
   <property>
     <name>hbase.regionserver.handler.abort.on.error.percent</name>
@@ -1703,10 +1724,10 @@ possible configurations would overwhelm and obscure the important.
     <value>86400</value>
     <description>
       The period that ExpiredMobFileCleanerChore runs. The unit is second.
-      The default value is one day.
-      The MOB file name uses only the date part of the file creation time in it. We use this
-      time for deciding TTL expiry of the files. So the removal of TTL expired files might be
-      delayed. The max delay might be 24 hrs.
+      The default value is one day. The MOB file name uses only the date part of
+      the file creation time in it. We use this time for deciding TTL expiry of
+      the files. So the removal of TTL expired files might be delayed. The max
+      delay might be 24 hrs.
     </description>
   </property>
   <property>
@@ -1764,14 +1785,14 @@ possible configurations would overwhelm and obscure the important.
     <name>hbase.snapshot.master.timeout.millis</name>
     <value>300000</value>
     <description>
-       Timeout for master for the snapshot procedure execution
+       Timeout for master for the snapshot procedure execution.
     </description>
    </property>
      <property>
     <name>hbase.snapshot.region.timeout</name>
     <value>300000</value>
     <description>
-       Timeout for regionservers to keep threads in snapshot request pool waiting
+       Timeout for regionservers to keep threads in snapshot request pool waiting.
     </description>
    </property>
    <property>

http://git-wip-us.apache.org/repos/asf/hbase/blob/4d6b9286/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
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 e31db82..d0f435b 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
@@ -1399,7 +1399,7 @@ public class HMaster extends HRegionServer implements MasterServices {
         }
       }
 
-      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false);
+      boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", true);
       Map<TableName, Map<ServerName, List<RegionInfo>>> assignmentsByTable =
         this.assignmentManager.getRegionStates().getAssignmentsByTable(!isByTable);
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/4d6b9286/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
index 809d6f3..fd78604 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java
@@ -609,8 +609,11 @@ public class SplitTableRegionProcedure
     // Shutdown the pool
     threadPool.shutdown();
 
-    // Wait for all the tasks to finish
-    long fileSplitTimeout = conf.getLong("hbase.master.fileSplitTimeout", 30000);
+    // Wait for all the tasks to finish.
+    // When splits ran on the RegionServer, how-long-to-wait-configuration was named
+    // hbase.regionserver.fileSplitTimeout. If set, use its value.
+    long fileSplitTimeout = conf.getLong("hbase.master.fileSplitTimeout",
+        conf.getLong("hbase.regionserver.fileSplitTimeout", 600000));
     try {
       boolean stillRunning = !threadPool.awaitTermination(fileSplitTimeout, TimeUnit.MILLISECONDS);
       if (stillRunning) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/4d6b9286/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
index baa7590..d0fe49b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java
@@ -402,12 +402,18 @@ public abstract class AbstractFSWAL<W extends WriterBase> implements WAL {
     }
     this.coprocessorHost = new WALCoprocessorHost(this, conf);
 
-    // Get size to roll log at. Roll at 95% of HDFS block size so we avoid crossing HDFS blocks
-    // (it costs a little x'ing bocks)
+    // Schedule a WAL roll when the WAL is 50% of the HDFS block size. Scheduling at 50% of block
+    // size should make it so WAL rolls before we get to the end-of-block (Block transitions cost
+    // some latency). In hbase-1 we did this differently. We scheduled a roll when we hit 95% of
+    // the block size but experience from the field has it that this was not enough time for the
+    // roll to happen before end-of-block. So the new accounting makes WALs of about the same
+    // size as those made in hbase-1 (to prevent surprise), we now have default block size as
+    // 2 times the DFS default: i.e. 2 * DFS default block size rolling at 50% full will generally
+    // make similar size logs to 1 * DFS default block size rolling at 95% full. See HBASE-19148.
     final long blocksize = this.conf.getLong("hbase.regionserver.hlog.blocksize",
-      CommonFSUtils.getDefaultBlockSize(this.fs, this.walDir));
+      CommonFSUtils.getDefaultBlockSize(this.fs, this.walDir) * 2);
     this.logrollsize =
-      (long) (blocksize * conf.getFloat("hbase.regionserver.logroll.multiplier", 0.95f));
+      (long) (blocksize * conf.getFloat("hbase.regionserver.logroll.multiplier", 0.5f));
 
     boolean maxLogsDefined = conf.get("hbase.regionserver.maxlogs") != null;
     if (maxLogsDefined) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/4d6b9286/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java
index 83ec5ff..f99a090 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ServerCommandLine.java
@@ -26,14 +26,16 @@ import java.util.Locale;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import org.apache.yetus.audience.InterfaceAudience;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
+import org.apache.yetus.audience.InterfaceAudience;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Base class for command lines that start up various HBase daemons.
@@ -84,6 +86,23 @@ public abstract class ServerCommandLine extends Configured implements Tool {
   }
 
   /**
+   * Print into log some of the important hbase attributes.
+   */
+  private static void logHBaseConfigs(Configuration conf) {
+    final String [] keys = new String [] {
+      // Expand this list as you see fit.
+      "hbase.tmp.dir",
+      HConstants.HBASE_DIR,
+      HConstants.CLUSTER_DISTRIBUTED,
+      HConstants.ZOOKEEPER_QUORUM,
+
+    };
+    for (String key: keys) {
+      LOG.info(key + ": " + conf.get(key));
+    }
+  }
+
+  /**
    * Logs information about the currently running JVM process including
    * the environment variables. Logging of env vars can be disabled by
    * setting {@code "hbase.envvars.logging.disabled"} to {@code "true"}.
@@ -92,6 +111,8 @@ public abstract class ServerCommandLine extends Configured implements Tool {
    * to comma separated list of such substrings.
    */
   public static void logProcessInfo(Configuration conf) {
+    logHBaseConfigs(conf);
+
     // log environment variables unless asked not to
     if (conf == null || !conf.getBoolean("hbase.envvars.logging.disabled", false)) {
       Set<String> skipWords = new HashSet<>(DEFAULT_SKIP_WORDS);
@@ -114,6 +135,7 @@ public abstract class ServerCommandLine extends Configured implements Tool {
         LOG.info("env:"+entry);
       }
     }
+
     // and JVM info
     logJVMInfo();
   }