Hive模式設(shè)計(jì)及優(yōu)化 省賽獲獎(jiǎng)_第1頁(yè)
Hive模式設(shè)計(jì)及優(yōu)化 省賽獲獎(jiǎng)_第2頁(yè)
Hive模式設(shè)計(jì)及優(yōu)化 省賽獲獎(jiǎng)_第3頁(yè)
Hive模式設(shè)計(jì)及優(yōu)化 省賽獲獎(jiǎng)_第4頁(yè)
Hive模式設(shè)計(jì)及優(yōu)化 省賽獲獎(jiǎng)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Hive模式設(shè)計(jì)及優(yōu)化Hive模式設(shè)計(jì)—按天劃分的表當(dāng)數(shù)據(jù)集增長(zhǎng)很快時(shí),傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)通常使用按天劃分的表,對(duì)應(yīng)hive,應(yīng)該使用分區(qū)表。Hive通過(guò)where子句中的表達(dá)式來(lái)選擇查詢所需要的指定的分區(qū),這樣的查詢執(zhí)行效率高。CREATETABLEsales(idSTRING,numINT,amountdouble,regionSTRING)PARTITIONEDBY(ymdString)ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';Hive模式設(shè)計(jì)—分區(qū)過(guò)多的問(wèn)題Hdfs用于存儲(chǔ)數(shù)百萬(wàn)的大文件,而非數(shù)十億的小文件。使用過(guò)多分區(qū)可能導(dǎo)致創(chuàng)建大量的非必須的hadoop文件和文件夾。一個(gè)分區(qū)對(duì)應(yīng)著一個(gè)包含多個(gè)文件的文件夾。如果存在大量文件,那么最終就會(huì)超出namenode對(duì)系統(tǒng)云數(shù)據(jù)信息的處理能力。Mapreduce會(huì)將一個(gè)任務(wù)(job)轉(zhuǎn)換成多個(gè)任務(wù)(task),默認(rèn)情況下,每個(gè)task都是一個(gè)新的JVM實(shí)例,都需要開啟和銷毀的開銷。對(duì)于小文件,每個(gè)文件都會(huì)對(duì)應(yīng)一個(gè)task。在一些情況下,JVM開啟和銷毀的時(shí)間中銷毀可能會(huì)比實(shí)際處理數(shù)據(jù)的時(shí)間消耗更長(zhǎng)。Hive模式設(shè)計(jì)—分區(qū)過(guò)多的問(wèn)題一個(gè)理想的分區(qū)方案不應(yīng)該產(chǎn)生太多的分區(qū),分區(qū)對(duì)應(yīng)的文件夾下的文件應(yīng)該足夠的大,應(yīng)該是文件系統(tǒng)中塊大小的若干倍。分區(qū)策略按時(shí)間范圍進(jìn)行分區(qū)是按照不同的時(shí)間粒度來(lái)確定合適大小的數(shù)據(jù)積累量。使用兩個(gè)級(jí)別的分區(qū)并且使用不同的維度。例如,第一個(gè)分區(qū)按照天進(jìn)行劃分,而二級(jí)分區(qū)按照區(qū)域進(jìn)行劃分。如果不能找到好的、大小相對(duì)合適的分區(qū)方式,可以使用分桶存儲(chǔ)。Hive模式設(shè)計(jì)—分桶表數(shù)據(jù)存儲(chǔ)CREATETABLEsales_p(id STRING,num INT,amountdouble,regionSTRING)PARTITIONEDBY(ymd

