深刻學習Hive應用場景及架構原理

Hive背景介紹

    Hive最初是Facebook爲了知足對海量社交網絡數據的管理和機器學習的需求而產生和發展的。互聯網如今進入了大數據時代,大數據是如今互聯網的趨勢,而hadoop就是大數據時代裏的核心技術,可是hadoop的mapreduce操做專業性太強,因此facebook在這些基礎上開發了hive框架,畢竟世界上會sql的人比會java的人多的多,hive能夠說是學習hadoop相關技術的一個突破口。那麼,hive是什麼呢?html

Hive簡介

簡單的說:hive是基於hadoop的數據倉庫。java

那麼爲何說hive是基於Hadoop的呢?mysql

之因此說hive是構建在Hadoop之上的數據倉庫,簡單的說是由於:jquery

   ①數據存儲在hdfs上程序員

   ②數據計算用mapreduce算法

下面咱們來深刻分析一下:sql

    Hive是一種創建在Hadoop文件系統上的數據倉庫架構,並對存儲在HDFS中的數據進行分析和管理;它能夠將結構化的數據文件映射爲一張數據庫表,並提供完整的 SQL 查詢功能,能夠將 SQL 語句轉換爲 MapReduce 任務進行運行,經過本身的 SQL 去 查詢分析須要的內容,這套 SQL 簡稱 Hive SQL(HQL),使不熟悉 MapReduce 的用戶也能很方便地利用 SQL 語言對數據進行查詢、彙總、分析。同時,這個語言也容許熟悉 MapReduce 開發者們開發自定義的mappers和reducers來處理內建的mappers和reducers沒法完成的複雜的分析工做。Hive還容許用戶編寫本身定義的函數UDF,用來在查詢中使用。Hive中有3種UDF:User Defined Functions(UDF)、User Defined Aggregation Functions(UDAF)、User Defined Table Generating Functions(UDTF)。也就是說對存儲在HDFS中的數據進行分析和管理,咱們不想使用手工,咱們創建一個工具吧,那麼這個工具就能夠是hive。數據庫

Hive常見的應用場景

(1)日誌分析:大部分互聯網公司使用hive進行日誌分析,包括百度、淘寶等。apache

   1)統計網站一個時間段內的pv、uv瀏覽器

   2)多維度數據分析

(2)海量結構化數據離線分析

Hive的特色(優缺點)

(一)hive的優勢

(1)簡單容易上手:提供了類SQL查詢語言HQL

(2)可擴展:爲超大數據集設計了計算/擴展能力(MR做爲計算引擎,HDFS做爲存儲系統)

通常狀況下不須要重啓服務Hive能夠自由的擴展集羣的規模。

(3)提供統一的元數據管理

(4)延展性:Hive支持用戶自定義函數,用戶能夠根據本身的需求來實現本身的函數

(5)容錯:良好的容錯性,節點出現問題SQL仍可完成執行

(二)hive的缺點(侷限性)

(1)hive的HQL表達能力有限

  1)迭代式算法沒法表達,好比pagerank

  2)數據挖掘方面,好比kmeans

(2)hive的效率比較低

  1)hive自動生成的mapreduce做業,一般狀況下不夠智能化

  2)hive調優比較困難,粒度較粗

3)hive可控性差

Hive 工做原理

        Hive 工做原理以下圖所示。

Hive構建在Hadoop之上

(1)HQL中對查詢語句的解釋、優化、生成查詢計劃是由Hive完成的

(2)全部的數據都是存儲在Hadoop中

(3)查詢計劃被轉化爲MapReduce任務,在Hadoop中執行(有些查詢沒有MR任務,如:select * from table)

(4)Hadoop和Hive都是用UTF-8編碼的

Hive編譯器的組成:

Hive編譯流程以下

Hive和數據庫的異同

因爲Hive採用了SQL的查詢語言HQL,所以很容易將Hive理解爲數據庫。其實從結構上來看,Hive和數據庫除了擁有相似的查詢語言,再無相似之處。數據庫能夠用在Online的應用中,可是Hive是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解Hive的特性。

