Hive:由Facebook開源用於解決海量結構化日誌的數據統計。算法
Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據(有規律的數據)文件映射爲一張表,並提供類SQL查詢功能。sql
一句話暴力總結:經過寫SQL語句的方式,代替原來的寫MapReduce程序。數據庫
下邊幾點還須要留意一下:瀏覽器
Hive處理的數據存儲在HDFS ;架構
Hive分析數據底層的實現是MapReduce ;框架
執行程序運行在Yarn上 ;分佈式
這就至關於Hive是Hadoop的客戶端,不是分佈式的
函數
1)操做接口採用類SQL的語法,比較好上手,不用寫代碼;工具
2)避免寫MapReduce程序代碼,減小了開發人員的學習成本,也提升了開發效率嘛;oop
3)適用於數據分析,對實時性要求不高的場合,由於默認的實現是MapReduce;
4)Hive主要的優點在於處理大數據,對處理小數據沒有優點,由於Hive的執行延遲比較高;
5)Hive支持用戶自定函數,開發人員能夠根據需求自定義函數。
1)Hive的HQL表達能力有限:
(1)迭代式算法沒法表達;
(2)數據挖掘方面不擅長,因爲MapReduce數據處理流程的限制,效率更高的算法卻沒法實現。
2)Hive的效率比較低:
(1)Hive自動生成的MapReduce做業,一般狀況下不夠智能化;
(2)Hive調優比較困難,粒度較粗。
Hive主要架構及協同工做的架構組件以下圖:
瞭解一下各個組件:
1)用戶接口:Client,不屬於hive的內部數據
CLI(command-line interface)、JDBC/ODBC(jdbc訪問hive)、WEBUI(瀏覽器訪問hive)
2)元數據:Metastore
元數據包括:表名、表所屬的數據庫(默認是default庫)、表的擁有者、列/分區字段、表的類型(是不是外部表)、表的數據所在目錄等;
例如:HDFS上有一個文件,有四個列,咱們用Hive建了一個四個列的表與之相映射,這個映射關係就是元數據Metastore
元數據默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore(Hive要去HDFS上讀數據,它怎麼知道數據的位置呢?它要先訪問Mysql裏的元數據,根據元數據拼接處文件路徑)。
3)Hadoop
Hive處理的數據存儲在HDFS上,使用的是MapReduce進行計算。
4)驅動器:Driver
(1)解析器:將SQL字符串轉換成抽象語法樹AST,這一步通常都用第三方工具庫完成,好比antlr;對AST進行語法分析,好比表是否存在、字段是否存在、SQL語義是否有誤;
(2)編譯器:將AST編譯生成邏輯執行計劃;【即翻譯器:將HQL翻譯成MapReduce】
(3)優化器:對邏輯執行計劃進行優化;
(4)執行器:把邏輯執行計劃轉換成能夠運行的物理計劃。對於Hive來講,就是MR/Spark。
小總結:Hive經過給用戶提供的一系列交互接口,接收到用戶的指令(HQL),使用本身的Driver,結合元數據(包括數據的存儲路徑和數據與表的映射關係),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最後,將執行返回的結果輸出到用戶交互接口。
Hive 是爲數據倉庫而設計的 ,Hive 採用了相似SQL 的查詢語言 HQL(Hive Query Language),所以很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有相似的查詢語言,再無相似之處。比較一下二者吧: