Hadoop學習(4)——Hive(1)數據倉庫介紹

一、Hive簡介

1.1、什麼是Hive

(1)從概念上來看

  • Hive是基於Hadoop的一個數據倉庫工具,它是MapReduce的一個封裝,底層就是MapReduce程序
  • Hive可以將結構化的數據文件(eg:按照各字段分類的數據)映射成一張虛表,並提供類SQL查詢功能;
  • 有了Hive後我們就不用再寫麻煩的MapReduce程序了。

(2)從本質來看

  • Hive就是把sql語句轉化爲MapReduce程序
  • Hive沒有服務端,它本質是Hadoop或者說是HDFS的一個客戶端,對HDFS的數據和Meta store的元數據進行操作;
  • 通常我們啓動Hive是通過JDBC客戶端操作的;

(ps:對比hadoop中,通過命令start-dfs.sh啓動HDFS服務端,然後通過hadoop fs -命令來啓動HDFS客戶端進行實際操作)

1.2、Hive中SQL-MapReduce原理圖解(Hive本質是把SQL語句轉化成MapReduce程序)

 

(1)事先將常用的SQL操作封裝成MapReduce模板存放在Hive中;

(2)client依據實際需求寫SQL語句,匹配對應的MapReduce模板,然後運行對應的MapReduce程序,

(3)生成相應的分析結果,返回給client。

1.3、爲什麼說Hive是基於Hadoop的呢


(1)Hive處理的數據實際存放在HDFS中,默認路徑/user/hive/warehouse;

(2)Hive分析數據的底層實現還是MapReduce程序;

(3)Hive調度資源時,用的是Yarn框架;

(4)在服務器中運行Hive之前需要羣起HDFS和YARN。


1.4、Hive優缺點

優點:

(1)簡單、只需要寫SQL語句就行;

(2)Hive常用於數據分析,適合處理離線數據(靜態數據)

(3)優勢在於處理大數據;

(4)支持用戶自定義函數;

ps:mysql適合處理數據的增刪改查,適合處理實時數據(動態數據)

缺點:


(1)Hive的表達有限,無法表達迭代式算法(第一個MapReducer程序的結果作爲另一個MapReducer程序的輸入,這種就是迭代式算法);

(2)數據挖掘不擅長(擅長數據挖掘的是Spark);

(3)Hive自動生成MapReduce作業,通常不夠智能化,效率比較低;

(4)Hive調優一般比較困難,粒度較粗。
 

二、Hive原理

2.1、Hive架構圖

兩種客戶端:

(1)CLI:命令行客戶端(可以在shell中操作);

(2)JDBC客戶端

四種驅動Driver

(1)SQL Parser解析器:檢查sql語法是否有錯誤;

(2)Physical Plan編譯器:把sql語句轉化成mr程序;

(3)Query Optimizer優化器:優化sql語句;

(4)Execution執行器:執行MR程序

 元數據庫Meta store
(1)Meta store是Hive數據庫中的一個庫,用於存儲處理數據的元數據,包括:

表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等。

(2)Meta store默認存儲在Hive自帶的derby數據庫中,但因爲derby無法實現併發,實際工作中一般將derby替換爲mysql

(3)Hive中處理的數據分兩部分存放:

         ① 處理的結構化數據,存儲在HDFS中

         ② 表的元數據存儲在元數據庫mysql中


總結:有了表的元數據信息,就能找到對應的字段;然後把字段映射到結構化數據中,這樣就可以通過映射形成一張虛表;

(也就是說,表的元數據和mysql中的結構化數據,通過映射,構成一張虛表,用於Hive查詢數據分析

2.2、Hive的存儲過程

啓動hive時,會初始化hive,這時會在mysql中生成大約36張表(後續隨着業務的複雜會增加),然後創建表,會在mysql中存放這個表的信息(不是以表的形式存在的,而是把表的屬性以數據的形式放在mysql中,這樣在hive中使用sql命令一樣是能夠查到這張表的)。然後把本地的文本文件使用hive命令格式化導入到表中,這樣這些數據就存放到hdfs中,而不是在mysql或hive中
 

三、Hive和數據庫的區別

(1)數據存儲位置不同

  • Hive中處理的結構化數據存儲在HDFS中,元數據存儲在mysql的Meta store中;
  • 數據庫將數據保存在塊設備或本地文件系統中;

(2)數據更新

  • Hive是針對數據倉庫設計的,主要用於讀,所有的數據在加載時已經確定好,適合處理靜態數據
  • 數據庫通常是實時進行修改的,增刪改查,適合處理動態數據;

(3)執行機制

  • Hive大多數查詢的執行是通過Hadoop提供的MapReduce實現的;
  • 數據庫通常是用自己的引擎innodb;

(4)執行延遲

  • Hive因爲沒有索引、利用MapReduce框架執行查詢,所以Hive本身的延遲較高;
  • 數據庫的延遲較低,但是不太適合處理PB級別以上海量數據;

(5)可擴展性

  • Hive是建立在Hadoop上的,所以Hive也具備可擴展性,併發運行;
  • 數據庫由於ACID語義的嚴格限制,擴展性非常有限,例如目前最先進的並行數據庫oracle在理論上擴展能力也就只有100臺左右。

很明顯,除了都用sql語句,Hive和數據庫其實沒啥太大關係。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章