Hive和數據庫的比較以下表:

        MapReduce 開發人員能夠把本身寫的 Mapper 和 Reducer 做爲插件支持 Hive 作更復雜的數據分析。 它與關係型數據庫的 SQL 略有不一樣,但支持了絕大多數的語句(如 DDL、DML)以及常見的聚合函數、鏈接查詢、條件查詢等操做。

        Hive 不適合用於聯機(online) 事務處理,也不提供實時查詢功能。它最適合應用在基於大量不可變數據的批處理做業。Hive 的特色是可 伸縮(在Hadoop 的集羣上動態的添加設備),可擴展、容錯、輸入格式的鬆散耦合。Hive 的入口是DRIVER ,執行的 SQL 語句首先提交到 DRIVER 驅動,而後調用 COMPILER 解釋驅動, 最終解釋成 MapReduce 任務執行,最後將結果返回。

Hive 數據類型

        Hive 提供了基本數據類型和複雜數據類型,複雜數據類型是 Java 語言所不具備的。本課程介紹 Hive 的兩種數據類型以及數據類型之間的轉換。

        (一)基本數據類型

        由上表咱們看到hive不支持日期類型,在hive裏日期都是用字符串來表示的,而經常使用的日期格式轉化操做則是經過自定義函數進行操做。

        hive是用java開發的,hive裏的基本數據類型和java的基本數據類型也是一一對應的,除了string類型。有符號的整數類型:TINYINT、SMALLINT、INT和BIGINT分別等價於java的byte、short、int和long原子類型,它們分別爲1字節、2字節、4字節和8字節有符號整數。Hive的浮點數據類型FLOAT和DOUBLE,對應於java的基本類型float和double類型。而hive的BOOLEAN類型至關於java的基本數據類型boolean。

        對於hive的String類型至關於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它能夠存儲2GB的字符數。

        (二)複雜數據類型

        Hive 有三種複雜數據類型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 與 Java 中的 Array 和 Map 相似,而STRUCT 與 C語言中的 Struct 相似,它封裝了一個命名字段集合,複雜數據類型容許任意層次的嵌套。

        複雜數據類型的聲明必須使用尖括號指明其中數據字段的類型。定義三列,每列對應一種複雜的數據類型,以下所示。

CREATE TABLE complex(
	col1 ARRAY< INT>, col2 MAP< STRING,INT>, col3 STRUCT< a:STRING,b:INT,c:DOUBLE> )

        (三)類型轉化

        Hive 的原子數據類型是能夠進行隱式轉換的,相似於 Java 的類型轉換,例如某表達式使用 INT 類型,TINYINT 會自動轉換爲 INT 類型, 可是 Hive 不會進行反向轉化,例如,某表達式使用 TINYINT 類型,INT 不會自動轉換爲 TINYINT 類型,它會返回錯誤,除非使用 CAST 操做。

        (1)隱式類型轉換規則以下。

            1)、任何整數類型均可以隱式地轉換爲一個範圍更廣的類型,如 TINYINT 能夠轉換成 INT,INT 能夠轉換成 BIGINT。

            2)、全部整數類型、FLOAT 和 String 類型均可以隱式地轉換成 DOUBLE。

            3)、TINYINT、SMALLINT、INT 均可以轉換爲 FLOAT。

            4)、BOOLEAN 類型不能夠轉換爲任何其它的類型。

        (2)可使用 CAST 操做顯示進行數據類型轉換,例如 CAST('1' AS INT) 將把字符串'1' 轉換成整數 1;若是強制類型轉換失敗,如執行 CAST('X' AS INT),表達式返回空值 NULL。

Hive 架構

下面是Hive的架構圖。

Hive的體系結構能夠分爲如下幾部分

(1)用戶接口主要有三個:CLI,Client 和 WUI。其中最經常使用的是CLI,Cli啓動的時候,會同時啓動一個Hive副本。Client是Hive的客戶端,用戶鏈接至Hive Server。在啓動 Client模式的時候,須要指出Hive Server所在節點,而且在該節點啓動Hive Server。 WUI是經過瀏覽器訪問Hive。

(2)Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。

(3)解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。

(4)Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,好比select * from tbl不會生成MapRedcue任務)。

(一)用戶接口

Hive 對外提供了三種服務模式,即 Hive 命令行模式(CLI),Hive 的 Web 模式(WUI),Hive 的遠程服務(Client)。下面介紹這些服務的用法。

一、 Hive 命令行模式

