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的啟動過程。

2.入口方法

HiveServer2類的入口方法為main方法,該方法中做了以下幾件事:

1)設置載入hive配置的標識的值為true

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

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

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

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

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

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

 

Tags: