天天看點

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

1、Hive産生背景

• MapReduce程式設計的不便性

• HDFS上的檔案缺少Schema(表名,名稱,ID等,為資料庫對象的集合)

2、Hive是什麼

Hive的使用場景是什麼?

基于Hadoop做一些資料清洗啊(ETL)、報表啊、資料分析

可以将結構化的資料檔案映射為一張資料庫表,并提供類SQL查詢功能。

Hive是SQL解析引擎,它将SQL語句轉譯成M/R Job然後在Hadoop執行。

• 由Facebook開源,最初用于解決海量結構化的日志資料統計問題

• 建構在Hadoop之上的資料倉庫

• Hive定義了一種類SQL查詢語言:HQL(類似SQL但不完全相同)

• 通常用于進行離線資料處理(早期采用MapReduce)

• 底層支援多種不同的執行引擎(現在可以直接把Hive跑在Spark上面)

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

3、Hive 特點

• Hive 最大的特點是 Hive 通過類 SQL 來分析大資料,而避免了寫 MapReduce 程式來分析資料,這樣使得分析資料更容易

• Hive 是将資料映射成資料庫和一張張的表,庫和表的中繼資料資訊一般存在關系型資料庫上(比如 MySQL)

• Hive 本身并不提供資料的存儲功能,資料一般都是存儲在 HDFS 上的(對資料完整性、格式要求并不嚴格)

• Hive 很容易擴充自己的存儲能力和計算能力,這個是繼承自 hadoop 的(适用于大規模的并行計算)

• Hive 是專為 OLAP(線上分析處理) 設計,不支援事務

4、Hive體系架構

Hive是C/S模式

用戶端:

Client端有JDBC/ODBC和Thrift Client,可遠端通路Hive

可以通過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進行主備(定時同步操作)

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

由上圖可知,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不存在依賴關系,采用并發的方式進行執行。

5、基于Hadoop上的Hive SQL的執行流程

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

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

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