Hive 命令行模式啓動有兩種方式。執行這條命令的前提是要配置 Hive 的環境變量。

  1) 進入 /home/hadoop/app/hive 目錄,執行以下命令。

./hive

  2) 直接執行命令。

hive --service cli

Hive 命令行模式用於 Linux 平臺命令行查詢,查詢語句基本跟 MySQL 查詢語句相似,運行結果以下所示。

[hadoop@djt01 hive]$ hive
hive> show tables;
OK
stock
stock_partition
tst
Time taken: 1.088 seconds, Fetched: 3 row(s)
hive> select * from tst;
OK
Time taken: 0.934 seconds
hive> exit;
[hadoop@djt01 hive]$

二、Hive Web 模式

Hive Web 界面的啓動命令以下。

hive --service hwi

經過瀏覽器訪問 Hive,默認端口爲 9999。

三、 Hive 的遠程服務

遠程服務(默認端口號 10000)啓動方式命令以下,「nohup...&」 是 Linux 命令,表示命令在後臺運行。

nohup hive --service hiveserver &	//在Hive 0.11.0版本以前,只有HiveServer服務可用
nohup hive --service hiveserver2 &	//在Hive 0.11.0版本以後,提供了HiveServer2服務

Hive 遠程服務經過 JDBC 等訪問來鏈接 Hive ,這是程序員最須要的方式。

本課程咱們安裝的是hive1.0版本,因此啓動 hive service 命令以下。

hive  --service hiveserver2 &	//默認端口10000
hive --service hiveserver2 --hiveconf hive.server2.thrift.port 10002 &	//能夠經過命令行直接將端口號改成10002

hive的遠程服務端口號也能夠在hive-default.xml文件中配置,修改hive.server2.thrift.port對應的值便可。

< property> < name>hive.server2.thrift.port< /name> < value>10000< /value> < description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.< /description> < /property> 

Hive 的 JDBC 鏈接和 MySQL 相似,以下所示。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HiveJdbcClient {
	private static String driverName = "org.apache.hive.jdbc.HiveDriver";//hive驅動名稱  hive0.11.0以後的版本
	//private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";//hive驅動名稱  hive0.11.0以前的版本
	public static  void main(String[] args) throws SQLException {
		
		try{
			Class.forName(driverName);
		}catch(ClassNotFoundException e){
			e.printStackTrace();
			System.exit(1);
		}
		//第一個參數:jdbc:hive://djt01:10000/default  鏈接hive2服務的鏈接地址
		//第二個參數:hadoop  對HDFS有操做權限的用戶
		//第三個參數:hive  用戶密碼  在非安全模式下,指定一個用戶運行查詢,忽略密碼
		Connection con = DriverManager.getConnection("jdbc:hive://djt01:10000/default", "hadoop", "");
		System.out.print(con.getClientInfo());
	}
}

(二)元數據存儲。

Hive將元數據存儲在RDBMS中,有三種模式能夠鏈接到數據庫:

(1) 單用戶模式。此模式鏈接到一個In-memory 的數據庫Derby,通常用於Unit Test。

(2)多用戶模式。經過網絡鏈接到一個數據庫中,是最常用到的模式。

(3) 遠程服務器模式。用於非Java客戶端訪問元數據庫,在服務器端啓動MetaStoreServer,客戶端利用Thrift協議經過MetaStoreServer訪問元數據庫。

對於數據存儲,Hive沒有專門的數據存儲格式,也沒有爲數據創建索引,用戶能夠很是自由的組織Hive中的表,只須要在建立表的時候告訴Hive數據中的列分隔符和行分隔符,Hive就能夠解析數據。Hive中全部的數據都存儲在HDFS中,存儲結構主要包括數據庫、文件、表和視圖。Hive中包含如下數據模型:Table內部表,External Table外部表,Partition分區,Bucket桶。Hive默承認以直接加載文本文件,還支持sequence file 、RCFile。

(三)解釋器、編譯器、優化器。

  1)解析器(parser):將查詢字符串轉化爲解析樹表達式。

  2)語義分析器(semantic analyzer):將解析樹表達式轉換爲基於塊(block-based)的內部查詢表達式。

  3)邏輯策略生成器(logical plan generator):將內部查詢表達式轉換爲邏輯策略,這些策略由邏輯操做樹組成。

  4)優化器(optimizer):經過邏輯策略構造多途徑並以不一樣方式重寫。

