Hive 在经历十几年的发展,已经获得广泛应用,随着版本升级,不同版本之间的协议接口会发生一些变化,尽管HMS在尽量保持向前兼容,但在大版本变更时,仍然不能保证完全兼容,比如HMS2到HMS3,有关索引(Index)相关的接口变成了约束(constraint),比如下图中左边是HMS3接口定义,右边是HMS2接口定义:
这样当使用Hive 2的Client去访问HMS 3 的服务时候,就会报无效方法(Invalid Method)异常,此时可以通过一个Hive Metastore代理服务来解决。
在具体介绍Hive Metastore代理服务前,需要了解下Hive Metastore服务处理流程:
HMSHandler baseHandler = new HiveMetaStore.HMSHandler("metaserver", conf,false);
IHMSHandler handler = newRetryingHMSHandler(baseHandler, conf);
TProcessor processor = new ThriftHiveMetastore.Processor<>(handler));
final TThreadPoolServer.Args serverArgs = new TThreadPoolServer
.Args(serverTransport)
.transportFactory(new TTransportFactory())
.protocolFactory(new TBinaryProtocol.Factory())
.processor(processor);
TServer server = new TThreadPoolServer(serverArgs);
server.setServerEventHandler(getServerEventHandler());
server.serve();
上述示例代码启动了Hive Metastore的服务,其中两个重要的组件:
TThreadPoolServer:负责请求的监听和派遣
TProcessor:负责执行各RPC接口的实现逻辑
TThreadPoolServer功能介绍
TThreadPoolServer主要负责请求的监听和派遣,当接收到新的请求时,在内部将每个client的请求放入Worker线程池,然后继续下一个请求的监听,而工作线程负责一对一处理每个client的请求,直至处理完毕:
#TThreadPoolServer.class
public class TThreadPoolServer extends TServer {
//private