Hive 架構(gòu)思想和設(shè)計(jì)原理_第1頁
Hive 架構(gòu)思想和設(shè)計(jì)原理_第2頁
Hive 架構(gòu)思想和設(shè)計(jì)原理_第3頁
Hive 架構(gòu)思想和設(shè)計(jì)原理_第4頁
Hive 架構(gòu)思想和設(shè)計(jì)原理_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Hive架構(gòu)思想和設(shè)計(jì)原理1前言

大家好~我是理哥

。今天為大家推薦的是夢(mèng)想家的

Hive架構(gòu)思想和設(shè)計(jì)原理,希望對(duì)大家有啟發(fā)。2Hive

MapReduce雖然只有map和reduce這兩個(gè)函數(shù),但幾乎可以滿足任何大數(shù)據(jù)分析和機(jī)器學(xué)習(xí)的場(chǎng)景。不過,復(fù)雜的計(jì)算可能需要使用多個(gè)job才能完成,這些job之間還需要根據(jù)其先后依賴關(guān)系進(jìn)行作業(yè)的編排,開發(fā)比較復(fù)雜。

在Hadoop出現(xiàn)之前,大部分的數(shù)據(jù)分析人員基本都用SQL語句分析數(shù)據(jù)庫中的數(shù)據(jù),如果讓這些數(shù)據(jù)分析人員重新學(xué)習(xí)一下Hadoop支持的開發(fā)語言,將會(huì)耗費(fèi)巨大的人力成本和學(xué)習(xí)成本。

所以,就有聰明的小伙伴想到,如果能根據(jù)SQL自動(dòng)生成MapReduce,就可以極大降低大數(shù)據(jù)技術(shù)在數(shù)據(jù)分析領(lǐng)域的應(yīng)用門檻。

基于這樣的一個(gè)需求場(chǎng)景,Hive橫空出世。 Hive的架構(gòu)

首先讓我們來看下Hive的架構(gòu)。Hive可以通過CLI,JDBC和ODBC等客戶端進(jìn)行訪問。除此之外,Hive還支持WUI訪問Hive內(nèi)部執(zhí)行流程:解析器(解析SQL語句)、編譯器(把SQL語句編譯成MapReduce程序)、優(yōu)化器(優(yōu)化MapReduce程序)、執(zhí)行器(將MapReduce程序運(yùn)行的結(jié)果提交到HDFS)Hive的元數(shù)據(jù)保存在數(shù)據(jù)庫中,如保存在MySQL,SQLServer,PostgreSQL,Oracle及Derby等數(shù)據(jù)庫中。Hive中的元數(shù)據(jù)信息包含表名,列名,分區(qū)及其屬性,表的屬性(包括是否為外部表),表數(shù)據(jù)所在目錄等。Hive將大部分HiveSQL語句轉(zhuǎn)化為MapReduce作業(yè)提交到Hadoop上執(zhí)行;少數(shù)HiveSQL語句不會(huì)轉(zhuǎn)化為MapReduce作業(yè),直接從DataNode上獲取數(shù)據(jù)后按照順序輸出。

知曉了架構(gòu),我們接下來通過一條常見的SQL語句,來看看Hive是如何將其轉(zhuǎn)換成MapReduce來計(jì)算的。 MapReduce實(shí)現(xiàn)SQL的原理SELECT

pageid,

age,

count(1)

FROM

pv_users

GROUP

BY

pageid,

age;

就像所展示的一樣,這是一條很常見的SQL統(tǒng)計(jì)分析語句,用于統(tǒng)計(jì)不同年齡的用戶訪問不同網(wǎng)頁的興趣偏好,具體數(shù)據(jù)輸入和執(zhí)行的結(jié)果示例如圖所示:

看這個(gè)示例我們就會(huì)發(fā)現(xiàn),這個(gè)計(jì)算場(chǎng)景和WordCount很像。事實(shí)上也確實(shí)如此,我們可以用MapReduce完成這條SQL的處理。

