Hive源碼分析(1)——HiveServer2啓動過程

1.想了解HiveServer2的啓動過程,則須要找到啓動HiveServer2的入口,hive服務的啓動命令爲hive --service HiveServer2,經過分析$HIVE_HOME/binhive腳本可知,執行hive --service HiveServer2後正真調用的是$HIVE_HOME/bin/ext下的hiveserver2.sh腳本,而從hiveserver2.sh腳本能夠看出,hive服務的入口爲HiveServer2類,所以咱們須要經過分析HiveServer2類來了解hive的啓動過程。node

2.入口方法web

HiveServer2類的入口方法爲main方法,該方法中作了如下幾件事:緩存

1)設置加載hive配置的標識的值爲truesession

2)構造ServerOptionsProcessor對象,並調用該對象的parse()方法解析參數spa

3)調用LogUtils.initHiveLog4j()方法初始化hive日誌線程

4)基於命令解析結果獲取執行器,並調用execute()方法啓動HiveServer2服務3d

注:在執行以上四個步驟時,一旦捕獲到異常就會執行System.exit(-1)退出程序。日誌

瞭解了main()的大體邏輯,接下來分析每一個步驟的具體實現。server

1.ServerOptionsProcessorparse()方法對象

parse()方法中先會經過new GnuParser().parse()方法將參數解析爲CommandLine對象,而後調用CommandLinegetOptionProperties()獲取hive的配置,並將這些配置設置到系統屬性中,最後根據參數選項選取對應的處理器,並返回對應的參數處理的response結果,主要包括5種狀況:

1)當參數選項爲H時,處理器爲HelpOptionExecutor,即經過打印用法來執行--help選項;

2)當參數選項爲deregister時,處理器爲DeregisterOptionExecutor,即經過從特定版本的ZooKeeper中註銷全部HiveServer2實例來執行--deregister選項;

3)當參數選項爲listHAPeers時,處理器爲ListHAPeersExecutor

4)當參數選項爲listHAPeers時,處理器爲FailoverHS2InstanceExecutor

接下來直接查看StartOptionExecutor類的execute方法,以下所示:

 

 

該方法的核心是1305startHiveServer2()方法,進入該方法,能夠看到該方法裏的全部邏輯都包含在一個while(true)中,這樣作的目的是在HiveServer2失敗後增長重試操做,那什麼會結束該while循環呢?有兩種狀況,一種是在限制的次數內執行啓動成功,一種是重試次數用完還未執行成功,重試次數爲默認值爲30秒,重試間隔時間爲60秒,可經過配置進行修改,而後來看主要啓動邏輯。

1)啓動hive以前先清除hive緩存目錄(/tmp/hive

根據hive.start.cleanup.scratchdir的值判斷是否須要清理,默認值爲false。若是爲true,則會根據hive.exec.scratchdir配置的臨時目錄的值,調用hdfs接口來刪除該路徑,以下圖所示:

 

 

1)建立HiveServer2()實例

建立HIveServer2實例時會將loadHiveServer2Config的值設置爲true,該值是標識是否加載hive配置。

2)初始化hive配置

a首先會初始化hive指標;

b建立CLIService實例

c建立ThriftHttpCLIService實例

d獲取當前線程的配置單元對象。 若是未初始化,則建立一個新的。若是新配置在元數據配置中不一樣,或者全部者不一樣,則建立一個新的。

e若是配置HA模式,須要在zk上註冊名稱空間

3)調用HiveServer2start()方法啓動hive服務

a調用父類(CompositeService)的start()方法,包括啓動CLIServiceThriftHttpCLIService服務

a若是咱們支持動態服務發現,則將此HiveServer2實例的服務uri做爲znode添加到Zookeeper

b啓動策略同步器

c啓動webServer

d若是未啓用HA,則啓動tez session

相關文章
相關標籤/搜索