Index: metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java (revision 1245130) +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java (working copy) @@ -70,6 +70,7 @@ import org.apache.hadoop.util.StringUtils; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; @@ -213,10 +214,11 @@ TTransportException tte = null; HadoopShims shim = ShimLoader.getHadoopShims(); boolean useSasl = conf.getBoolVar(ConfVars.METASTORE_USE_THRIFT_SASL); - transport = new TSocket(store.getHost(), store.getPort()); - ((TSocket)transport).setTimeout(1000 * conf.getIntVar(ConfVars. - METASTORE_CLIENT_SOCKET_TIMEOUT)); + boolean useFramedTransport = conf.getBoolVar(ConfVars.METASTORE_USE_THRIFT_FRAMED_TRANSPORT); + int clientSocketTimeout = conf.getIntVar(ConfVars.METASTORE_CLIENT_SOCKET_TIMEOUT); + transport = new TSocket(store.getHost(), store.getPort(), 1000 * clientSocketTimeout); + if (useSasl) { // Wrap thrift connection with SASL for secure connection. try { @@ -246,6 +248,8 @@ LOG.error("Couldn't create client transport", ioe); throw new MetaException(ioe.toString()); } + } else if (useFramedTransport) { + transport = new TFramedTransport(transport); } client = new ThriftHiveMetastore.Client(new TBinaryProtocol(transport)); @@ -267,7 +271,7 @@ LOG.warn("Failed to connect to the MetaStore Server...", e); } else { // Don't print full exception trace if DEBUG is not on. - LOG.warn("Failed to connect to the MetaStore Server..."); + LOG.warn("Failed to connect to the MetaStore Server... " + e.toString()); } } } Index: metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (revision 1245130) +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java (working copy) @@ -115,8 +115,11 @@ import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; +import org.apache.thrift.transport.TFramedTransport; +import org.apache.thrift.transport.TFramedTransport.Factory; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TServerTransport; +import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportFactory; import com.facebook.fb303.FacebookBase; @@ -137,6 +140,23 @@ private static HadoopThriftAuthBridge.Server saslServer; private static boolean useSasl; + private static final class ChainedTTransportFactory extends TTransportFactory { + private final TTransportFactory parentTransFactory; + private final TTransportFactory childTransFactory; + + private ChainedTTransportFactory( + TTransportFactory parentTransFactory, + TTransportFactory childTransFactory) { + this.parentTransFactory = parentTransFactory; + this.childTransFactory = childTransFactory; + } + + @Override + public TTransport getTransport(TTransport trans) { + return childTransFactory.getTransport(parentTransFactory.getTransport(trans)); + } + } + public static class HMSHandler extends FacebookBase implements ThriftHiveMetastore.Iface { public static final Log LOG = HiveMetaStore.LOG; @@ -3639,6 +3659,7 @@ int minWorkerThreads = conf.getIntVar(HiveConf.ConfVars.METASTORESERVERMINTHREADS); int maxWorkerThreads = conf.getIntVar(HiveConf.ConfVars.METASTORESERVERMAXTHREADS); boolean tcpKeepAlive = conf.getBoolVar(HiveConf.ConfVars.METASTORE_TCP_KEEP_ALIVE); + boolean useFramedTransport = conf.getBoolVar(ConfVars.METASTORE_USE_THRIFT_FRAMED_TRANSPORT); useSasl = conf.getBoolVar(HiveConf.ConfVars.METASTORE_USE_THRIFT_SASL); TServerTransport serverTransport = tcpKeepAlive ? @@ -3661,16 +3682,17 @@ // we are in unsecure mode. HMSHandler handler = new HMSHandler("new db based metaserver", conf); if (conf.getBoolVar(ConfVars.METASTORE_EXECUTE_SET_UGI)){ - transFactory = new TUGIContainingTransport.Factory(); + transFactory = useFramedTransport ? + new ChainedTTransportFactory(new TFramedTransport.Factory(), new TUGIContainingTransport.Factory()) + : new TUGIContainingTransport.Factory(); processor = new TUGIBasedProcessor(handler); LOG.info("Starting DB backed MetaStore Server with SetUGI enabled"); - } else{ - transFactory = new TTransportFactory(); + } else { + transFactory = useFramedTransport ? new TFramedTransport.Factory() : new TTransportFactory(); processor = new ThriftHiveMetastore.Processor(handler); LOG.info("Starting DB backed MetaStore Server"); + } } - } - TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport) .processor(processor) .transportFactory(transFactory) Index: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java =================================================================== --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (revision 1245130) +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (working copy) @@ -263,6 +263,7 @@ METASTORE_KERBEROS_PRINCIPAL("hive.metastore.kerberos.principal", "hive-metastore/_HOST@EXAMPLE.COM"), METASTORE_USE_THRIFT_SASL("hive.metastore.sasl.enabled", false), + METASTORE_USE_THRIFT_FRAMED_TRANSPORT("hive.metastore.thrift.framed.transport.enabled", false), METASTORE_CACHE_PINOBJTYPES("hive.metastore.cache.pinobjtypes", "Table,StorageDescriptor,SerDeInfo,Partition,Database,Type,FieldSchema,Order"), METASTORE_CONNECTION_POOLING_TYPE("datanucleus.connectionPoolingType", "DBCP"), METASTORE_VALIDATE_TABLES("datanucleus.validateTables", false),