一、Hive簡介
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。還可以將 SQL 語句轉換為 MapReduce 任務進行運行,通過自己的 SQL 去 查詢分析需要的內容,這套 SQL 簡稱 HQL。使用hive的優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hive將元數據存儲在數據庫(RDBMS)中,比如MySQL、Derby中。Hive有三種模式連接到數據,其方式是:單用戶模式,多用戶模式和遠程服務模式。(也就是內嵌模式、本地模式、遠程模式)。
Hive特點:
1.可擴展
Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務。
2. 延展性
Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數。
3.容錯
良好的容錯性,節點出現問題SQL仍可完成執行。
二、Hive架構
Hive體系結構如下圖:
再來一張中文的圖:
其中第一張圖中的Jobtracker是hadoop1.x中的組件,它的功能相當於hadoop2.x中的: Resourcemanager+AppMaster
TaskTracker 相當於: Nodemanager + yarnchild
從上圖可以看出,Hive體系結構大概分成一下四個部分:
1.用戶接口:包括 CLI, Client, WUI。其中最常用的是 CLI,CLI為shell命令行,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,用戶連接至 Hive Server。在啟動 Client 模式的時候,需要指出 Hive Server 所在節點,並且在該節點啟動 Hive Server。 WUI 是通過瀏覽器訪問 Hive。
2.元數據存儲:通常是存儲在關系數據庫如 mysql, derby 中
3.解釋器、編譯器、優化器、執行器:完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在 HDFS 中,並在隨后有MapReduce 調用執行。
4Hadoop:Hive中數據用 HDFS 進行存儲,利用 MapReduce 進行計算。
三、數據存儲
首先需要清楚Hive中數據存儲的位置,元數據(即對數據的描述,包括表,表的列及其它各種屬性)是存儲在MySQL等數據庫中的,因為這些數據要不斷的更新,修改,不適合存儲在HDFS中。
而真正的數據是存儲在HDFS中,這樣更有利於對數據做分布式運算。
Hive中主要包括四類數據模型:
1、表:Hive中的表和關系型數據庫中的表在概念上很類似,每個表在HDFS中都有相應的目錄用來存儲表的數據,這個目錄可以通過${HIVE_HOME}/conf/hive-site.xml配置文件中的 hive.metastore.warehouse.dir屬性來配置,這個屬性默認的值是/user/hive/warehouse(這個目錄在 HDFS上),我們可以根據實際的情況來修改這個配置。如果我有一個表wyp,那么在HDFS中會創建/user/hive/warehouse/wyp 目錄(這里假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);wyp表所有的數據都存放在這個目錄中。這個例外是外部表。
2、外部表:Hive中的外部表和表很類似,但是其數據不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的數據是不會被刪除的,它只會刪除外部表對應的元數據;而如果你要刪除表,該表對應的所有數據包括元數據都會被刪除。
3、分區:在Hive中,表的每一個分區對應表下的相應目錄,所有分區的數據都是存儲在對應的目錄中。比如wyp 表有dt和city兩個分區,則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse /dt=20131218/city=BJ,所有屬於這個分區的數據都存放在這個目錄中。
4、桶:對指定的列計算其hash,根據hash值切分數據,目的是為了並行,每一個桶對應一個文件(注意和分區的區別)。比如將wyp表id列分散至16個桶中,首先對id列的值計算hash,對應hash值為0和16的數據存儲的HDFS目錄為:/user /hive/warehouse/wyp/part-00000;而hash值為2的數據存儲的HDFS 目錄為:/user/hive/warehouse/wyp/part-00002。