IMetaStoreClient getMS() throws LockException {
    try {
      return Hive.get(conf).getMSC();
    }
    catch(HiveException|MetaException e) {
      String msg = "Unable to reach Hive Metastore: " + e.getMessage();
      LOG.error(msg, e);
      throw new LockException(e);
    }
  }
We do this on every call to make sure TM uses same MS connection as is used by the caller (Driver,
SemanticAnalyzer, etc).  {@code Hive} instances are cached using ThreadLocal and
{@link IMetaStoreClient} is cached within {@code Hive} with additional logic.  Futhermore, this
ensures that multiple threads are not sharing the same Thrift client (which could happen
if we had cached {@link IMetaStoreClient} here.

ThreadLocal gets cleaned up automatically when its thread goes away
https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html.  This is especially
important for threads created by {@link #heartbeatExecutorService} threads.

Embedded {@link DbLockManager} follows the same logic.
@return IMetaStoreClient
@throws LockException on any errors
ql/src/java/org/apache/hadoop/hive/ql/lockmgr/DbTxnManager.java