1. 程式人生 > >[Hive]HiveServer2概述

[Hive]HiveServer2概述

1. HiveServer1

HiveServer是一種可選服務,允許遠端客戶端可以使用各種程式語言向Hive提交請求並檢索結果。HiveServer是建立在Apache ThriftTM(http://thrift.apache.org/) 之上的,因此有時會被稱為Thrift Server,這可能會導致混亂,因為新服務HiveServer2也是建立在Thrift之上的.自從引入HiveServer2後,HiveServer也被稱為HiveServer1。

警告

HiveServer無法處理來自多個客戶端的併發請求.這實際上是HiveServer匯出的Thrift介面所施加的限制,也不能通過修改HiveServer原始碼來解決。

HiveServer2對HiveServer進行了重寫,來解決這些問題,從Hive 0.11.0版本開始。建議使用HiveServer2。

從Hive1.0.0版本(以前稱為0.14.1版本)開始,HiveServer開始被刪除。請切換到HiveServer2。

2. HiveServer2

2.1 引入

HiveServer2(HS2)是一種能使客戶端執行Hive查詢的服務。 HiveServer2是HiveServer1的改進版,HiveServer1已經被廢棄。HiveServer2可以支援多客戶端併發和身份認證。旨在為開放API客戶端(如JDBC和ODBC)提供更好的支援。

HiveServer2單程序執行,提供組合服務,包括基於Thrift的Hive服務(TCP或HTTP)和用於Web UI的Jetty Web伺服器。

2.2 架構

基於Thrift的Hive服務是HiveServer2的核心,負責維護Hive查詢(例如,從Beeline)。Thrift是構建跨平臺服務的RPC框架。其堆疊由4層組成:server,Transport,Protocol和處理器。可以在 https://thrift.apache.org/docs/concepts 找到有關分層的更多詳細資訊。

2.2.1 Server

HiveServer2在TCP模式下使用TThreadPoolServer(來自Thrift),在HTTP模式下使用Jetty Server。

TThreadPoolServer為每個TCP連線分配一個工作執行緒。即使連線處於空閒狀態,每個執行緒也始終與連線相關聯。因此,由於大量併發連線產生大量執行緒,從而導致潛在的效能問題。在將來,HiveServer2可能切換到TCP模式下的另一個不同型別的Server上,例如TThreadedSelectorServer。

2.2.2 Transport

如果客戶端和伺服器之間需要代理(例如,為了負載均衡或出於安全原因),則需要HTTP模式。這就是為什麼它與TCP模式被同樣支援的原因。可以通過Hive配置屬性hive.server2.transport.mode指定Thrift服務的傳輸模式。

2.2.3 Protocol

協議責序列化和反序列化。HiveServer2目前正在使用TBinaryProtocol作為Thrift的協議進行序列化。 在未來,可以更多考慮其他協議,如TCompactProtocol,可以考慮更多的效能評估。

2.2.4 處理器

處理流程是處理請求的應用程式邏輯。例如,ThriftCLIService.ExecuteStatement()方法實現了編譯和執行Hive查詢的邏輯。

2.3 依賴

  • Metastore metastore可以配置為嵌入式(與HiveServer2相同的過程)或遠端伺服器(也是基於Thrift的服務)。 HS2與查詢編譯所需的元資料相關。
  • Hadoop cluster HiveServer2準備了各種執行引擎(MapReduce/Tez/Spark)的物理執行計劃,並將作業提交到Hadoop叢集執行。

3. JDBC Client

推薦使用JDBC驅動程式讓客戶端與HiveServer2進行互動。請注意,有一些用例(例如,Hadoop Hue),直接使用Thrift客戶端,而沒有使用JDBC。 以下是進行第一次查詢所涉及的一系列API呼叫:

  • JDBC客戶端(例如,Beeline)通過初始化傳輸連線(例如,TCP連線),再呼叫OpenSession API來獲取SessionHandle來建立HiveConnection。 會話是從伺服器端建立的。
  • 執行HiveStatement(遵循JDBC標準),並且Thrift客戶端呼叫ExecuteStatement API。 在API呼叫中,SessionHandle資訊與查詢資訊一起傳遞給伺服器。
  • HiveServer2伺服器接收請求,並讓驅動程式(CommandProcessor)進行查詢解析和編譯。該驅動程式啟動後臺工作,將與Hadoop互動,然後立即向客戶端返回響應。這是ExecuteStatement API的非同步設計。響應包含從伺服器端建立的OperationHandle。
  • 客戶端使用OperationHandle與HiveServer2互動以輪詢查詢執行的狀態。