String,id STRING) ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';并非所有的數(shù)據(jù)集都可以形成合理的分區(qū),而且分區(qū)對(duì)應(yīng)的文件要足夠大。分桶是將數(shù)據(jù)集分解成更容易管理的若干部分的另一個(gè)技術(shù)。Hive模式設(shè)計(jì)—分桶表數(shù)據(jù)存儲(chǔ)CREATETABLEsales_b(idstring,numint,amountdouble,regionstring)PARTITIONEDBY(ymdstring)clusteredby(id)into4bucketsROWFORMATDELIMITEDFIELDSTERMINATEDBY',';Hive模式設(shè)計(jì)—同一份數(shù)據(jù)多種處理insertintotablestocks_drselect*fromstockswheresymbol=600718;insertintotablestocks_kdselect*fromstockswheresymbol=002230;Hive可以從一個(gè)數(shù)據(jù)源產(chǎn)生多個(gè)數(shù)據(jù)聚合,而無(wú)需每次聚合都要重新掃描一次。對(duì)于大的數(shù)據(jù)集,這個(gè)優(yōu)化可以節(jié)約很多時(shí)間。fromstocksinsertintotablestocks_drselect*wheresymbol=600718insertintotablestocks_xfselect*wheresymbol=002230;Hive優(yōu)化-使用explainHive提供EXPLAIN命令,顯示查詢的執(zhí)行計(jì)劃explainselectsum(num)fromsales;explainextendedselectsum(num)fromsales;Hive優(yōu)化-Join優(yōu)化Hive查詢時(shí),對(duì)每個(gè)記錄進(jìn)行連接操作時(shí),會(huì)將其他表緩存起來(lái),然后掃描最后那個(gè)表進(jìn)行計(jì)算,因此用戶需要保證連續(xù)查詢中表的大小從左到右是依次增加的。Hive提供了一個(gè)“標(biāo)記”機(jī)制來(lái)顯式的告訴查詢優(yōu)化器哪個(gè)表是大表。select/*+streamtable(a)*/a.ymd,a.symbolHive優(yōu)化-并行執(zhí)行Hive會(huì)將一個(gè)查詢轉(zhuǎn)化成一個(gè)或者多個(gè)階段,這樣的階段可以是mapreduce階段、抽樣階段、合并階段、limit階段,或者h(yuǎn)ive執(zhí)行過(guò)程中可能需要的其他階段。默認(rèn)情況下,hive一次只會(huì)執(zhí)行一個(gè)階段。有些job可能包含多個(gè)階段,而這些階段可能并非完全相互依賴,這些階段是可以并行執(zhí)行的。設(shè)置參數(shù)hive.exec.parallel為true,可以開啟并發(fā)執(zhí)行。Hive優(yōu)化-hive嚴(yán)格模式hive提供了一個(gè)嚴(yán)格模式,可以防止用戶執(zhí)行那些可能產(chǎn)生意想不到的不好的效果的查詢。即某些查詢?cè)趪?yán)格模式下無(wú)法執(zhí)行。通過(guò)設(shè)置hive.mapred.mode的值為strict,可以禁止3種類型的查詢。查詢分區(qū)表的where語(yǔ)句中沒(méi)有包含分區(qū)字段過(guò)濾條件使用了orderby的查詢,沒(méi)有l(wèi)imit語(yǔ)句限制笛卡爾積的查詢Hive優(yōu)化-JVM重用JVM重用對(duì)hive的性能具有非常大的影響,特別是對(duì)于很難避免小文件的場(chǎng)景或者task特別多的場(chǎng)景,這類場(chǎng)景大多數(shù)執(zhí)行時(shí)間都很短。hadoop默認(rèn)配置是使用JVM來(lái)執(zhí)行map和reduce任務(wù)的,這時(shí)jvm的啟動(dòng)過(guò)程可能會(huì)造成相當(dāng)大的開銷,尤其是執(zhí)行的job包含有成千上萬(wàn)個(gè)task任務(wù)的情況。JVM重用可以使得JVM實(shí)例在同一個(gè)JOB中重新使用N次,N的值可以在Hadoop的mapre-site.xml文件中進(jìn)行設(shè)置mapred.job.reuse.jvm.num.tasks。Hive優(yōu)化-動(dòng)態(tài)分區(qū)調(diào)整動(dòng)態(tài)分區(qū)插入可以通過(guò)簡(jiǎn)單的select語(yǔ)句向分區(qū)表中創(chuàng)建很多新的分區(qū)如果分區(qū)的個(gè)數(shù)太多,那么就會(huì)在系統(tǒng)中產(chǎn)生大量的輸出控制流,因此配置限制動(dòng)態(tài)分區(qū)數(shù)量很有必要。通過(guò)參數(shù)hive.exec.dynamic.partition.mode設(shè)置動(dòng)態(tài)分區(qū)模式為嚴(yán)格模式(strict)通過(guò)參數(shù)hive.exec.max.dynamic.partitions限制可以創(chuàng)建的總的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)。通過(guò)參數(shù)hive.exec.max.dynamic.partitions.pernode限制在每個(gè)mapper/reducernode可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)。通過(guò)參數(shù)dfs.datanode.max.transfer.threads來(lái)控制datanode上一次可以打開的文件的數(shù)量,這個(gè)參數(shù)必須設(shè)置在datanode的hdfs-site.xml文件中.Hive的join--CommonJoinHive中的Join可分為CommonJoin(Reduce階段完成join)、MapJoin(Map階段完成join)和SMB(Sort-Merge-Bucket)如果不指定MapJoin或者不符合MapJoin的條件,那么Hive解析器會(huì)默認(rèn)執(zhí)行CommonJoin,即在Reduce階段完成join。整個(gè)過(guò)程包含Map、Shuffle、Reduce階段。Map階段

