Hive Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。 1.1為什麼使用Hive 為什麼要使用Hive 操作介面採用類SQL語法,提供快速開發的能力。 避免了去寫MapReduce,減少開發人員的學習成本。擴展功能很方便。 1.2 ...
Hive
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。
1.1為什麼使用Hive
為什麼要使用Hive
操作介面採用類SQL語法,提供快速開發的能力。
避免了去寫MapReduce,減少開發人員的學習成本。擴展功能很方便。
1.2 Hive的特點
可擴展:Hive可以自由的擴展集群的規模,一般情況下不需要重啟服務。
延展性:Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數。
容錯:良好的容錯性,節點出現問題SQL仍可完成執行。
1.3各組件的功能
- 用戶介面主要由三個:CLI、JDBC/ODBC和WebGUI。其中,CLI為shell命令行;JDBC/ODBC是Hive的JAVA實現,與傳統資料庫JDBC類似;WebGUI是通過瀏覽器訪問Hive。
- 元數據存儲:Hive 將元數據存儲在資料庫中。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
- 解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,併在隨後有 MapReduce 調用執行。
1.4 Hive與Hadoop的關係
Hive利用HDFS存儲數據,利用MapReduce查詢數據
1.5 hive與傳統資料庫對比
hive具有sql資料庫的外表,但應用場景完全不同,hive只適合用來做批量數據統計分析
1.查詢語言。由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發。
2.數據存儲位置。Hive是建立在Hadoop之上的,所有Hive的數據都是存儲在HDFS中的。而資料庫則可以將數據保存在塊設備或者本地文件系統中。
3.數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法(Hive 中預設有三個文件格式 TextFile,SequenceFile 以及 RCFile)。由於在載入數據的過程中,不需要從用戶數據格式到 Hive 定義的數據格式的轉換,因此,Hive 在載入的過程中不會對數據本身進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。而在資料庫中,不同的資料庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,因此,資料庫載入數據的過程會比較耗時。
4.數據更新。由於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在載入的時候中確定好的。而資料庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO ... VALUES 添加數據,使用 UPDATE ... SET 修改數據。
5.索引。之前已經說過,Hive 在載入數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,資料庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合線上數據查詢。
6.執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的,而資料庫通常有自己的執行引擎。
7.執行延遲。之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由於 MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,資料庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過資料庫的處理能力的時候,Hive 的並行計算顯然能體現出優勢。
8.可擴展性。由於 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009年的規模在 4000 台節點左右)。而資料庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行資料庫 Oracle 在理論上的擴展能力也只有 100 台左右。
9.數據規模。由於 Hive 建立在集群上並可以利用 MapReduce 進行並行計算,因此可以支持很大規模的數據;對應的,資料庫可以支持的數據規模較小。
1.6 Hive的數據存儲
1、Hive中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)
2、只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。
3、Hive 中包含以下數據模型:DB、Table,External Table,Partition,Bucket。
² db:在hdfs中表現為${hive.metastore.warehouse.dir}目錄下一個文件夾
² table:在hdfs中表現所屬db目錄下一個文件夾
² external table:外部表, 與table類似,不過其數據存放位置可以在任意指定路徑
普通表: 刪除表後, hdfs上的文件都刪了
External外部表刪除後, hdfs上的文件沒有刪除, 只是把文件刪除了
² partition:在hdfs中表現為table目錄下的子目錄
² bucket:桶, 在hdfs中表現為同一個表目錄下根據hash散列之後的多個文件, 會根據不同的文件把數據放到不同的文件中
1.7hive的配置
1 解壓Hive,到/usr/local目錄,將解壓後的目錄名mv為hive
2 設定環境變數HADOOP_HOME,HIVE_HOME,將bin目錄加入到PATH中
vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
export PATH=$PATH:$HIVE_HOME/bin
3 cd /usr/local/hive/conf
cp hive-default.xml.template hive-site.xml
修改hive.metastore.schema.verification,設定為false
創建/usr/local/hive/tmp目錄,替換${system:java.io.tmpdir}為該目錄
替換${system:user.name}為root
4 再hive路徑下
schematool -initSchema -dbType derby
( metastore_db已創建,當在次有毛病時,刪了重新這一步,會在當前目錄下簡歷metastore_db的資料庫。
註意!!!下次執行hive時應該還在同一目錄,預設到當前目錄下尋找metastore。
遇到問題,把metastore_db刪掉,重新執行命令,實際工作環境中,經常使用mysql作為metastore的數據)
5 啟動hive(前提是Hadoop和集群啟動了!!!!start-dfs.sh !!start-yarn.sh)
直接 hive
hive> create table wordcount(line string);
hive>show tables;
hive>desc wordcount ;
表存在dfs -ls /usr/hive/;
實驗wordcount!!!
load data inpath '/wcinput' overwrite into table doc;
select * from doc;
select split(line, ' ') from doc;
select explode(split(line, ' ')) from doc;
select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word;
select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word order by word;
create table word_counts as select word, count(1) as count from (select explode(split(line, ' ')) as word from doc) w group by word order by word;