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

由上圖可知,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的執行流程
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