06.23 我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

Hive背景介紹

Hive最初是Facebook為了滿足對海量社交網絡數據的管理和機器學習的需求而產生和發展的。馬雲在退休的時候說互聯網現在進入了大數據時代,大數據是現在互聯網的趨勢,而hadoop就是大數據時代裡的核心技術,但是hadoop的mapreduce操作專業性太強,所以facebook在這些基礎上開發了hive框架,畢竟世界上會sql的人比會java的人多的多,下面·由小編帶領大家去查看一下hive到底什麼

Hive簡介

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

那麼為什麼說hive是基於Hadoop的呢?

之所以說hive是構建在Hadoop之上的數據倉庫,簡單的說是因為:

①數據存儲在hdfs上

②數據計算用mapreduce

下面我們來深入分析一下:

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進行日誌分析,包括百度、淘寶等。

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到底是什麼?它和數據倉庫和數據庫之間什麼關係?

Hive構建在Hadoop之上

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

(2)所有的數據都是存儲在Hadoop中

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

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

Hive編譯器的組成:

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

Hive編譯流程如下

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

Hive和數據庫的異同

由於Hive採用了SQL的查詢語言HQL,因此很容易將Hive理解為數據庫。其實從結構上來看,Hive和數據庫除了擁有類似的查詢語言,再無類似之處。數據庫可以用在Online的應用中,但是Hive是為數據倉庫而設計的,清楚這一點,有助於從應用角度理解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裡日期都是用字符串來表示的,而常用的日期格式轉化操作則是通過自定義函數進行操作。

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到底是什麼?它和數據倉庫和數據庫之間什麼關係?

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

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

CREATE TABLE complex(
\tcol1 ARRAY< INT>,
\tcol2 MAP< STRING,INT>,
\tcol3 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到底是什麼?它和數據倉庫和數據庫之間什麼關係?

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)。下面介紹這些服務的用法。

1、 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]$

2、Hive Web 模式

Hive Web 界面的啟動命令如下。

hive --service hwi

通過瀏覽器訪問 Hive,默認端口為 9999。

3、 Hive 的遠程服務

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

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

Hive 遠程服務通過 JDBC 等訪問來連接 Hive ,這是程序員最需要的方式。

本課程我們安裝的是hive1.0版本,所以啟動 hive service 命令如下。

hive --service hiveserver2 &\t//默認端口10000
hive --service hiveserver2 --hiveconf hive.server2.thrift.port 10002 &\t//可以通過命令行直接將端口號改為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>
\t\t

Hive 的 JDBC 連接和 MySQL 類似,如下所示。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

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

(二)元數據存儲

Hive將元數據存儲在RDBMS中,有三種模式可以連接到數據庫:

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

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

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

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

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

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?

對於數據存儲,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文件存儲格式包括以下幾類:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以後出現)

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

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

我們常說的hive到底是什麼?它和數據倉庫和數據庫之間什麼關係?


分享到:


相關文章: