hive 基本架構

以下圖所示,從邏輯上來看,Hive包含了3大部分。mysql

  • Hive Clients
  • Hive Services
  • Hive Storage and Computing
    hive 基本架構

用戶操做Hive的接口主要有三個:CLI,Client 和 WUI。sql

其中最經常使用的是CLI,Cli啓動的時候,會同時啓動一個Hive副本。數據庫

Client是Hive的客戶端,用戶鏈接至Hive Server。在啓動 Client模式的時候,須要指出Hive Server所在節點,而且在該節點啓動Hive Server。而客戶端則又能夠分爲三種Thrift Client,JDBC Client,ODBC Client。瀏覽器

Web Interface是經過瀏覽器訪問Hive。安全

  • Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
  • 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後由MapReduce調用執行。
  • Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(注意,包含的查詢,好比select from tbl不會生成MapRedcue任務)。
    上圖中的Driver會處理從應用到metastore到filed system的全部請求,以進行後續操做。

Hive組件

Driver

實現了session handler,在JDBC/ODBC接口上實現了執行和獲取信息的API。session

Compiler

該組件用於對不一樣的查詢表達式作解析查詢,語義分析,最終會根據從metastore中查詢到的表和分區元數據生成一個execution plain。數據結構

Execution Egine

該組件會執行由compiler建立的execution。其中plan從數據結構上來看,是一個DAG,該組件會管理plan的不一樣stage與組件中執行這些plan之間的依賴。架構

Metastore

Hive的metastore組件是hive元數據集中存放地。該組件存儲了包括變量表中列和列類型等結構化的信息以及數據倉庫中的分區信息(包括列和列類型信息,讀寫數據時必要的序列化和反序列化信息,數據被存儲在HDFS文件中的位置)。ide

Metastore組件包括兩個部分:metastore services和Meta storage database。優化

  • Metastore database的介質就是關係數據庫,例如hive默認的嵌入式磁盤數據庫derby,還有mysql數據庫。
  • Metastore services是創建在後臺數據存儲介質(HDFS)之上,而且能夠和hive services進行交互的服務組件。
    默認狀況下,metastore services和hive services是安裝在一塊兒的,運行在同一個進程當中。也能夠把metastore services從hive services裏剝離出來,將metastore獨立安裝在一個集羣裏,hive遠程調用metastore services。這樣咱們能夠把元數據這一層放到防火牆以後,客戶端訪問hive服務,就能夠鏈接到元數據這一層,從而提供了更好的管理性和安全保障。

使用遠程的metastore services,可讓metastore services和hive services運行在不一樣的進程裏,這樣也保證了hive的穩定性,提高了hive services的效率。

Hive執行過程

hive 基本架構

流程大體步驟爲:

  1. 用戶提交查詢等任務給Driver。
  2. Driver爲查詢操做建立一個session handler,接着dirver會發送查詢操做到compiler去生成一個execute plan
  3. Compiler根據用戶任務去MetaStore中獲取須要的Hive的元數據信息。這些元數據在後續stage中用做抽象語法樹的類型檢測和修剪。
  4. Compiler獲得元數據信息,對task進行編譯,先將HiveQL轉換爲抽象語法樹,而後將抽象語法樹轉換成查詢塊,將查詢塊轉化爲邏輯的查詢plan,重寫邏輯查詢plan,將邏輯plan轉化爲物理的plan(MapReduce), 最後選擇最佳策略。
  5. 將最終的plan提交給Driver。
  6. Driver將plan轉交給ExecutionEngine去執行,將獲取到的元數據信息,提交到JobTracker或者RsourceManager執行該task,任務會直接讀取到HDFS中進行相應的操做。
  7. 獲取執行的結果。
  8. 取得並返回執行結果。

建立表

解析用戶提交的Hive語句->對其進行解析->分解爲表、字段、分區等Hive對象

根據解析到的信息構建對應的表、字段、分區等對象,從SEQUENCE_TABLE中獲取構建對象的最新的ID,與構建對象信息(名稱、類型等等)一同經過DAO方法寫入元數據庫的表中,成功後將SEQUENCE_TABLE中對應的最新ID+5。

實際上常見的RDBMS都是經過這種方法進行組織的,其系統表中和Hive元數據同樣顯示了這些ID信息。經過這些元數據能夠很容易的讀取到數據。

優化器

優化器是一個不斷更新的組件,大部分plan的轉移都是經過優化器完成的。

  • 將多Multiple join 合併爲一個Muti-way join
  • 對join、group-by和自定義的MapReduce操做從新進行劃分。
  • 消減沒必要要的列。
  • 在表的掃描操做中推行使用斷言。
  • 對於已分區的表,消減沒必要要的分區。
  • 在抽樣查詢中,消減沒必要要的桶。
  • 優化器還增長了局部聚合操做用於處理大分組聚合和增長再分區操做用於處理不對稱的分組聚合。
相關文章
相關標籤/搜索