這樣一條很有實(shí)用價(jià)值的SQL就被很簡(jiǎn)單的MapReduce計(jì)算過程處理好了。

map函數(shù)輸出的key是表的行記錄,value是1,reduce函數(shù)對(duì)相同的行進(jìn)行記錄,也就是針對(duì)具有相同key的value集合進(jìn)行求和計(jì)算,最終得到SQL的輸出結(jié)果。

Hive要做的就是將SQL翻譯成MapReduce程序代碼。實(shí)際上,Hive內(nèi)置了很多Operator,每個(gè)Operator完成一個(gè)特定的計(jì)算過程,Hive將這些Operator構(gòu)造成一個(gè)有向無環(huán)圖DAG,然后根據(jù)這些Operator之間是否存在shuffle將其封裝到map或者reduce函數(shù)中,之后就可以提交給MapReduce執(zhí)行了。

Operator組成的DAG如下圖所示,這是一個(gè)包含where查詢條件的SQL,where查詢條件對(duì)應(yīng)一個(gè)FilterOperator。

值得注意的是,有些HiveQL語句不會(huì)被Hive轉(zhuǎn)化成MapReduce作業(yè),Hive只會(huì)從DataNode將數(shù)據(jù)獲取到了之后,按照順序依次輸出。select

*

from

user; Hive如何實(shí)現(xiàn)join操作

除了上面這些簡(jiǎn)單的聚合(groupby)、過濾(where)操作,Hive還能執(zhí)行連接(joinon)操作。

比如現(xiàn)在來了一個(gè)需求。

有2張表,一張是page_view頁面瀏覽記錄表,一張是user用戶表

如果我想收集到每個(gè)頁面瀏覽用戶的age信息,該如何獲取。

很明顯,這兩張表都有一個(gè)相同的字段userid,根據(jù)這個(gè)字段可以將兩張表連接起來,生成我們最終想要的結(jié)果表pv_users,SQL命令是SELECT

pv.pageid,

u.age

FROM

page_view

pv

JOIN

user

u

ON

(pv.userid

=

u.userid);

同樣,這個(gè)SQL命令也可以轉(zhuǎn)化為MapReduce計(jì)算,連接的過程如下圖所示。

從圖上看,join的MapReduce計(jì)算過程和前面的groupby稍有不同,因?yàn)閖oin涉及兩張表,來自兩個(gè)文件(夾),所以需要在map輸出的時(shí)候進(jìn)行標(biāo)記,比如來自第一張表的輸出Value就記錄為<1,X>,這里的1表示數(shù)據(jù)來自第一張表。這樣經(jīng)過shuffle以后,相同的Key被輸入到同一個(gè)reduce函數(shù),就可以根據(jù)表的標(biāo)記對(duì)Value數(shù)據(jù)求笛卡爾積,用第一張表的每條記錄和第二張表的每條記錄連接,輸出就是join的結(jié)果。

所以我們?nèi)绻蜷_Hive的源代碼,看join相關(guān)的代碼,會(huì)看到一個(gè)兩層for循環(huán),對(duì)來自兩張表的記錄進(jìn)行連接操作。

Hive命令說明

在Hive提供的所有連接方式中,命令行界面是最常見的一種。用戶可以使用Hive的命令行對(duì)Hive中的數(shù)據(jù)庫,數(shù)據(jù)表和數(shù)據(jù)進(jìn)行各種的操作。

關(guān)于Hive命令使用的小技巧,可以看之前寫的文章??《關(guān)于Hive命令的7個(gè)小技巧,你都清楚嗎?》

關(guān)于Hive查詢的18種姿勢(shì),可以看之前寫的文章??《Hive查詢的18種方式,你都學(xué)會(huì)了嗎?》 Hive函數(shù)使用

