一、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和數據庫其實沒啥太大關係。