HiveServer2和metaStore
hiveServer2和metaStore其實(shí)都是hive本身帶的組件,那么兩者究竟有什么不同呢?
- metaStore:hive的metaStore提供的是一個(gè)服務(wù),而這個(gè)服務(wù)就是將hive的元數(shù)據(jù)暴露出去,而不是需要通過對(duì)hive元數(shù)據(jù)庫mysql的訪問才能拿到hive的元數(shù)據(jù)信息;metastore服務(wù)實(shí)際上就是一種thrift服務(wù),通過它我們可以獲取到hive原數(shù)據(jù),并且通過thrift獲取原數(shù)據(jù)的方式,屏蔽了數(shù)據(jù)庫訪問需要驅(qū)動(dòng),url,用戶名,密碼等等細(xì)節(jié)
- hiveServer2: HiveServer2(HS2)是一個(gè)服務(wù)端接口,使遠(yuǎn)程客戶端可以執(zhí)行對(duì)Hive的查詢并返回結(jié)果。目前基于Thrift RPC的實(shí)現(xiàn)是HiveServer的改進(jìn)版本,并支持多客戶端并發(fā)和身份驗(yàn)證, 啟動(dòng)hiveServer2服務(wù)后,就可以使用jdbc,odbc,或者thrift的方式連接
兩者的關(guān)系見下圖:

image.png
HiveThriftServer2
那么hiveThriftServer2又是什么呢?
- 其實(shí)HiveThriftServer2是sparkSql中的一個(gè)服務(wù),他繼承了HiveServer2,也就是說HiveServer2有的功能,它一樣也有,Spark Thrift Server的接口和協(xié)議都和HiveServer2完全一致,因此我們部署好Spark Thrift Server后,可以直接使用hive的beeline訪問Spark Thrift Server執(zhí)行相關(guān)語句。Spark Thrift Server的目的也只是取代HiveServer2,因此它依舊可以和Hive Metastore進(jìn)行交互,獲取到hive的元數(shù)據(jù)。那么具體有什么不同呢?
詳見下表
| Hive on Spark | Spark Thrift Server | |
|---|---|---|
| 任務(wù)提交模式 | 每個(gè)session都會(huì)創(chuàng)建一個(gè)RemoteDriver,也就是對(duì)于一個(gè)Application。之后將sql解析成執(zhí)行的物理計(jì)劃序列化后發(fā)到RemoteDriver執(zhí)行 | 本身的Server服務(wù)就是一個(gè)Driver,直接接收sql執(zhí)行。也就是所有的session都共享一個(gè)Application |
| 性能 | 性能一般 | 如果存儲(chǔ)格式是orc或者parquet,性能會(huì)比hive高幾倍,某些語句甚至?xí)邘资?。其他格式的話,性能相差不是很大,有時(shí)hive性能會(huì)更好 |
| 并發(fā) | 如果任務(wù)執(zhí)行不是異步的,就是在thrift的worker線程中執(zhí)行,受worker線程數(shù)量的限制。異步的話則放到線程池執(zhí)行,并發(fā)度受異步線程池大小限制。 | 處理任務(wù)的模式和Hive一樣。 |
| sql兼容 | 主要支持ANSI SQL 2003,但并不完全遵守,只是大部分支持。并擴(kuò)展了很多自己的語法 | Spark SQL也有自己的實(shí)現(xiàn)標(biāo)準(zhǔn),因此和hive不會(huì)完全兼容。具體哪些語句會(huì)不兼容需要測試才能知道 |
| HA | 可以通過zk實(shí)現(xiàn)HA | 沒有內(nèi)置的HA實(shí)現(xiàn),不過spark社區(qū)提了一個(gè)issue并帶上了patch,可以拿來用:SPARK-11100 |
-
HiveThriftServer2對(duì)于spark來說,就是一個(gè)任務(wù),也需要spark-submit提交,但是他卻是一個(gè)常駐的進(jìn)行,實(shí)時(shí)監(jiān)聽對(duì)應(yīng)端口的查詢?nèi)蝿?wù),并進(jìn)行查詢,具體的執(zhí)行邏輯參看下圖
image.png
