陈略

好记性不如烂笔头。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

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

至上一篇结束,HiveConnection已经通过Thrift向HiveServer服务端发起了会话建立的RPC请求。但是到目前为止还不知道HiveServer到底是个什么鬼呢。因此,在这里必须要插播一下HiveServer的启动流程。

HiveServer2

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

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

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

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

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

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的对象。

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

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

未完待续

posted on 2016-01-19 21:28  陈略  阅读(1077)  评论(0编辑  收藏  举报