Hive 文件格式

        hive文件存儲格式包括如下幾類:

        一、TEXTFILE

        二、SEQUENCEFILE

        三、RCFILE

        四、ORCFILE(0.11之後出現)

        其中TEXTFILE爲默認格式,建表時不指定默認爲這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理。

        SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地文件導入數據,數據要先導入到textfile格式的表中, 而後再從表中用insert導入SequenceFile,RCFile,ORCFile表中。

(一)TEXTFILE 格式

        默認格式,數據不作壓縮,磁盤開銷大,數據解析開銷大。 可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分, 從而沒法對數據進行並行操做。

示例:

create table if not exists textfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as textfile;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table textfile_table select * from textfile_table; 

(二)SEQUENCEFILE 格式

        SequenceFile是Hadoop API提供的一種二進制文件支持,其具備使用方便、可分割、可壓縮的特色。 SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,通常建議使用BLOCK壓縮。

示例:

create table if not exists seqfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as sequencefile;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
SET mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from textfile_table;  

(三)RCFILE 文件格式

        RCFILE是一種行列存儲相結合的存儲方式。首先,其將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄須要讀取多個block。其次,塊數據列式存儲,有利於數據壓縮和快速的列存取。

RCFILE文件示例:

create table if not exists rcfile_table(
site string,
url  string,
pv   bigint,
label string)
row format delimited
fields terminated by '\t'
stored as rcfile;
插入數據操做:
set hive.exec.compress.output=true;  
set mapred.output.compress=true;  
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  
insert overwrite table rcfile_table select * from textfile_table;

(四)再看TEXTFILE、SEQUENCEFILE、RCFILE三種文件的存儲狀況:

[hadoop@djt01 ~]$ hadoop dfs -dus /user/hive/warehouse/*
hdfs://hadoop@djt01:19000/user/hive/warehouse/hbase_table_1    0
hdfs://hadoop@djt01:19000/user/hive/warehouse/hbase_table_2    0
hdfs://hadoop@djt01:19000/user/hive/warehouse/orcfile_table    0
hdfs://hadoop@djt01:19000/user/hive/warehouse/rcfile_table    102638073
hdfs://hadoop@djt01:19000/user/hive/warehouse/seqfile_table   112497695
hdfs://hadoop@djt01:19000/user/hive/warehouse/testfile_table  536799616
hdfs://hadoop@djt01:19000/user/hive/warehouse/textfile_table  107308067
[hadoop@djt01 ~]$ hadoop dfs -ls /user/hive/warehouse/*/
-rw-r--r--   2 hadoop supergroup   51328177 2014-03-20 00:42 /user/hive/warehouse/rcfile_table/000000_0
-rw-r--r--   2 hadoop supergroup   51309896 2014-03-20 00:43 /user/hive/warehouse/rcfile_table/000001_0
-rw-r--r--   2 hadoop supergroup   56263711 2014-03-20 01:20 /user/hive/warehouse/seqfile_table/000000_0
-rw-r--r--   2 hadoop supergroup   56233984 2014-03-20 01:21 /user/hive/warehouse/seqfile_table/000001_0
-rw-r--r--   2 hadoop supergroup  536799616 2014-03-19 23:15 /user/hive/warehouse/testfile_table/weibo.txt
-rw-r--r--   2 hadoop supergroup   53659758 2014-03-19 23:24 /user/hive/warehouse/textfile_table/000000_0.gz
-rw-r--r--   2 hadoop supergroup   53648309 2014-03-19 23:26 /user/hive/warehouse/textfile_table/000001_1.gz
         總結: 相比TEXTFILE和SEQUENCEFILE,RCFILE因爲列式存儲方式,數據加載時性能消耗較大,可是具備較好的壓縮比和查詢響應。數據倉庫的特色是一次寫入、屢次讀取,所以,總體來看,RCFILE相比其他兩種格式具備較明顯的優點。
 

以上就是博主爲你們介紹的這一板塊的主要內容,這都是博主本身的學習過程,但願能給你們帶來必定的指導做用,有用的還望你們點個支持,若是對你沒用也望包涵,有錯誤煩請指出。若有期待可關注博主以第一時間獲取更新哦,謝謝! 

相關文章
相關標籤/搜索