Hive學習筆記(一)——概述

1.Hive是個什麼玩意?

Hive:由Facebook開源用於解決海量結構化日誌的數據統計。

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據(有規律的數據)文件映射爲一張表,並提供類SQL查詢功能。

一句話暴力總結:通過寫SQL語句的方式,代替原來的寫MapReduce程序。

下邊幾點還需要留意一下:

  • Hive處理的數據存儲在HDFS ;

  • Hive分析數據底層的實現是MapReduce ;

  • 執行程序運行在Yarn上 ;

    這就相當於Hive是Hadoop的客戶端,不是分佈式的

2. Hive的優缺點 (選看)

2.1 優點:

1)操作接口採用類SQL的語法,比較好上手,不用寫代碼;

2)避免寫MapReduce程序代碼,減少了開發人員的學習成本,也提高了開發效率嘛;

3)適用於數據分析,對實時性要求不高的場合,因爲默認的實現是MapReduce;

4)Hive主要的優勢在於處理大數據,對處理小數據沒有優勢,因爲Hive的執行延遲比較高;

5)Hive支持用戶自定函數,開發人員可以根據需求自定義函數。

2.2 缺點:

1)Hive的HQL表達能力有限:
(1)迭代式算法無法表達;
(2)數據挖掘方面不擅長,由於MapReduce數據處理流程的限制,效率更高的算法卻無法實現。
2)Hive的效率比較低:
(1)Hive自動生成的MapReduce作業,通常情況下不夠智能化;
(2)Hive調優比較困難,粒度較粗。

3. 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中執行,最後,將執行返回的結果輸出到用戶交互接口。

4. Hive和數據庫比較

​ Hive 是爲數據倉庫而設計的 ,Hive 採用了類似SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有類似的查詢語言,再無類似之處。比較一下兩者吧:

  • 查詢語言:專門針對Hive的特性設計了類SQL的查詢語言HQL ;
  • 存儲的位置:Hive是建立在Hadoop之上的,所以Hive的數據都存儲在HDFS上。數據庫的文件則存儲在塊設備上或者本地文件系統中;
  • 數據更新:Hive是針對數據倉庫設計的,數據倉庫裏的內容讀多寫少,Hive中不建議對數據改寫,所有的數據都是在加載的時候確定好的。數據庫中的內容則是需要頻繁的讀寫;
  • 執行:Hive的執行藉助於Hadoop提供的MapReduce實現,數據庫則是有自己的執行引擎;
  • 執行延遲:Hive由於沒有索引,需要掃描全表,因此延遲比較高;另一個導致延遲高的原因是MapReduce框架本身就有較高的執行延遲。相比較而言,數據庫的執行延遲比較低,當然低是有條件的:即處理數據量小的時候比較低。當規模達到一定程度的時候,Hive的並行計算的優勢就能體現出來了。
  • 可擴展性:由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫在理論上的擴展能力也只有100臺左右。
  • 數據規模:由於Hive建立在集羣上並可以利用MapReduce進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章