hive體系結構mysql
Hive體系結構圖:主要分爲:用戶接口、Thrift服務器、元數據存儲、解析器、Hadoopsql
Hive 對外提供了三種服務模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的遠程服務(Client)。數據庫
Hive 將元數據存儲在數據庫中(metastore),目前只支持mysql、derby。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。服務器
解釋器、編譯器、優化器。
Driver 調用解釋器(Compiler)處理 HiveSQL 字串,這些字串多是一條 DDL、DML或查詢語句。編譯器將字符串轉化爲策略(plan)。策略僅由元數據操做 和 HDFS 操做組成,元數據操做只包含 DDL 語句,HDFS 操做只包含 LOAD 語句。對插入和查詢而言,策略由 MapReduce 任務中的具備方向的非循環圖(directedacyclic graph,DAG)組成,具體流程以下。
1)解析器(parser):將查詢字符串轉化爲解析樹表達式。
2)語義分析器(semantic analyzer):將解析樹表達式轉換爲基於塊(block-based)的內部查詢表達式,將輸入表的模式(schema)信息從 metastore 中進行恢復。用這些信息驗證列名, 展開 SELECT * 以及類型檢查(固定類型轉換也包含在此檢查中)。
3)邏輯策略生成器(logical plan generator):將內部查詢表達式轉換爲邏輯策略,這些策略由邏輯操做樹組成。
4)優化器(optimizer):經過邏輯策略構造多途徑並以不一樣方式重寫。優化器的功能以下。
將多 multiple join 合併爲一個 multi-way join;
對join、group-by 和自定義的 map-reduce 操做從新進行劃分;
消減沒必要要的列;
在表掃描操做中推行使用斷言(predicate);
對於已分區的表,消減沒必要要的分區;
在抽樣(sampling)查詢中,消減沒必要要的桶。
此外,優化器還能增長局部聚合操做用於處理大分組聚合(grouped aggregations)和 增長再分區操做用於處理不對稱(skew)的分組聚合。數據結構
Hive常見操做符oop
Hive數據結構優化
Hive的存儲是創建在Hadoop文件系統之上的,它自己沒有專門的數據存儲格式,其主要包括四類數據模型:
表(Table)
分區(Partition)
桶(Bucket)
外部表(External Table)命令行
內部表xml
與數據庫中的 Table 在概念上是相似
每個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表test,它在 HDFS 中的路徑爲:/ warehouse/test。 warehouse是在hive-site.xml 中由 ${hive.metastore.warehouse.dir}
指定的數據倉庫的目錄
全部的 Table 數據(不包括 External Table)都保存在這個目錄中。
刪除表時,元數據與數據都會被刪除索引
外部表
指向已經在 HDFS 中存在的數據,能夠建立 Partition
它和 內部表 在元數據的組織上是相同的,而實際數據的存儲則有較大的差別
內部表 的建立過程和數據加載過程(這兩個過程能夠在同一個語句中完成),在加載數據的過程當中,實際數據會被移動到數據
倉庫目錄中;以後對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除
外部表只有一個過程,加載數據和建立表同時完成,並不會移動到數據倉庫目錄中,只是與外部數據創建一個連接。當刪除一個外部表時,僅刪除連接
分區表
Partition 對應於數據庫的 Partition 列的密集索引
在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,全部的 Partition 的數據都存儲在對應的目錄中
例如:test表中包含 date 和 city 兩個 Partition,
則對應於date=20130201, city = bj 的HDFS 子目錄:
/warehouse/test/date=20130201/city=bj
對應於date=20130202, city=sh 的HDFS 子目錄爲;
/warehouse/test/date=20130202/city=sh
桶表
桶表是對數據進行哈希取值,而後放到不一樣文件中存儲。
建立表create table bucket_table(id string) clustered by(id) into 4 buckets; 加載數據set hive.enforce.bucketing = true;
insert into table bucket_table select name from stu;
insert overwrite table bucket_table select name from stu;
數據加載到桶表時,會對字段取hash值,而後與桶的數量取模。把數據放到對應的文件中。
Hive工做原理