Hive內(nèi)部支持大量的函數(shù),可以通過SHOWFUNCTIONS查看Hive的內(nèi)置函數(shù)。靈活地運(yùn)用Hive提供的函數(shù)能夠極大地節(jié)省數(shù)據(jù)分析成本。Hive函數(shù)主要包含數(shù)學(xué)函數(shù),集合函數(shù),類型轉(zhuǎn)換函數(shù),日期函數(shù),條件函數(shù),字符串函數(shù),聚合函數(shù)和表生成函數(shù)等。

因?yàn)閮?nèi)容過多,篇幅有限,我就展示部分內(nèi)容。微信關(guān)注大數(shù)據(jù)夢(mèng)想家公眾號(hào),后臺(tái)回復(fù)“hive”即可解鎖“hive函數(shù)大全” Hive調(diào)優(yōu)

調(diào)優(yōu)向來都非常重要,無論是面試復(fù)習(xí),還是實(shí)際工作,都少不了和它打交道。

例如,從建表設(shè)計(jì)層面,我們可以考慮到利用分區(qū)表/分桶表優(yōu)化,選擇選擇合適的壓縮格式。

從HQL語法和運(yùn)行參數(shù)層面,我們可以采用查看Hive執(zhí)行計(jì)劃,列剪裁,謂詞下推,分區(qū)剪裁,合并小文件等方式...

從Hive架構(gòu)層面,我們可以采用啟用本地抓取,本地執(zhí)行優(yōu)化,JVM重用,并行執(zhí)行等方式...

因?yàn)檫@部分內(nèi)容如果展開來寫確實(shí)非常多,不利于閱讀,而且本篇文章的定位并不是保姆級(jí)Hive教程,所以我就不費(fèi)更多精力去敘述這些內(nèi)容。正好我之前收集了一本《Hive性能調(diào)優(yōu)實(shí)戰(zhàn)》,

里面的內(nèi)容非常干貨,從環(huán)境搭建,到深入MapReduce引擎分析...最后一章,還介紹了

Hive知識(shí)體系

最后,附贈(zèng)一張馬中華老師親繪的Hive的SQL編譯源碼詳解,想從源碼角度更深理解Hive執(zhí)行流程可以從鏈接獲取高清大圖:/zhongqi2513/article/details/1071536983巨人的肩膀「1」《從零開始學(xué)大數(shù)據(jù)》

「2」《大數(shù)據(jù)平臺(tái)架構(gòu)與實(shí)現(xiàn)》

「3」《架構(gòu)師的自我修煉》

4尾聲

在實(shí)踐中,工程師其實(shí)并不需要經(jīng)常編寫MapReduce程序,因?yàn)榫W(wǎng)站最主要的大數(shù)據(jù)處理就是SQL分析,也因此Hive在大數(shù)據(jù)應(yīng)用中的作用非常重要。

后面隨著Hive的普及,我們對(duì)于在Hadoop上執(zhí)行SQL的需求越加強(qiáng)烈,對(duì)大數(shù)據(jù)SQL的應(yīng)用場(chǎng)景也多樣化起來,于是又開發(fā)了各種大數(shù)據(jù)SQL引擎。

例如Cloudera也開發(fā)了Impala,這是一種運(yùn)行在HDFS上的MPP架構(gòu)的SQL引擎。和MapReduce啟動(dòng)Map和Reduce兩種執(zhí)行進(jìn)程,將計(jì)算過程分成兩個(gè)階段進(jìn)行計(jì)算不同,Impala在所有DataNode服務(wù)器上部署相同的Impalad進(jìn)程,多個(gè)Impalad進(jìn)程相互協(xié)作,共同完成SQL計(jì)算。在一些統(tǒng)計(jì)場(chǎng)景中,Impala可以做到毫秒級(jí)的計(jì)算速度。

還有后面我會(huì)為大家介紹的

SparkSQL,此外,大家還希望在NoSQL的數(shù)據(jù)庫上執(zhí)行SQL,畢竟SQL發(fā)展了幾十年,積累了龐大的用戶群體

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論