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

未完待續

相關文章
相關標籤/搜索