大數據“復活”記
848
2025-04-01
Hive背景介紹
Hive最初是Facebook為了滿足對海量社交網絡數據的管理和機器學習的需求而產生和發展的。馬云在退休的時候說互聯網現在進入了大數據時代,大數據是現在互聯網的趨勢,而hadoop就是大數據時代里的核心技術,但是hadoop的mapreduce操作專業性太強,所以facebook在這些基礎上開發了hive框架,畢竟世界上會sql的人比會java的人多的多,hive可以說是學習hadoop相關技術的一個突破口,那些志立于投身hadoop技術開發的童鞋們,可以先從hive開始哦。那么,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構建在Hadoop之上
(1)HQL中對查詢語句的解釋、優化、生成查詢計劃是由Hive完成的
(2)所有的數據都是存儲在Hadoop中
(3)查詢計劃被轉化為MapReduce任務,在Hadoop中執行(有些查詢沒有MR任務,如:select * from table)
(4)Hadoop和Hive都是用UTF-8編碼的
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)。下面介紹這些服務的用法。
1、 Hive 命令行模式
Hive 命令行模式啟動有兩種方式。執行這條命令的前提是要配置 Hive 的環境變量。
1) 進入 /home/hadoop/app/hive 目錄,執行如下命令:
./hive
2) 直接執行命令:
hive --service cli
Hive 命令行模式用于 Linux 平臺命令行查詢,查詢語句基本跟 MySQL 查詢語句類似,運行結果如下所示:
2、Hive Web 模式
Hive Web 界面的啟動命令如下:
hive --service hwi
通過瀏覽器訪問 Hive,默認端口為 9999。
3、 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 類似,如下所示:
(二)元數據存儲。
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文件存儲格式包括以下幾類:
1、TEXTFILE
2、SEQUENCEFILE
3、RCFILE
4、ORCFILE(0.11以后出現)
其中TEXTFILE為默認格式,建表時不指定默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理。
SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地文件導入數據,數據要先導入到textfile格式的表中, 然后再從表中用insert導入SequenceFile,RCFile,ORCFile表中。
(一)TEXTFILE 格式
默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。 可結合Gzip、Bzip2使用(系統自動檢查,執行查詢時自動解壓),但使用這種方式,hive不會對數據進行切分, 從而無法對數據進行并行操作。
示例:
(二)SEQUENCEFILE 格式
SequenceFile是Hadoop API提供的一種二進制文件支持,其具有使用方便、可分割、可壓縮的特點。 SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。
示例:
(三)RCFILE 文件格式
RCFILE是一種行列存儲相結合的存儲方式。首先,其將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊數據列式存儲,有利于數據壓縮和快速的列存取。
RCFILE文件示例:
(四)再看TEXTFILE、SEQUENCEFILE、RCFILE三種文件的存儲情況:
總結: 相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存儲方式,數據加載時性能消耗較大,但是具有較好的壓縮比和查詢響應。數據倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其余兩種格式具有較明顯的優勢。
Hive 存儲 大數據
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。