1.想了解HiveServer2的啓動過程,則須要找到啓動HiveServer2的入口,hive服務的啓動命令爲hive --service HiveServer2,經過分析$HIVE_HOME/bin下hive腳本可知,執行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.ServerOptionsProcessor的parse()方法對象
在parse()方法中先會經過new GnuParser().parse()方法將參數解析爲CommandLine對象,而後調用CommandLine的getOptionProperties()獲取hive的配置,並將這些配置設置到系統屬性中,最後根據參數選項選取對應的處理器,並返回對應的參數處理的response結果,主要包括5種狀況:
1)當參數選項爲H時,處理器爲HelpOptionExecutor,即經過打印用法來執行--help選項;
2)當參數選項爲deregister時,處理器爲DeregisterOptionExecutor,即經過從特定版本的ZooKeeper中註銷全部HiveServer2實例來執行--deregister選項;
3)當參數選項爲listHAPeers時,處理器爲ListHAPeersExecutor,
4)當參數選項爲listHAPeers時,處理器爲FailoverHS2InstanceExecutor
接下來直接查看StartOptionExecutor類的execute方法,以下所示:
該方法的核心是1305行startHiveServer2()方法,進入該方法,能夠看到該方法裏的全部邏輯都包含在一個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)調用HiveServer2的start()方法啓動hive服務
a調用父類(CompositeService)的start()方法,包括啓動CLIService和ThriftHttpCLIService服務
a若是咱們支持動態服務發現,則將此HiveServer2實例的服務uri做爲znode添加到Zookeeper
b啓動策略同步器
c啓動webServer
d若是未啓用HA,則啓動tez session