




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)據(jù)倉庫也是基于Hive搭建,每天執(zhí)行近萬次的HiveETL計算流程,負責(zé)每天數(shù)百GB的數(shù)據(jù)和分析。Hive的穩(wěn)定性和性能對我們的數(shù)據(jù)分析非常關(guān)1、MapReduceSQL在幾次升級Hive的過程中,我們遇到了一些大大小小的問題。通過向社區(qū)的咨詢和自己的努力,在解決這些問題的同時我們對Hive將SQL編譯為MapReduce1、MapReduceSQLSQL1.11.1J,o.orderidfromorderojoinuseruono.uid= mapvalue中為不同表的數(shù)據(jù)打上tagreduce階段根據(jù)tag1.21.2GroupByselectrank,isonline,count(*)fromcitygroupbyrank, GroupBymapkeyMapReducereduceLastKeykey。MapReduce(當(dāng)然這里只是說明Reduce端的非Hash聚合過程)1.31.3Distinctselectdealid,count(distinctuid)numfromordergroupby 當(dāng)只有一個distinctMapHashGroupBy,只需GroupByDistinctmapkey,mapreduceGroupByreducekeyreducedistinctselectselectdealid,count(distinctuid),count(distinctdate)fromordergroupdistinctuiddateLastKeyreduce階段在內(nèi)存中通過Hash去重distinctnMapReducereduce存消耗,但是缺點是增加了shuffle的數(shù)據(jù)量。reducevaluedistinct留value值,其余distinct數(shù)據(jù)行value字段均可為空。2、SQL2、SQLMapReduceMapReduceSQLHiveMapReduce AntlrSQLAST ASTTree, QueryBlock ,減少 Phase1Phase1SQLHive使用AntlrSQLAntlrAntlrAntlr語法文件,定義詞法和語法替換規(guī)則即可,Antlr2.1.2抽象語法樹ASTHive中語則的定義文件在0.10版本以前是Hive.g一個文件,隨著語則越來越復(fù)雜,由語則生成的Java解析類可能超過Java類文件的最大上限,0.11版本將Hive.g拆成了5個文件,詞則HiveLexer.g和語則的4個文件SelectClauseParser.g,F(xiàn)romClauseParser.g,IdentifiersParser.g,2.1.2抽象語法樹AST經(jīng)過詞法和語法解析后,如果需要對表達式做進一步的處理,使用Antlr的抽 下面的一段語法是HiveSQL中SelectStatement的語則,從中可以看出SelectStatementselect,from,where,groupbyhaving,orderby標(biāo)示特定語法,比如TOK_QUERY標(biāo)示一個查詢塊)::limitClause?->^(TOK_QUERYfromClause^(TOK_INSERT^(TOK_DIRselectClausewhereClause?groupByClause?havingClause?orderByClause?clusterByClause?distributeByClause?sortByClause?;2.1.3樣例SQLMapReduceSQLSQLp.datekeydatekey,p.useriduserid,cJOINfact.orderpaymentpONp.orderid=c.orderidJOINdefault.userduONdu.userid=p.useridWHEREp.datekey)INSERTOVERWRITETABLE`test`.`customer_kpi`count(distinctbase.userid)GROUPBYbase.datekey,.3SQLASTHive.gHiveLexerXHiveLexerXlexer=newHiveLexerX(new TokenRewriteStreamtokens=newTokenRewriteStream(lexer);if(ctx!=null){}HiveParserparser=new析//HiveParser.statement_returnr=null;try{}catch(RecognitionExceptione){thrownew}//最終生成的ASTTree如下圖右側(cè)(使用AntlrWorks生成,AntlrWorks是Antlr這里注意一下內(nèi)層子查詢也會生成一個TOK_DESTINATION節(jié)點。請看上面SelectStatement的語則,這個節(jié)點是在語法改寫中特意增加了的一個節(jié)Insert詳細來看,將內(nèi)存子查詢的from子句展開后,得到如下ASTTree,每個表生2.22.2Phase2SQLASTTreeQueryBlockSQL.1QueryBlockSQL程,輸出。簡單來講一個QueryBlock就是一個子查詢。HiveQueryBlockQB#qbp即QBParseInfoSQL支持value節(jié)點。類QBParseInfo其余HashMap屬性分別保存輸出和各個操作的ASTNode節(jié)點的對應(yīng)關(guān)系。JoinQBExprUnion.2ASTTreeTOK_QUERYTOK_QUERY=>創(chuàng)建QBTOK_FROMQBaliasToTabsTOK_INSERTTOK_DESTINATIONQBParseInfo象的nameToDest屬性中TOK_SELECTdestToSelExpr、destToAggregationExprs、destToDistinctFuncExprs三個屬性中TOK_WHERE=>將WhereQBParseInfo\\Phase3邏輯操作符Hive最終生成的MapReduce任務(wù),Map階段和Reduce階段均由從名字就能猜出各個操作符完成的功能,TableScanOperatorMapReduce取數(shù)據(jù)。JoinOperator完成Join操作。FilterOperator完成過濾操作ReduceSinkOperatorMapReduceKey/value,PartitionKey,只可能出現(xiàn)在Map階段,同時也標(biāo)志著Hive生成的MapReduce程序中Map階段的結(jié)束。OperatorMapReduceOperatorchildOperatorOperatorRowSchemaRowSchemaOperatorInputObjInspectoroutputObjInspectorprocessOpOperator,forward遞給子Operator處理Hive每一行數(shù)據(jù)經(jīng)過一個Operator處理之后,會對字段重新編號,colExprMapOperatorHive的MapReduceOperator將所有運行時需要的參數(shù)保存在OperatorDesc中,并反序列化。MapOperatorTreeHDFS在 n”)+.2QueryBlockOperatorQueryBlockOperatorTreeQBQB#aliasToSubqQB#aliasToSubqQBParseInfo#joinExpr=>QBJoinTree=>ReduceSinkOperator+TableScanOperator(“dim.userTableScanOperator(“dim.user”)TS[0] ”)TS[1]Join/GroupBy/OrderByReduce化為ReduceKey/value,PartitionKeyp=fact.orderpaymentQBParseInfo#joinExprQBParseInfo#joinExprQBJoinTreeQBJoinTree/ /\cp 和fact.orderpaymentJoin圖中TS=TableScanOperatorRS=ReduceSinkOperator dim.userJoin QB2QBParseInfo#destToWhereExprFilterOperator下圖中圖中FILFilterOperatorSEL根據(jù)QB1的QBParseInfo#destToGroupby生成+圖中GBYGBY[12HASHHashFileSinkOperator,2.42.4Phase4邏輯層優(yōu)化器MapReduceJob,減少shuffle數(shù)據(jù)量的目的。②GroupBy②MapJoin,需要SQL中提供hint,0.11版本已②②Map①合并線性的OperatorTree中partition/sortkey相同的reduce①①利用查詢中的相關(guān)性,合并有相關(guān)性的Job,Job關(guān)性的Job,參考HiveCorrelationOptimizer2.4.1PredicatePushDown2.4.1PredicatePushDown.2NonBlockingOpDeDupProcNonBlockingOpDeDupProcSEL-SEL或者FIL-FIL為一個.3ReduceSinkDeDuplicationReduceSinkDeDuplication可以合并線性相連的兩個RS。實際上CorrelationOptimizerReduceSinkDeDuplication非線性的操作RS,但是Hive先實現(xiàn)的ReduceSinkDeDuplicationSQLfromfrom(selectkey,valuefromsrcgroupbykey,value)sselects.keygroupOperatorTreeRSKey排序順序一致;2pRSPartitionKeycRSPartitionKey。符合優(yōu)化條ReduceSinkDeDuplication將childRS和parentheRS與childRS之間的OperatorRSKeykey,valuePartitionKeykey段。合并后的OperatorTree如下:2.52.5Phase5OperatorTreeMapReduceJobReduceSinkOperatorMap/ReduceJobJoinOperatorStatTaskMapReduceOperator.1對輸出表生成MoveTask,完成將最終生成的HDFS臨時文件移動到目標(biāo)表 Move2.5.2開始遍歷中的元素(省略QB1,未畫出)TS[p]放入棧opStack{TS[p].3Rule1TS%生成MapReduceTaskR1(python"".join([t+"%"fortinopStack])== MapWork屬性保存Operator根節(jié)點的由于OperatorTree之間之間的所有Operator.4Rule2TS%.*RS%確定TS[pOperatorOperatoropStack的規(guī)則R2"".join([t+"%"fortinopStack])== 這時候在]對象的屬性保存2.5.5Rule2.5.5Rule3RS%.*RS%生成新MapReduceTaskJOIN[5Operator,OperatoropStackRSopStack{TS[p],FIL[18RS[4],JOIN[5],RS[6]}時,就會滿足下面的規(guī)則R3"".join([t"".join([tfortinopStack]“RS%.*RS%”//opStack這時候創(chuàng)建一個新的MapReduceTask[Stage-2]對象,將OperatorTree從JOIN[5RS[6]之間剪開,并為JOIN[5OperatorFS[19],RS[6]生成一個TS[20],MapReduceTask[Stage-2]對象的MapWork屬性保存TS[20]的新生成的FS[19]將中間數(shù)據(jù)落地,在HDFS臨時文件中RS[6OperatorOperatoropStackopStack{TS[p],FIL[18]RS[4],JOIN[5],RS[6],JOIN[8],GBY[12],RS[13R3MapReduceTask[Stage-3]對象,并切開Stage-2和Stage-3的.6R4FS%連接MapReduceTask最終將所有子Operator存入棧中之后,opStack={TS[p],FIL[18],RS[4],JOIN[5]RS[6],JOIN[8]SEL[10]GBY[12],RS[13],GBY[14],SEL[15]FS[17]}"".join([t+"%"fortinopStack])== .7合并將opStacktoWalkopStackTS[duopStack={TS[du],RS[7]R2JOIN[8MapReduceTask[Stage-5ReduceWorkMapOperator與MapReduceWorkMap象中發(fā)現(xiàn),JOIN[8]已經(jīng)存在。此時將MapReduceTask[Stage-2]和MapReduceTask[Stage-5]合并為一個MapReduceTask2.5.8切分2.5.8切分MapReduceMapWork和ReduceWorkOperatorTreeRS2.62.6Phase6物理層優(yōu)化器MapJoinbucketorderby0.12中發(fā) .1MapJoinMapJoinMapJoinDistributedDistributedCacheHashTableFilesMapReduceJob在Map階段,每個Mapper從DistributedCache傳遞給下一個MapReduce任務(wù)。2.6.2Com
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大客戶銷售崗位面試問題及答案
- 福建省泉港市泉港一中2025年高一化學(xué)第二學(xué)期期末質(zhì)量檢測模擬試題含解析
- 2025屆河北省石家莊市藁城第五中學(xué)高二下化學(xué)期末經(jīng)典試題含解析
- 吉林省白城市通榆縣一中2025年高二化學(xué)第二學(xué)期期末檢測試題含解析
- 2025屆北京專家化學(xué)高二下期末學(xué)業(yè)水平測試模擬試題含解析
- 四川省雅安市2025屆化學(xué)高一下期末聯(lián)考模擬試題含解析
- 醫(yī)用設(shè)備銷售管理辦法
- 華為營運資金管理辦法
- 辦公區(qū)域門禁管理辦法
- 村級電站確權(quán)管理辦法
- 七八年級的英語單詞
- 舞臺使用合同范例
- 2024年面向社會公開招聘警務(wù)輔助人員報名信息表
- 《地區(qū)智能電網(wǎng)調(diào)度技術(shù)支持系統(tǒng)應(yīng)用功能規(guī)范》
- 2024中國類風(fēng)濕關(guān)節(jié)炎診療指南
- 11294營銷管理-國家開放大學(xué)2023年1月至7月期末考試真題及答案(共2套)
- 12-重點幾何模型-手拉手模型-專題訓(xùn)練
- 2024年河北省張家口市“三支一扶”招聘130人(高頻重點復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 2023年遂寧市船山區(qū)選調(diào)教師考試真題
- CJJT259-2016 城鎮(zhèn)燃氣自動化系統(tǒng)技術(shù)規(guī)范
- 合伙人散伙分家協(xié)議書范文
評論
0/150
提交評論