Hive架構及Hive SQL的執行流程解讀

一、Hive產生背景

  • MapReduce編程的不便性
  • HDFS上的文件缺乏Schema(表名,名稱,ID等,爲數據庫對象的集合)

二、Hive是什麼

Hive的使用場景是什麼?web

基於Hadoop作一些數據清洗啊(ETL)、報表啊、數據分析sql

能夠將結構化的數據文件映射爲一張數據庫表,並提供類SQL查詢功能。shell

Hive是SQL解析引擎,它將SQL語句轉譯成M/R Job而後在Hadoop執行。數據庫

  • 由Facebook開源,最初用於解決海量結構化的日誌數據統計問題
  • 構建在Hadoop之上的數據倉庫
  • Hive定義了一種類SQL查詢語言:HQL(相似SQL但不徹底相同)
  • 一般用於進行離線數據處理(早期採用MapReduce)
  • 底層支持多種不一樣的執行引擎(如今能夠直接把Hive跑在Spark上面)

Hive底層的執行引擎有:MapReduce、Tez、Spark編程

三、Hive 特色

  • Hive 最大的特色是 Hive 經過類 SQL 來分析大數據,而避免了寫 MapReduce 程序來分析數據,這樣使得分析數據更容易
  • Hive 是將數據映射成數據庫和一張張的表,庫和表的元數據信息通常存在關係型數據庫上(好比 MySQL)
  • Hive 自己並不提供數據的存儲功能,數據通常都是存儲在 HDFS 上的(對數據完整性、格式要求並不嚴格)
  • Hive 很容易擴展本身的存儲能力和計算能力,這個是繼承自 hadoop 的(適用於大規模的並行計算)
  • Hive 是專爲 OLAP(在線分析處理) 設計,不支持事務

四、Hive體系架構

Hive是C/S模式架構

客戶端:併發

Client端有JDBC/ODBC和Thrift Client,可遠程訪問Hiveapp

能夠經過shell腳本的方式訪問,或者經過Thrift協議,按照平時編寫JDBC的方式完成對Hive的數據操做框架

Server:CLI、Thrift Server、HWI(Hive web Interface)、Driver、Metastore函數

  • 其中CLI、Thrift Server、HWI是暴露給Client訪問的獨立部署的Hive服務
  • Driver、Metastore是Hive內部組件,Metastore還能夠供第三方SQL on Hadoop框架使用
  • beeine(Hive 0.11引入),做爲Hive JDBC Client訪問HiveServer2,解決了CLI併發訪問問題

Driver:

輸入了sql字符串,對sql字符串進行解析,轉化程抽象語法樹,再轉化成邏輯計劃,而後使用優化工具對邏輯計劃進行優化,最終生成物理計劃(序列化反序列化,UDF函數),交給Execution執行引擎,提交到MapReduce上執行(輸入和輸出能夠是本地的也能夠是HDFS/Hbase)見下圖的hive架構

Metastore:

Metastore進行元數據管理:Derby(內置 )、Mysql;Derby:Derby只接受一個Hive的會話訪問;Mysql:Hive跑在Hadoop之上的,Mysql進行主備(定時同步操做)

image.png

由上圖可知,hadoop 和 mapreduce 是 hive 架構的根基。

MetaStore:存儲和管理Hive的元數據,使用關係數據庫來保存元數據信息。

解析器和編譯器:將SQL語句生成語法樹,而後再生成DAG形式的Job鏈,成爲邏輯計劃

優化器:只提供了基於規則的優化

  • 列過濾:去除查詢中不須要的列
  • 行過濾:Where條件判斷等在TableScan階段就進行過濾,利用Partition信息,只讀取符合條件的Partition
  • 謂詞下推:減小後面的數據量
  • Join方式
    。 Map端join: 調整Join順序,確保以大表做爲驅動表,小表載入全部mapper內存中
    。 shuffle join:按照hash函數,將兩張表的數據發送給join
    。對於數據分佈不均衡的表Group by時,爲避免數據集中到少數的reducer上,分紅兩個map-reduce階段。第一個階段先用Distinct列進行shuffle,而後在reduce端部分聚合,減少數據規模,第二個map-reduce階段再按group-by列聚合。
    。 sort merge join:排序,按照順序切割數據,相同的範圍發送給相同的節點(運行前在後臺建立立兩張排序表,或者建表的時候指定)
    。 在map端用hash進行部分聚合,減少reduce端數據處理規模。

執行器:執行器將DAG轉換爲MR任務。執行器會順序執行其中全部的Job,若是Job不存在依賴關係,採用併發的方式進行執行。

五、基於Hadoop上的Hive SQL的執行流程

image.png

sql寫出來之後只是一些字符串的拼接,因此要通過一系列的解析處理,才能最終變成集羣上的執行的做業

1.Parser:將sql解析爲AST(抽象語法樹),會進行語法校驗,AST本質仍是字符串

2.Analyzer:語法解析,生成QB(query block)

3.Logicl Plan:邏輯執行計劃解析,生成一堆Opertator Tree

4.Logical optimizer:進行邏輯執行計劃優化,生成一堆優化後的Opertator Tree

5.Phsical plan:物理執行計劃解析,生成tasktree

6.Phsical Optimizer:進行物理執行計劃優化,生成優化後的tasktree,該任務便是集羣上的執行的做業

  • 結論:通過以上的六步,普通的字符串sql被解析映射成了集羣上的執行任務,最重要的兩步是 邏輯執行計劃優化和物理執行計劃優化(圖中紅線圈畫)

查看執行計劃。

explain select id,name from emp where deptid = 1001 order by id

image.png

image.png

相關文章
相關標籤/搜索