讀取源表的數(shù)據(jù),Map輸出的時(shí)候以Joinon條件中的列為key,如果Join有多個(gè)關(guān)聯(lián)鍵,則以這些關(guān)聯(lián)鍵的組合作為key;Map輸出的value為join之后所關(guān)心的(select或者where中需要用到的)列,同時(shí)在value中還會(huì)包含表的Tag信息,用于標(biāo)明此value對(duì)應(yīng)哪個(gè)表。Shuffle階段

根據(jù)key的值進(jìn)行hash,并將key/value按照hash值推送至不同的reduce中,這樣確保兩個(gè)表中相同的key位于同一個(gè)reduce中。Reduce階段

根據(jù)key的值完成join操作,期間通過(guò)Tag來(lái)識(shí)別不同表中的數(shù)據(jù)。Hive的join--CommonJoinSELECTa.id,a.dept,b.ageFROMajoinbON(a.id=b.id);Hive的join--MapjoinMapJoin通常用于一個(gè)很小的表和一個(gè)大表進(jìn)行join的場(chǎng)景,小表大小由參數(shù)hive.mapjoin.smalltable.filesize來(lái)決定,默認(rèn)值為25M。自動(dòng)方式hive自動(dòng)根據(jù)sql,選擇使用commonjoin或者mapjoin需要設(shè)置屬性hive.auto.convert.join=true手動(dòng)方式select/*+mapjoin(n)*/m.col,m.col2,n.col3frommjoinnonm.col=n.col;Hive的join--MapjoinMapjoinusers表有500w+的記錄,log表里user_id有上百萬(wàn)個(gè),每日的會(huì)員uv不會(huì)太多,有交易的會(huì)員不會(huì)太多,有點(diǎn)擊的會(huì)員不會(huì)太多,有傭金的會(huì)員不會(huì)太多等等。users表相對(duì)log表小些,但也無(wú)法mapjoinselect

*

fromlogaleft

outerjoin

usersbon

a.user_id

=

b.user_id;select/*+mapjoin(x)*/*fromlogaleftouterjoin(select/*+mapjoin(c)*/d.*from(selectdistinctuser_idfromlog)cjoinusersdonc.user_id=d.user_id)xona.user_id=x.user_id;Hive的join--SMB(Sort-Merge-Bucket)SortMergeBucketJoin主要是為了解決大表與大表間的Join問(wèn)題,分桶其實(shí)就是把大表化成了“小表”,然后通過(guò)Map-SideJoin解決.對(duì)于JOIN操作的兩個(gè)表有一個(gè)相同的列,如果這兩個(gè)表是在連接列上建立的桶表,那么將保存相同列值的桶進(jìn)行JOIN操作就可以大大較少JOIN的數(shù)據(jù)量.hivejoin數(shù)據(jù)傾斜數(shù)據(jù)傾斜(skew)使得某個(gè)reducer要處理的數(shù)據(jù)特別多,而其他reducer要處理的很少,任務(wù)進(jìn)度長(zhǎng)時(shí)間維持在99%(或100%).hivejoin數(shù)據(jù)傾斜join的key值發(fā)生傾斜,key值包含很多空值,對(duì)空值賦一個(gè)隨機(jī)值來(lái)分散keyselectuserid,namefromuser_infoajoin(selectcasewhenuseridisnullthencast(rand(47)*100000asint)elseuseridendfromuser_read_log)bona.userid=b.useridhivejoin數(shù)據(jù)傾

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論