一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明涉及一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng),該方法包括,解析接收到的SQL語句,生成抽象語法樹;轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹;優(yōu)化所述查詢計(jì)劃樹;根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè),該系統(tǒng)基于Antlr工具對SQL語句生成抽象語法樹AST,并進(jìn)一步基于AST生成一種查詢計(jì)劃樹結(jié)構(gòu),最終在查詢計(jì)劃樹的基礎(chǔ)上生成MapReduce作業(yè),同時(shí)還提供了相應(yīng)的優(yōu)化策略,以確保生成的MapReduce作業(yè)擁有更高的執(zhí)行效率。
【專利說明】—種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理【技術(shù)領(lǐng)域】,尤其涉及一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng)。
【背景技術(shù)】
[0002]隨著現(xiàn)代信息技術(shù)尤其是互聯(lián)網(wǎng)的急速發(fā)展,各個(gè)領(lǐng)域和應(yīng)用平臺的數(shù)據(jù)量亦呈爆炸性增長。急遽擴(kuò)充的數(shù)據(jù)量使得在此基礎(chǔ)上各種應(yīng)用的計(jì)算任務(wù)強(qiáng)度和復(fù)雜性隨之大增。與此同時(shí),低成本、高性能商用計(jì)算機(jī)和存儲設(shè)備的不斷增多且應(yīng)用日益廣泛,就使得大規(guī)模、可擴(kuò)展的分布式計(jì)算系統(tǒng)能夠得以很快地建立起來去支撐這些計(jì)算和應(yīng)用。近年來,分布式計(jì)算框架MapReduce (MR),依靠優(yōu)秀的任務(wù)自動(dòng)并行化機(jī)制以及容錯(cuò)能力,為大規(guī)模數(shù)據(jù)分析所面臨的挑戰(zhàn)提供了一個(gè)實(shí)用有效的解決方案。
[0003]作為MapReduce的開源實(shí)現(xiàn),Hadoop已經(jīng)被廣泛應(yīng)用于實(shí)際的生產(chǎn)當(dāng)中。雖然直接利用Hadoop的編程接口進(jìn)行開發(fā),能夠充分利用MapReduce框架的靈活性,編寫出高性能的程序,但是,由于使用這種方法用戶需要手動(dòng)編碼,實(shí)現(xiàn)相應(yīng)的map及reduce方法,不僅效率低下,而且增加了程序調(diào)試的難度,如果能夠像傳統(tǒng)的關(guān)系型數(shù)據(jù)庫那樣,利用SQL語句高級查詢語言,交由數(shù)據(jù)庫引擎執(zhí)行相關(guān)的操作,那么,不僅能提高工作效率,而且還能輕松地發(fā)現(xiàn)程序中所存在的問題。盡管MapReduce模型已經(jīng)提供了十分規(guī)范的編程接口,但是要編寫出由多個(gè)MapReduce作業(yè)組成數(shù)據(jù)處理程序卻并不是一件容易的事情。對于習(xí)慣使用類似SQL等 高級語言的編程人員來說,MR提供的編程模型相對而言就顯得抽象化層次較低因而難以使用。為了使得MR框架的使用更加便利,很多機(jī)構(gòu)逐漸嘗試在MR框架之上提供抽象層次更高的編程接口。
[0004]現(xiàn)有技術(shù)中的MR上層接口框架主要有以下幾種:
[0005](l)Pig是由Yahoo !公司研發(fā)的基于MapReduce的開源數(shù)據(jù)分析工具。Pig提供高級的面向數(shù)據(jù)流的編程語言PigLatin。PigLatin類似腳本語言并與SQL語言的描述方法接近,它比SQL更靈活和容易擴(kuò)展。Pig通過將PigLatin語言編寫的程序編譯成一系列優(yōu)化的MR作業(yè),然后提交給MR框架如Hadoop執(zhí)行,這些操作對用戶都是透明的;
[0006](2) Hive由Facebook開發(fā)并應(yīng)用于其數(shù)據(jù)倉庫中。與Pig類似,Hive在MR編程模型之上提供了抽象層次更高且相對易于使用的類SQL高級語言接口框架,其設(shè)計(jì)初衷是希望熟悉SQL語言的工程師能快速方便地處理存儲在Hadoop中的海量數(shù)據(jù),因此由Hive提供的編程語言HiveQL與SQL非常相似。此外,Hive還支持表和模式的概念,以表的方式組織數(shù)據(jù),并支持對數(shù)據(jù)按屬性分區(qū)存儲;
[0007](3)Tezing是在Google-MapReduce計(jì)算框架之上實(shí)現(xiàn)對SQL的支持,其設(shè)計(jì)初衷是Google為了支持對數(shù)據(jù)的Ad-hoc (即時(shí)查詢)分析,因而在性能優(yōu)化方面做了大量極具價(jià)值的工作,包括編譯優(yōu)化以及對MapReduce本身的增強(qiáng)等,這些都使得Tenzing的性能在很多方面接近甚至超過了并行數(shù)據(jù)倉庫;
[0008]此外,類似的實(shí)現(xiàn)還有Google的Sawzall和FlumeJava,與Pig, Hive相同都是在MR框架之上進(jìn)行的語言擴(kuò)展工作。而且,國外一些并行數(shù)據(jù)庫廠商,如Greenplum、AsterData、Paraccel和Vertica等也已經(jīng)將MR模型和相關(guān)概念嵌入到自己產(chǎn)品中。這些整合基本上都是編程接口層面上的工作,即在并行數(shù)據(jù)庫中同時(shí)支持SQL和MR編程接口。
[0009]綜上所述,在基于MapReduce的高級語言編程接口方面,Pig和Hive基本思路都是在MapReduce框架上,通過將類似SQL的高級語言編寫的數(shù)據(jù)分析任務(wù)翻譯成MapReduce作業(yè)來執(zhí)行。但是由于MapReduce模型的執(zhí)行過程固定,使得編譯生成的查詢計(jì)劃能夠執(zhí)行的優(yōu)化非常有限,因此它們都不支持對大規(guī)模數(shù)據(jù)的快速分析?;诩夹g(shù)現(xiàn)狀和應(yīng)用需求,在此需要實(shí)現(xiàn)一種解決方案,能夠?qū)QL操作語句轉(zhuǎn)化成可執(zhí)行MapReduce作業(yè)流,同時(shí)保證生成的MapReduce作業(yè)流具有較高的執(zhí)行效率。
【發(fā)明內(nèi)容】
[0010]本發(fā)明所要解決的技術(shù)問題是如何根據(jù)SQL操作語句自動(dòng)生成相應(yīng)的可執(zhí)行MapReduce作業(yè),并保證生成的MapReduce作業(yè)具有較高的執(zhí)行效率。
[0011]為此目的,本發(fā)明提出了一種基于SQL的MapReduce作業(yè)生成方法,包括以下步驟:
[0012]解析接收到的SQL語句,生成抽象語法樹;
[0013]轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹;
[0014]優(yōu)化所述查詢計(jì)劃樹;
[0015]根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)。
[0016]進(jìn)一步,所述解析接收到的SQL語句,生成抽象語法樹,具體包括:
[0017]接收SQL語句;
[0018]對所述SQL語句進(jìn)行詞法分析;
[0019]對所述SQL語句進(jìn)行語法分析;
[0020]根據(jù)所述分析結(jié)果,生成抽象語法樹。
[0021]進(jìn)一步,所述轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹,具體包括:
[0022]獲取所述抽象語法樹;
[0023]轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹;
[0024]根據(jù)所述中間樹結(jié)構(gòu)生成對應(yīng)的查詢計(jì)劃樹。
[0025]進(jìn)一步,所述優(yōu)化所述查詢計(jì)劃樹,具體包括:
[0026]確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系;
[0027]根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合并。
[0028]進(jìn)一步,所述關(guān)聯(lián)關(guān)系包括:輸入關(guān)聯(lián)、傳輸關(guān)聯(lián)和作業(yè)流關(guān)聯(lián);
[0029]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為輸入關(guān)聯(lián),則在所述兩個(gè)節(jié)點(diǎn)的Map作業(yè)生成階段進(jìn)行節(jié)點(diǎn)合并;
[0030]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為傳輸關(guān)聯(lián),則先將所述兩個(gè)節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn),在所述公共節(jié)點(diǎn)的Map作業(yè)生成階段獲取所述兩個(gè)節(jié)點(diǎn)分別進(jìn)行處理,在Reduce作業(yè)生成階段再次進(jìn)行節(jié)點(diǎn)合并;
[0031]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為作業(yè)流關(guān)聯(lián),則將所述節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn)。[0032]進(jìn)一步,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè),具體包括:
[0033]生成Map作業(yè);
[0034]生成Reduce 作業(yè)。
[0035]進(jìn)一步,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)之后,還包括:根據(jù)后續(xù)遍歷查詢計(jì)劃樹的方式生成對應(yīng)的MapReduce作業(yè)流。
[0036]此外,本發(fā)明還提供了一種基于SQL的MapReduce作業(yè)生成系統(tǒng),該系統(tǒng)包括:SQL解析模塊、處理模塊、優(yōu)化模塊和作業(yè)生成模塊,
[0037]SQL解析模塊,用于解析接收到的SQL語句,生成抽象語法樹;
[0038]處理模塊,用于轉(zhuǎn)化SQL解析模塊生成的抽象語法樹為查詢計(jì)劃樹;
[0039]優(yōu)化模塊,用于優(yōu)化所述查詢計(jì)劃樹;
[0040]作業(yè)生成模塊,用于根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)流。
[0041]進(jìn)一步,所述處理模塊,包括:
[0042]獲取單元,用于獲取所述抽象語法樹;
[0043]轉(zhuǎn)換單元,用于轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹;
[0044]生成單元,用于根據(jù)所述中間樹生成對應(yīng)的查詢計(jì)劃樹。
[0045]進(jìn)一步,所述優(yōu)化模塊,包括:
[0046]確定單元,用于確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系;
[0047]優(yōu)化單元,用于根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合并。
[0048]通過采用本發(fā)明所公開的一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng),使用戶能夠直接使用SQL查詢語句與系統(tǒng)進(jìn)行交互,并且根據(jù)能夠根據(jù)用戶輸入的SQL查詢語句,自動(dòng)生成優(yōu)化的MapReduce作業(yè)流,無需根據(jù)框架的特性手動(dòng)編碼,進(jìn)而確保最終的執(zhí)行效率。
【專利附圖】
【附圖說明】
[0049]通過參考附圖會更加清楚的理解本發(fā)明的特征和優(yōu)點(diǎn),附圖是示意性的而不應(yīng)理解為對本發(fā)明進(jìn)行任何限制,在附圖中:
[0050]圖1示出了本發(fā)明一種基于SQL的MapReduce作業(yè)生成方法的流程圖;
[0051 ] 圖2示出了本發(fā)明中類節(jié)點(diǎn)中間樹結(jié)構(gòu)圖;
[0052]圖3不出了本發(fā)明一種基于SQL的MapReduce作業(yè)生成系統(tǒng)的模塊圖。
【具體實(shí)施方式】
[0053]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0054]本發(fā)明提出一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng),在現(xiàn)有的文法分析器Antlr工具對SQL語句生成抽象語法樹AST的基礎(chǔ)之上,進(jìn)一步生成一種查詢計(jì)劃樹結(jié)構(gòu),最終在查詢計(jì)劃樹的基礎(chǔ)上,配合一種操作任務(wù)優(yōu)化策略生成MapReduce作業(yè),以確保生成的MapReduce作業(yè)程序相比此前的同類系統(tǒng),擁有更高的執(zhí)行效率。[0055]本發(fā)明實(shí)施例中提供了一種基于SQL的MapReduce作業(yè)生成方法,如圖1所示,包括以下步驟:
[0056]步驟S101,解析接收到的SQL語句,生成抽象語法樹;
[0057]步驟S102,轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹;
[0058]步驟S103,優(yōu)化所述查詢計(jì)劃樹;
[0059]步驟S104,根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)。
[0060]其中,解析接收到的SQL語句,生成抽象語法樹,具體包括:
[0061]步驟S201,接收SQL語句;
[0062]步驟S202,對所述SQL語句進(jìn)行詞法分析;
[0063]步驟S203,對所述SQL語句進(jìn)行語法分析;
[0064]步驟S204,根據(jù)所述分析結(jié)果,生成抽象語法樹。
[0065]其中,轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹,具體包括:
[0066]步驟S301,獲取所述抽象語法樹;
[0067]步驟S302,轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹;
[0068]步驟S303,根據(jù)所述中間樹結(jié)構(gòu)生成對應(yīng)的查詢計(jì)劃樹。
[0069]得到抽象語法樹AST后,還需要將抽象語法樹AST轉(zhuǎn)化成更加適合處理的方式。如圖2所示,當(dāng)讀入AST后,經(jīng)過轉(zhuǎn)換后,形成以查詢節(jié)點(diǎn)SelectNode、數(shù)據(jù)表節(jié)點(diǎn)TableNode、篩選節(jié)點(diǎn)WhereNode、排序節(jié)點(diǎn)OrderByNode、聚合節(jié)點(diǎn)GroupByNode五大類節(jié)點(diǎn)組成的類節(jié)點(diǎn)中間樹結(jié)構(gòu);
[0070]①SelectNode:該節(jié)點(diǎn)主要存儲著需要從查詢中獲取的字段的信息,這里的字段可能是單獨(dú)的字段,也可能是聚集函數(shù)的結(jié)果;
[0071]②TableNode:主要是存儲查詢所需的數(shù)據(jù)表的信息,這里的數(shù)據(jù)表可以單表,也可以是多表,甚至其也可以是嵌套的Select查詢生成的臨時(shí)表;
[0072]③WhereNode:存儲著Where子句對應(yīng)的字段,用來進(jìn)行數(shù)據(jù)的篩選;
[0073]④OrderByNode:存儲著Order By子句相關(guān)的信息,如Order By指令所針對的列,正序還是倒序,列所屬的表等;
[0074]⑤GroupByNode:存儲著Group By子句對應(yīng)的信息。主要是Group By針對的列,主要用來判斷聚合相關(guān)。
[0075]在完成了 AST解析后,需要將其轉(zhuǎn)化成對應(yīng)的查詢計(jì)劃樹,才能進(jìn)行接下來的作業(yè)流生成和優(yōu)化工作。這里定義了三類Job節(jié)點(diǎn):AGG,代表聚合操作Join,代表數(shù)據(jù)表連接操作;Sort,代表排序操作。這三類節(jié)點(diǎn)中分別包含以下信息:
[0076]I)數(shù)據(jù)源信息:該Job所需要處理的數(shù)據(jù)來源是物理表,還是中間臨時(shí)數(shù)據(jù)表,以及該來源數(shù)據(jù)的具體組織結(jié)構(gòu)信息;
[0077]2)字段信息:該Job處理的字段的名稱、類型、所屬的表;
[0078]3)字段過濾信息:該Job是否對字段進(jìn)行了過濾操作,如Where或者Having,及過濾的具體情況,如大于、小于等等。
[0079]4)結(jié)果信息:該Job輸出的結(jié)果的形式,如輸出字段內(nèi)容、字段類型和排序的類型
坐寸ο
[0080]將基于抽象語法樹AST結(jié)構(gòu)得來的類節(jié)點(diǎn)的組合按照所述的三類Job節(jié)點(diǎn):聚合操作AGG、數(shù)據(jù)表連接操作Join、排序操作Sort,劃分要求,進(jìn)一步將步驟I得到的結(jié)果轉(zhuǎn)化為最終的查詢計(jì)劃樹。
[0081]進(jìn)一步,所述優(yōu)化所述查詢計(jì)劃樹,具體包括:
[0082]步驟S401,確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系;
[0083]步驟S402,根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合并。
[0084]進(jìn)一步,所述關(guān)聯(lián)關(guān)系包括:輸入關(guān)聯(lián)、傳輸關(guān)聯(lián)和作業(yè)流關(guān)聯(lián);
[0085]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為輸入關(guān)聯(lián),則在所述兩個(gè)節(jié)點(diǎn)的Map作業(yè)生成階段進(jìn)行節(jié)點(diǎn)合并;
[0086]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為傳輸關(guān)聯(lián),則先將所述兩個(gè)節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn),在所述公共節(jié)點(diǎn)的Map作業(yè)生成階段獲取所述兩個(gè)節(jié)點(diǎn)分別進(jìn)行處理,在Reduce作業(yè)生成階段再次進(jìn)行節(jié)點(diǎn)合并;
[0087]如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為作業(yè)流關(guān)聯(lián),則將所述節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn)。
[0088]本發(fā)明中,根據(jù)查詢計(jì)劃樹及MapReduce作業(yè)本身的特點(diǎn),定義了三種關(guān)聯(lián):
[0089]①輸入關(guān)聯(lián)Job節(jié)點(diǎn)的輸入數(shù)據(jù)集相交。
[0090]②傳輸關(guān)聯(lián)Job節(jié)點(diǎn)在具有輸入關(guān)聯(lián)的基礎(chǔ)上,在map作業(yè)生成階段使用相同的key進(jìn)行分區(qū)操作。
[0091]③作業(yè)流關(guān)聯(lián):作為父節(jié)點(diǎn)的Job節(jié)點(diǎn),與子節(jié)點(diǎn)使用相同的key在map作業(yè)生成階段進(jìn)行分區(qū)操作。
[0092]并提出了三條優(yōu)化規(guī)則:
[0093]1.如果兩個(gè)Job之間有著輸入關(guān)聯(lián),則將它們的map作業(yè)生成階段合并。它們以讓使兩個(gè)Job,當(dāng)時(shí)使用相同map作業(yè)生成階段產(chǎn)生的中間數(shù)據(jù)。如果它們具有傳輸關(guān)聯(lián),它們將被合并成一個(gè)公共的Job。在這里,需要生成一個(gè)新的作業(yè),在新作業(yè)的Map作業(yè)生成階段將原來兩個(gè)表中所需要處理的數(shù)據(jù)都獲取到并進(jìn)行預(yù)處理,并根據(jù)原先Job的信息,在新的Reduce作業(yè)生成階段處理獲取到的數(shù)據(jù);
[0094]I1.如果一個(gè)Job節(jié)點(diǎn)和它的所有子節(jié)點(diǎn)具有作業(yè)流關(guān)聯(lián),那么就可以將它們合并成一個(gè)公共的Job ;
[0095]II1.該規(guī)則是規(guī)則二的特例,主要用來處理父節(jié)點(diǎn)存在多個(gè)子節(jié)點(diǎn),但是子節(jié)點(diǎn)卻只有一個(gè)與父節(jié)點(diǎn)具有關(guān)聯(lián)作業(yè)流關(guān)聯(lián)。這是,并不能簡單的進(jìn)行合并,否則會出現(xiàn)問題。Job只與兩個(gè)子節(jié)點(diǎn)Job中的一個(gè)存在作業(yè)流關(guān)聯(lián),則需在無關(guān)聯(lián)Job先執(zhí)行的情況下,有關(guān)聯(lián)的兩個(gè)Job才能合并。
[0096]進(jìn)一步,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)之后,還包括:根據(jù)后續(xù)遍歷查詢計(jì)劃樹的方式生成對應(yīng)的MapReduce作業(yè)流。
[0097]在這里,作業(yè)流生成使用了后續(xù)遍歷查詢計(jì)劃樹的方式來實(shí)現(xiàn),通過使用遞歸遍歷的方式,確保在不存在左右子節(jié)點(diǎn)的情況下,再訪問中間父節(jié)點(diǎn),遞歸偽代碼如下:
[0098]void traverse(T*tree)
[0099]{
[0100]if (tree-〉left) {
[0101]traverse(tree->left);[0102] }
[0103]if (tree->right) {
[0104]traverse (tree->right);
[0105]}
[0106]access(tree->data);
[0107]}
[0108]進(jìn)一步,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè),具體包括:
[0109]步驟S501,生成Map作業(yè);
[0110]步驟S502,生成Reduce作業(yè)。
[0111]為了能夠生成正確的代碼,必須考慮到MapReduce的核心流程及單個(gè)MapReduce作業(yè)生成的問題。
[0112]其中,單個(gè)MapReduce作業(yè)的生成方式如下:
[0113]①生成Map作業(yè);
[0114]a.源數(shù)據(jù)的篩選:
[0115]對于輸入的數(shù)據(jù),首先根據(jù)TableNode中列信息,篩選出指定的數(shù)據(jù)列對應(yīng)的數(shù)據(jù)。
[0116]b.數(shù)據(jù)的過濾:
[0117]此處的過濾是針對非聚合函數(shù)處理的列信息的過濾。這里主要是針對Where子句的內(nèi)容進(jìn)行過濾的,由于Whrere是一個(gè)約束條件,它根據(jù)用戶指定的過濾條件,在查詢出的結(jié)果返回之前執(zhí)行過濾操作,最終返回過濾后的數(shù)據(jù)。由于在Where中不能使用聚合函數(shù),因此對于經(jīng)過Count、Max等聚合函數(shù)處理過的列的過濾的情況,需要放在Reduce階段處理。這里,根據(jù)WhereNode中的where中的相關(guān)信息,對輸入的數(shù)據(jù)進(jìn)行過濾。
[0118]c.數(shù)據(jù)的輸出:
[0119]在這里,需要關(guān)注的是Key的選取,主要是根據(jù)Order By或者Group By子句,來選擇對應(yīng)的列或者列的組合作為Key。這樣,就可以利用MapReduce本身的Shuffle階段的特性來實(shí)現(xiàn)聚合以及排序的要求。
[0120]②生成Reduce作業(yè);
[0121]a.數(shù)據(jù)的聚合:
[0122]這里主要根據(jù)TableNode中存儲的針對列的聚合信息,對列進(jìn)行聚合。由于之前Map階段已經(jīng)對數(shù)據(jù)進(jìn)行了聚合操作,這里僅僅需要針對Key對應(yīng)的Values集合,根據(jù)聚合函數(shù)進(jìn)行相應(yīng)的運(yùn)算,如AVG (求平均)、SUM (求和)等。
[0123]b.數(shù)據(jù)的篩選:
[0124]Reduce階段的過濾,主要是根據(jù)Having后面的限定條件,對聚合后的數(shù)據(jù)進(jìn)行再次過濾。之所以這樣處理,是由于Where只能在查詢返回前對數(shù)據(jù)進(jìn)行過濾,不能處理數(shù)據(jù)聚合的情況。而Having相比Where,也是用來進(jìn)行數(shù)據(jù)篩選操作的。不過,它是在查詢返回結(jié)果集以后,再對查詢結(jié)果進(jìn)行的篩選操作,即Having子句能夠在聚合后對記錄進(jìn)行篩選。
[0125]c.數(shù)據(jù)的連接Join:
[0126]將兩張表具有Join關(guān)系的表,根據(jù)Where子句中指定的關(guān)聯(lián)項(xiàng),關(guān)聯(lián)起來,合成一張表。這張表,將作為臨時(shí)表,與接下來的表繼續(xù)進(jìn)行Join操作。或者作為最終輸出的結(jié)果表。
[0127]d.結(jié)果的輸出:
[0128]這里,將過濾以及Join后的數(shù)據(jù),以NULL為Key,將所有的數(shù)據(jù)作為Value輸出到指定的位置。
[0129]通過采用本發(fā)明所公開的一種基于SQL的MapReduce作業(yè)生成方法,使用戶能夠直接使用SQL查詢語句與系統(tǒng)進(jìn)行交互,并且能夠根據(jù)用戶輸入的SQL查詢語句,自動(dòng)生成優(yōu)化的MapReduce作業(yè)流,無需根據(jù)框架的特性,手動(dòng)編碼,進(jìn)而確保開發(fā)效率及最終的執(zhí)行效率。
[0130]此外,本發(fā)明還提供了一種基于SQL的MapReduce作業(yè)生成系統(tǒng),如圖3所示,該系統(tǒng)包括:SQL解析模塊1、處理模塊2、優(yōu)化模塊3和作業(yè)生成模塊4,
[0131]SQL解析模塊I,用于解析接收到的SQL語句,生成抽象語法樹;
[0132]處理模塊2,用于轉(zhuǎn)化SQL解析模塊生成的抽象語法樹為查詢計(jì)劃樹;
[0133]優(yōu)化模塊3,用于優(yōu)化所述查詢計(jì)劃樹;
[0134]作業(yè)生成模塊4,用于根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)流。
[0135]進(jìn)一步,所述處理模塊2,包括:
[0136]獲取單元,用于獲取所述抽象語法樹;
[0137]轉(zhuǎn)換單元,用于轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹;
[0138]生成單元,用于根據(jù)所述中間樹生成對應(yīng)的查詢計(jì)劃樹。
[0139]進(jìn)一步,所述優(yōu)化模塊3,包括:
[0140]確定單元,用于確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系;
[0141]優(yōu)化單元,用于根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合并,減少節(jié)點(diǎn)數(shù)目,確保最終生成的MapReduce作業(yè)流的效率。
[0142]本系統(tǒng)中,處理模塊首先接收生成單元產(chǎn)生的抽象語法樹AST,按照針對輸入SQL語句定義的五個(gè)類:SelectNode、TableNode> WhereNode> OrderByNode 及 GroupByNode,將其在內(nèi)存中轉(zhuǎn)化成相應(yīng)的類節(jié)點(diǎn)中間樹表示方式,最后結(jié)合三類Job節(jié)點(diǎn):AGG,代表聚合操作;Join,代表數(shù)據(jù)表連接操作;S0rt,代表排序操作,最終得到查詢計(jì)劃樹結(jié)構(gòu)。
[0143]本系統(tǒng)在現(xiàn)有的Antlr工具對SQL語句生成抽象語法樹AST的基礎(chǔ)之上,進(jìn)一步生成一種查詢計(jì)劃樹結(jié)構(gòu),最終在查詢計(jì)劃樹的基礎(chǔ)上,配合一種操作任務(wù)優(yōu)化策略生成MapReduce作業(yè),以確保生成的MapReduce作業(yè)程序相比此前的同類系統(tǒng),擁有更高的執(zhí)行效率。
[0144]通過采用本發(fā)明所公開的一種基于SQL的MapReduce作業(yè)生成方法及系統(tǒng),使用戶能夠直接使用SQL查詢語句與系統(tǒng)進(jìn)行交互,并且能夠根據(jù)用戶輸入的SQL查詢語句,自動(dòng)生成優(yōu)化的MapReduce作業(yè)流,無需根據(jù)框架的特性,手動(dòng)編碼,進(jìn)而確保開發(fā)及最終的執(zhí)行效率。
[0145]雖然結(jié)合附圖描述了本發(fā)明的實(shí)施方式,但是本領(lǐng)域技術(shù)人員可以在不脫離本發(fā)明的精神和范圍的情況下做出各種修改和變型,這樣的修改和變型均落入由所附權(quán)利要求所限定的范圍之內(nèi)。
【權(quán)利要求】
1.一種基于SQL的MapReduce作業(yè)生成方法,其特征在于,包括: 解析接收到的SQL語句,生成抽象語法樹; 轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹; 優(yōu)化所述查詢計(jì)劃樹; 根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述解析接收到的SQL語句,生成抽象語法樹,具體包括: 接收SQL語句; 對所述SQL語句進(jìn)行詞法分析; 對所述SQL語句進(jìn)行語法分析; 根據(jù)所述分析結(jié)果,生成抽象語法樹。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述轉(zhuǎn)化所述抽象語法樹為查詢計(jì)劃樹,具體包括: 獲取所述抽象語 法樹; 轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹; 根據(jù)所述中間樹生成對應(yīng)的查詢計(jì)劃樹。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述優(yōu)化所述查詢計(jì)劃樹,具體包括: 確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系; 根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合并。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述關(guān)聯(lián)關(guān)系包括:輸入關(guān)聯(lián)、傳輸關(guān)聯(lián)和作業(yè)流關(guān)聯(lián); 如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為輸入關(guān)聯(lián),則在所述兩個(gè)節(jié)點(diǎn)的Map作業(yè)生成階段進(jìn)行節(jié)點(diǎn)合并; 如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為傳輸關(guān)聯(lián),則先將所述兩個(gè)節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn),在所述公共節(jié)點(diǎn)的Map作業(yè)生成階段獲取所述兩個(gè)節(jié)點(diǎn)分別進(jìn)行處理,在Reduce作業(yè)生成階段再次進(jìn)行節(jié)點(diǎn)合并; 如果查詢計(jì)劃樹中的兩個(gè)節(jié)點(diǎn)為作業(yè)流關(guān)聯(lián),則將所述節(jié)點(diǎn)合并為一個(gè)公共節(jié)點(diǎn)。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹的每個(gè)節(jié)點(diǎn),分別生成對應(yīng)的MapReduce作業(yè),具體包括: 生成Map作業(yè); 生成Reduce作業(yè)。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)之后,還包括:根據(jù)后續(xù)遍歷查詢計(jì)劃樹的方式生成對應(yīng)的MapReduce作業(yè)流。
8.一種基于SQL的MapReduce作業(yè)生成系統(tǒng),其特征在于,包括:SQL解析模塊、處理模塊、優(yōu)化模塊和作業(yè)生成模塊, SQL解析模塊,用于解析接收到的SQL語句,生成抽象語法樹; 處理模塊,用于轉(zhuǎn)化SQL解析模塊生成的抽象語法樹為查詢計(jì)劃樹; 優(yōu)化模塊,用于優(yōu)化所述查詢計(jì)劃樹;作業(yè)生成模塊,用于根據(jù)優(yōu)化后的查詢計(jì)劃樹生成對應(yīng)的MapReduce作業(yè)流。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述處理模塊,包括: 獲取單元,用于獲取所述抽象語法樹; 轉(zhuǎn)換單元,用于轉(zhuǎn)化所述抽象語法樹為由抽象類節(jié)點(diǎn)組成的中間樹; 生成單元,用于根據(jù)所述中間樹生成對應(yīng)的查詢計(jì)劃樹。
10.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述優(yōu)化模塊,包括: 確定單元,用于確定所述查詢計(jì)劃樹中節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系;優(yōu)化單元,用于根據(jù)所述關(guān)聯(lián)關(guān)系進(jìn)行節(jié)點(diǎn)的合 并。
【文檔編號】G06F17/30GK103761080SQ201310729051
【公開日】2014年4月30日 申請日期:2013年12月25日 優(yōu)先權(quán)日:2013年12月25日
【發(fā)明者】李林, 韓洪林, 曹津, 趙明明, 葉思菁, 朱德海, 張曉東, 姚曉闖 申請人:中國農(nóng)業(yè)大學(xué)