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