Hive学习笔记 之 Hive运行流程简析2

Hive学习笔记 之 Hive运行流程简析2

版权声明:本文为原创文章,欢迎转载,请注明出处。java

至上一篇结束,HiveConnection已经经过Thrift向HiveServer服务端发起了会话创建的RPC请求。可是到目前为止还不知道HiveServer究竟是个什么鬼呢。所以,在这里必需要插播一下HiveServer的启动流程。数据库

HiveServer2

HiveServer有个早期版本,后面Hive社区作了一次架构变更,命名为HiveServer2,从我开始玩Hive时,就已是这货了,HiveServer1也没怎么关注,无论他了。apache

那么在配置好Hadoop环境后,适配好相关配置,即刻启动HiveServer2。Hive的脚本结构已经在上一篇中写过了,这里就再也不说了。直接把脚本拿着调用就好了。设计模式

chen@Air-Chen ~/app/hive/bin$ ./hiveserver2

上述脚本最后会启动HiveServer2这个类。那么照例从main方法开始,来看看这个类到底干了些啥。session

首先看几个类的继承关系。使用了忘记姓名的设计模式。架构

AbstractService (org.apache.hive.service)
    CompositeService (org.apache.hive.service)
        CLIService (org.apache.hive.service.cli)
        HiveServer2 (org.apache.hive.service.server)
        SessionManager (org.apache.hive.service.cli.session)
    OperationManager (org.apache.hive.service.cli.operation)
    ThriftCLIService (org.apache.hive.service.cli.thrift)
        ThriftBinaryCLIService (org.apache.hive.service.cli.thrift)
        ThriftHttpCLIService (org.apache.hive.service.cli.thrift)

先重点关注一下HiveServer2的父类CompositeService。它继承本身的父类的若干方法,并包含一个list,list中放的是其余Service的对象。app

下面是这几个类的从属关系:oop

HiveServer2
    CLIService
        SessionManager
            OperationManager
    ThriftCLIService(Binary or HTTP)

那么,根据这个下挂关系,其init方法逐层向下初始化其对象,start方法则逐层向上启动其对象。这个关系明确体如今HiveServer的日志中。如下为日志节选。学习

2016-01-19 21:10:18,964 INFO  [main]: server.HiveServer2 (HiveServer2.java:startHiveServer2(339)) - Starting HiveServer2
2016-01-19 21:10:27,871 INFO  [main]: service.AbstractService (AbstractService.java:init(89)) - Service:OperationManager is inited.
2016-01-19 21:10:27,872 INFO  [main]: service.AbstractService (AbstractService.java:init(89)) - Service:SessionManager is inited.
2016-01-19 21:10:27,872 INFO  [main]: service.AbstractService (AbstractService.java:init(89)) - Service:CLIService is inited.
2016-01-19 21:10:27,875 INFO  [main]: service.AbstractService (AbstractService.java:init(89)) - Service:ThriftBinaryCLIService is inited.
2016-01-19 21:10:27,875 INFO  [main]: service.AbstractService (AbstractService.java:init(89)) - Service:HiveServer2 is inited.
2016-01-19 21:10:27,875 INFO  [main]: service.AbstractService (AbstractService.java:start(104)) - Service:OperationManager is started.
2016-01-19 21:10:27,876 INFO  [main]: service.AbstractService (AbstractService.java:start(104)) - Service:SessionManager is started.
2016-01-19 21:10:27,876 INFO  [main]: service.AbstractService (AbstractService.java:start(104)) - Service:CLIService is started.
(AbstractService.java:start(104)) - Service:ThriftBinaryCLIService is started.
2016-01-19 21:10:27,896 INFO  [main]: service.AbstractService (AbstractService.java:start(104)) - Service:HiveServer2 is started.
2016-01-19 21:10:28,076 INFO  [Thread-8]: thrift.ThriftCLIService (ThriftBinaryCLIService.java:run(98)) - Starting ThriftBinaryCLIService on port 10000 with 5...500 worker threads

ThriftCLIService

这个类就是HiveServer的thrift服务端。有两种实现形式,分别对应两个不一样的类,这里以Binary方式的类ThriftBinaryCLIService为例。线程

JDBC客户端这边经过thrift发过来的请求将所有落入这个对象进行处理,从他的类定义能够看到标准的thrift用法。

public abstract class ThriftCLIService extends AbstractService implements TCLIService.Iface, Runnable

例如上一篇中提到的openSession方法,即经过thrift RPC调用到这个对象的同名方法中,该方法继续调用其内部封装的CLIService对象的同名方法,CLIService又继续调用其内部的SessionManager的同名方法创建session。

CLIService

上面thrift的类,本质上是一个桥梁,桥梁为Hive的客户端和服务端的沟通服务。

CLIService这个类才是HiveServer真正的业务逻辑入口。

下挂了会话管理,会话管理下挂操做管理,逻辑很是顺畅。


HiveServer初始化的流程到这里也基本完了,固然,内部还有一些诸如认证、线程池建立、元数据库的创建、元数据库客户端的创建、动态发现模式下向ZooKeeper注册信息等细节,有时间再补充吧。

总结前面两篇,如今客户端到服务端的简要流程以下,下一篇将要正式进入HiveServer的核心处理流程了。
Beeline -> JDBC ->ThriftCLIService ->CLIService ->SessionMgr ->OpMgr

未完待续

相关文章
相关标签/搜索