美文网首页
Metastore服务端架构

Metastore服务端架构

作者: 此间少年仍犹在 | 来源:发表于2019-02-25 14:38 被阅读0次
    Metastore Internal
    1、HiveMetastore

     HiveMetastore是Metastore的Thrift程序,Thrift文件为hive_metastore.thrift,Thrift服务接口文件为ThriftHiveMetastore.java。
     首先,要理解Thrift服务模型和概念,对应服务模型,再理解下面的Metastore Thrift服务逻辑。


    Thrift通信协议栈

    Thrift协议栈简介:
    1)底层IO模块,负责实际的数据传输,包括Socket,文件,或者压缩数据流等。
    2)TTransport负责以字节流方式发送和接收Message,是底层IO模块在Thrift框架中的实现,每一个底层IO模块都会有一个对应TTransport来负责Thrift的字节流(Byte Stream)数据在该IO模块上的传输。例如TSocket对应Socket传输,TFileTransport对应文件传输。
    3)TProtocol主要负责结构化数据组装成Message,或者从Message结构中读出结构化数据。TProtocol将一个有类型的数据转化为字节流以交给TTransport进行传输,或者从TTransport中读取一定长度的字节数据转化为特定类型的数据。如int32会被TBinaryProtocol Encode为一个四字节的字节数据,或者TBinaryProtocol从TTransport中取出四个字节的数据Decode为int32。
    4)TServer负责接收Client的请求,并将请求转发到Processor进行处理。TServer主要任务就是高效的接受Client的请求,特别是在高并发请求的情况下快速完成请求。
    5)Processor(或者TProcessor)负责对Client的请求做出相应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理步骤。Processor是服务器端从Thrift框架转入用户逻辑的关键流程。Processor同时也负责向Message结构中写入数据或者读出数据。
     注意下面代码中将handler封装进processor,我的理解handler是metastore服务逻辑核Thrift服务模型的一个桥梁。

      public static void startMetaStore(int port, HadoopThriftAuthBridge bridge,
          HiveConf conf, Lock startLock, Condition startCondition,
          AtomicBoolean startedServing) throws Throwable {
        try {
          isMetaStoreRemote = true;
          // Server will create new threads up to max as necessary. After an idle
          // period, it will destroy threads to keep the number of threads in the
          // pool to min.
          ......
          TProcessor processor;
          TTransportFactory transFactory;
          final TProtocolFactory protocolFactory;
          final TProtocolFactory inputProtoFactory;
          if (useCompactProtocol) {
            ......
          } else {
            protocolFactory = new TBinaryProtocol.Factory();
            inputProtoFactory = new TBinaryProtocol.Factory(true, true, maxMessageSize, maxMessageSize);
          }
          HMSHandler baseHandler = new HiveMetaStore.HMSHandler("new db based metaserver", conf,
              false);
          IHMSHandler handler = newRetryingHMSHandler(baseHandler, conf);
          TServerSocket serverSocket  = null;
    
          if (useSasl) {
            // we are in secure mode.
            ......
            saslServer = bridge.createServer(
                conf.getVar(HiveConf.ConfVars.METASTORE_KERBEROS_KEYTAB_FILE),
                conf.getVar(HiveConf.ConfVars.METASTORE_KERBEROS_PRINCIPAL));
            // start delegation token manager
            saslServer.startDelegationTokenSecretManager(conf, baseHandler, ServerMode.METASTORE);
            transFactory = saslServer.createTransportFactory(
                    MetaStoreUtils.getMetaStoreSaslProperties(conf));
            //将服务逻辑通过handler封装进processor
            processor = saslServer.wrapProcessor(
              new ThriftHiveMetastore.Processor<IHMSHandler>(handler));
            serverSocket = HiveAuthUtils.getServerSocket(null, port);
    
            LOG.info("Starting DB backed MetaStore Server in Secure Mode");
          } else {
            // we are in unsecure mode
            ......
          if (tcpKeepAlive) {
            serverSocket = new TServerSocketKeepAlive(serverSocket);
          }
    
          TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverSocket)
              .processor(processor)
              .transportFactory(transFactory)
              .protocolFactory(protocolFactory)
              .inputProtocolFactory(inputProtoFactory)
              .minWorkerThreads(minWorkerThreads)
              .maxWorkerThreads(maxWorkerThreads);
    
          TServer tServer = new TThreadPoolServer(args);
          TServerEventHandler tServerEventHandler = new TServerEventHandler() {
             ......
          };
    
          tServer.setServerEventHandler(tServerEventHandler);
          ......
          tServer.serve();
        } catch (Throwable x) {
          ......
        }
    
    2、HMSHandler

     HMSHandler实现了IMSHandler的接口,是HiveMetastore的内部类,它定义了对元数据操作和获取信息的各种方法,如下图所示。


    HMSHandler方法

     通过动态代理的方式调用HMSHandler的各种方法。动态代理类为RetryingHMSHandler。

      public static IHMSHandler getProxy(HiveConf hiveConf, IHMSHandler baseHandler, boolean local)
          throws MetaException {
    
        RetryingHMSHandler handler = new RetryingHMSHandler(hiveConf, baseHandler, local);
    
        return (IHMSHandler) Proxy.newProxyInstance(
          RetryingHMSHandler.class.getClassLoader(),
          new Class[] { IHMSHandler.class }, handler);
      }
    
    3、ObjectStore

     该类是应用程序逻辑与包含对象的database store之间的接口,定义了操作元数据表的各种方法,如下图所示(上文中HMSHandler也定义了操作元数据表的各种方法,实际上最终会调用ObjectStore中的方法)。


    ObjectStore

     ObjectStore是RawStore的实现类,通过动态代理的方式调用ObjectStore的各种方法。动态代理类为RawStoreProxy。

      public static RawStore getProxy(HiveConf hiveConf, Configuration conf, String rawStoreClassName,
          int id) throws MetaException {
    
        Class<? extends RawStore> baseClass = (Class<? extends RawStore>) MetaStoreUtils.getClass(
            rawStoreClassName);
    
        RawStoreProxy handler = new RawStoreProxy(hiveConf, conf, baseClass, id);
        // Look for interfaces on both the class and all base classes.
        return (RawStore) Proxy.newProxyInstance(RawStoreProxy.class.getClassLoader(),
            getAllInterfaces(baseClass), handler);
      }
    
    4、DataNucleus

     DataNucleus实现了JDO规范,JDO(Java Data Object )是Java对象持久化的规范。了解Hibernate或者MyBatis的同学,对于对象持久化或者ORM(Object Relational Mapping,对象关系映射)应该不会陌生。DataNucleus做的正是这样的事情。
     Metastore中实现DataNucleus比较直观的两部分是M类和package.jdo,package.jdo定义了对象和元数据表的映射,M类则表示映射元数据表的类。详细内容如下图。
    1)M* model类

    M*
    Mdatabase类示意
    2)package.jdo
     如下图所示,DBS是MySQL元数据中的一张表,MDatabase则表示对应的model类,MDatabase同样定义了相应的属性和方法。
    package.jdo
    4、MySQL元数据示例
    MySQL中元数据表
    DBS元数据表

    相关文章

      网友评论

          本文标题:Metastore服务端架构

          本文链接:https://www.haomeiwen.com/subject/wbkwyqtx.html