大數(shù)據(jù)數(shù)據(jù)庫(kù)技術(shù),MapReduce與 MPP比拼,誰(shuí)更勝一籌?
這些年大數(shù)據(jù)概念已經(jīng)成為IT界的熱門,我們經(jīng)常也會(huì)在新聞和報(bào)紙中看到。大數(shù)據(jù)概念中最為關(guān)鍵的技術(shù)就是數(shù)據(jù)庫(kù)管理系統(tǒng),伴隨著hadoop和MapReduce技術(shù)的流行,大數(shù)據(jù)的數(shù)據(jù)庫(kù)中Hive和Spark等新型數(shù)據(jù)庫(kù)脫穎而出;而另一個(gè)技術(shù)流派是基于傳統(tǒng)的并行數(shù)據(jù)庫(kù)技術(shù)演化而來(lái)的大規(guī)模并行處理(MPP)數(shù)據(jù)庫(kù)比如GreenPlum和HAWQ也在最近幾年突飛猛進(jìn),這兩種流派都有對(duì)應(yīng)的比較知名的產(chǎn)品,他們都已得到了市場(chǎng)的認(rèn)可。
然而對(duì)于一個(gè)不是搞大數(shù)據(jù)的門外漢,如何理解大數(shù)據(jù)概念,如何根據(jù)自身的需求來(lái)選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng),就成了很多用戶很關(guān)心的話題。本文將采用比較通俗易懂的介紹,讓大家從本質(zhì)上認(rèn)識(shí)這些大數(shù)據(jù)庫(kù)管理系統(tǒng)的技術(shù)實(shí)現(xiàn)和應(yīng)用場(chǎng)景。
Map Reduce技術(shù)
大數(shù)據(jù)概念,顧名思義就是要解決數(shù)據(jù)量很大的情況下的數(shù)據(jù)庫(kù)處理問(wèn)題,所以在數(shù)據(jù)量增長(zhǎng)很快的情況下,如何讓處理的時(shí)間不能增長(zhǎng)太多就成了關(guān)鍵。學(xué)習(xí)過(guò)算法的同學(xué)們很快能夠舉出例子,比如對(duì)半查找法,在一個(gè)已排序好的數(shù)據(jù)集中如何找到和指定數(shù)相等的位置?
最笨的方法是從頭到尾查找一遍,這個(gè)時(shí)間復(fù)雜度跟數(shù)據(jù)量是1:1的關(guān)系;
比較好的方法是,講這個(gè)數(shù)據(jù)分成幾段,每段由單獨(dú)的計(jì)算機(jī)去算,這樣效率能提高n倍(n為分為的段數(shù)),時(shí)間復(fù)雜度跟數(shù)據(jù)量是1:n的關(guān)系;
而對(duì)半查找法則是根據(jù)已知數(shù)據(jù)集是排好序的,所以我們只要在數(shù)據(jù)集的中間位置比較一下,就能知道我們要找的數(shù)據(jù)是在前半段還是后半段,然后選取有效的半段遞歸下去,直到有效半段只含一個(gè)數(shù)值就找到值相等的位置了,這個(gè)時(shí)間復(fù)雜度是1:2^m(m為遞歸循環(huán)的次數(shù))。
假設(shè)我們有1024個(gè)數(shù),那么用這三個(gè)方法的處理時(shí)間比值為:1024:1024/n:10。從這個(gè)比值上很容易看出,隨著數(shù)據(jù)量的增大,第三種方法的優(yōu)勢(shì)越發(fā)明顯。
如何讓普通的數(shù)據(jù)處理也能像對(duì)半查找法一樣高效,Google發(fā)表的論文提出了Map Reduce編程模型。該模型比較抽象復(fù)雜,接下來(lái)我用生活中的例子來(lái)說(shuō)明該模型設(shè)計(jì)的原理。比如在一個(gè)大學(xué)里的大課堂里,老師想要知道上課的學(xué)生總數(shù)(實(shí)際上就是數(shù)據(jù)庫(kù)的count操作),于是他讓學(xué)生做如下事情:
所有的學(xué)生都站起來(lái),同時(shí)每個(gè)學(xué)生記住自己的人數(shù)為1
每個(gè)同學(xué)都各自尋找站著的學(xué)生,找到后進(jìn)行如下操作(假設(shè)學(xué)生A找到學(xué)生B):
1) A的最新人數(shù)=A的舊人數(shù)+B的人數(shù)
2) B坐下,A站著,繼續(xù)步驟2.直到最后站著的人只剩下一個(gè),那么該人持有的人數(shù)就是這堂課學(xué)生的總數(shù)。
通過(guò)上面這個(gè)方式來(lái)算總?cè)藬?shù),實(shí)際上是上面介紹的對(duì)半查找法的逆操作:
當(dāng)只有一個(gè)學(xué)生站著的時(shí)候,改學(xué)生拿到的數(shù)就是總?cè)藬?shù)(計(jì)算結(jié)果);對(duì)應(yīng)到對(duì)半查找法輸入待查找的數(shù)據(jù)集(算法初始狀態(tài))
當(dāng)最后只剩下最后2名學(xué)生站著的時(shí)候,它正要把兩個(gè)學(xué)生各自持有的總?cè)藬?shù)相加,它就像是對(duì)半查找法的第一次,找到中間的位置,判斷相等的數(shù)應(yīng)該是在前半段還是在后半段里。
當(dāng)最后剩下4名學(xué)生站著的時(shí)候,他們會(huì)分成兩組來(lái)處理,每組算出各自組的總?cè)藬?shù),并每組只留一個(gè)同學(xué)站著;
而對(duì)半查找法里則是在步驟2里選擇出來(lái)的半段里,再坐對(duì)半查找。……
當(dāng)最后剩下2^n名學(xué)生站著的時(shí)候(假設(shè)此時(shí)每個(gè)學(xué)生都站著),各自記住人數(shù)為1;對(duì)應(yīng)到對(duì)半查找法里就是在n-1步驟處理完后選擇的半段數(shù)據(jù)集個(gè)數(shù)只為1,找到要查找的數(shù)據(jù)。
通過(guò)上面的對(duì)比我們不難發(fā)現(xiàn),無(wú)論是從計(jì)算方式來(lái)看,還是從數(shù)據(jù)處理/搜索空間來(lái)看,這兩個(gè)算法是互逆的。唯一的不同是對(duì)半查找法不需要再對(duì)已經(jīng)判斷舍棄的半段不用在運(yùn)行,比如3)步驟中,對(duì)邊查找繼續(xù)搜索前半段或者后半段,但是學(xué)生點(diǎn)人數(shù)確實(shí)兩組學(xué)生都要進(jìn)行報(bào)數(shù)計(jì)算。
學(xué)生點(diǎn)人數(shù)的方法看起來(lái)真的非常完美,可是這里面忽略了一個(gè)問(wèn)題,那就是計(jì)算資源的問(wèn)題,上面的每個(gè)學(xué)生都可以作為一個(gè)計(jì)算資源。而在現(xiàn)實(shí)中計(jì)算資源不會(huì)像這個(gè)例子一樣那么多。所以還需要考慮如何講這些步驟放到有限的計(jì)算資源上運(yùn)行的問(wèn)題。Map Reduce編程模型就是為了實(shí)現(xiàn)將很多復(fù)雜運(yùn)算,以上面學(xué)生算總?cè)藬?shù)的方式去執(zhí)行的一種編程模型。學(xué)生點(diǎn)人數(shù)中步驟1抽象為Map(每個(gè)學(xué)生都map成一個(gè)人數(shù)1),步驟2中的1)和2)就是Reduce操作,(將學(xué)生A和B兩個(gè)學(xué)生站著處理完變成只有一個(gè)A站著)。同時(shí)考慮到在計(jì)算資源有限的情況下如何進(jìn)行性能優(yōu)化的問(wèn)題,該編程模型還會(huì)將很多人的map操作,變?yōu)橐粋€(gè)集合的map操作,講多次Reduce操作變?yōu)橐淮渭系膔educe操作。這樣每個(gè)map或reduce就可以很方便地在一個(gè)計(jì)算資源(比如一個(gè)計(jì)算機(jī))上進(jìn)行運(yùn)算了。
大規(guī)模并行處理(MPP)技術(shù)
Mpp技術(shù)是從原來(lái)的并行數(shù)據(jù)庫(kù)發(fā)展而來(lái)的,基于關(guān)系數(shù)據(jù)庫(kù)的成熟技術(shù),伴隨著分布式與并行數(shù)據(jù)庫(kù)技術(shù)的發(fā)展而來(lái)的。其中最為關(guān)鍵的技術(shù)就是它能夠判斷出數(shù)據(jù)之間的相互依賴關(guān)系,將可以并行的部分分發(fā)到各個(gè)節(jié)點(diǎn)上并行運(yùn)行,針對(duì)關(guān)系數(shù)據(jù)庫(kù)中最為常用的等值比較和等值聯(lián)接(Join)等操作做出特別的優(yōu)化,將待比較的列按照某種規(guī)律進(jìn)行hash,根據(jù)不同的hash值分發(fā)到不同的節(jié)點(diǎn)上去進(jìn)行比較處理(它可以被看做是Hash Join的分布式版本)。將查詢中能并行的操作和操作產(chǎn)生的中間結(jié)果,通過(guò)這樣的方式分發(fā)到不同的節(jié)點(diǎn)上去運(yùn)算,從而最大程度地并行處理,來(lái)達(dá)到提高性能的方法。
回到前面講的學(xué)生點(diǎn)人數(shù)的例子,MPP的思路就是,根據(jù)現(xiàn)有的計(jì)算資源,將全班學(xué)生先按照簡(jiǎn)單規(guī)則分組排隊(duì),比如現(xiàn)有n臺(tái)計(jì)算節(jié)點(diǎn),我們就可以把全班學(xué)生分成n隊(duì),然后每隊(duì)放到一個(gè)計(jì)算節(jié)點(diǎn)上去計(jì)算,計(jì)算完講每隊(duì)的計(jì)算結(jié)果再進(jìn)行相加得到最后全班的總?cè)藬?shù)。
數(shù)據(jù)庫(kù)管理系統(tǒng)中兩種技術(shù)的優(yōu)劣分析
性能比較
可能細(xì)心的讀者已經(jīng)發(fā)現(xiàn),MPP的學(xué)生點(diǎn)人數(shù)的處理方式不就是我在前面介紹的查找指定數(shù)例子中的第二個(gè)方法嘛;而Map Reduce對(duì)應(yīng)的第三種方法看起來(lái)更高效啊。這句話在理想狀態(tài)下是成立的,不過(guò)回到數(shù)據(jù)庫(kù)管理系統(tǒng)里來(lái)看,采用這兩種方式的性能比較就得另說(shuō)了。
根據(jù)前面論述的理論處理時(shí)間比值:“假設(shè)我們有1024個(gè)數(shù),那么用這三個(gè)方法的處理時(shí)間比值為:1024:1024/n:10”,似乎很難讓我們覺(jué)得這樣的方法針對(duì)大數(shù)據(jù)處理有何優(yōu)勢(shì)。但是也正如我前面所說(shuō)的,如果考慮計(jì)算資源的個(gè)數(shù)是有限的情況下,這個(gè)理想的比值又得重新改寫了。
試想一下,采用Map Reduce方式處理的學(xué)生點(diǎn)人數(shù)例子,在有限的計(jì)算資源下的模型應(yīng)該添加一條這樣的流程:
1.每?jī)蓚€(gè)站著的學(xué)生要相加持有的人數(shù)時(shí),需要到一個(gè)專門的地方去排隊(duì)認(rèn)證(每個(gè)認(rèn)證的地方就是一個(gè)計(jì)算資源)。
在這樣的規(guī)則下,我們?cè)賮?lái)討論Map Reduce和MPP的性能對(duì)比。比如我們就只有3個(gè)計(jì)算資源,那么Map Reduce這種修改后的點(diǎn)人數(shù)流程能夠發(fā)揮的最大性能,跟MPP先分3隊(duì),再點(diǎn)人數(shù)的性能已經(jīng)沒(méi)有區(qū)別了。更何況如何協(xié)調(diào)兩個(gè)站著的學(xué)生去認(rèn)證處排隊(duì),也比MPP現(xiàn)通過(guò)簡(jiǎn)單方法分隊(duì)再處理更耗時(shí)間,這樣會(huì)導(dǎo)致每次數(shù)據(jù)庫(kù)查詢的初始化等準(zhǔn)備時(shí)間增加很多。
而且目前所有的數(shù)據(jù)庫(kù)管理系統(tǒng)一般都是部署到特定的節(jié)點(diǎn)上的,所以能利用計(jì)算資源都是一定的。所以Map Reduce在這種情況下很難發(fā)揮優(yōu)勢(shì)。更為糟糕的是,因?yàn)橐话愕臄?shù)據(jù)庫(kù)查詢,可能會(huì)涉及到很多操作及其他們之間的依賴關(guān)系(在關(guān)系數(shù)據(jù)庫(kù)中,查詢一般都會(huì)被轉(zhuǎn)化為查詢樹(shù),用來(lái)表示操作節(jié)點(diǎn)之間的先后順序),這樣很多情況是無(wú)法做到并行處理的。而MPP數(shù)據(jù)庫(kù)能夠利用傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)技術(shù),更容易根據(jù)這些依賴關(guān)系來(lái)規(guī)則執(zhí)行計(jì)劃,達(dá)到最大程度的并行處理。
其他方面的因素
由于Map Reduce模型與傳統(tǒng)的數(shù)據(jù)庫(kù)處理技術(shù)相去甚遠(yuǎn),很難將傳統(tǒng)數(shù)據(jù)庫(kù)支持的所有操作都毫無(wú)差異地用它重新實(shí)現(xiàn)一遍,所以通過(guò)它實(shí)現(xiàn)的數(shù)據(jù)庫(kù)管理系統(tǒng)在支持傳統(tǒng)的數(shù)據(jù)庫(kù)復(fù)雜查詢時(shí)就顯得力不從心了。另外在語(yǔ)言數(shù)據(jù)庫(kù)的接口,SQL標(biāo)準(zhǔn)的支持,性能調(diào)優(yōu)配置等方面也因?yàn)椴荒芾^承關(guān)系數(shù)據(jù)庫(kù)的成熟技術(shù),而導(dǎo)致學(xué)習(xí)門檻增高,易用性難于保證。
真實(shí)的TPC-DS測(cè)試比較
根據(jù)上面的分析,我們不難看出MPP數(shù)據(jù)庫(kù)的優(yōu)勢(shì),下面我們選取同樣都是底層文件系統(tǒng)采用Hadoop的HDFS分布式文件系統(tǒng)作為數(shù)據(jù)存儲(chǔ),上層采用MPP技術(shù)的HAWQ與采用Map Reduce的Hive在TPC-DS基準(zhǔn)測(cè)試中的對(duì)比結(jié)果吧(數(shù)據(jù)來(lái)自:1):
性能:簡(jiǎn)單查詢性能相當(dāng);HAWQ在處理復(fù)雜語(yǔ)句的性能是Hive的三四倍左右。
對(duì)復(fù)雜查詢的支持:Hive只支持基準(zhǔn)測(cè)試99條語(yǔ)句中的66條,而HAWQ支持全部。
總結(jié)
Map Reduce計(jì)算模型在計(jì)算資源無(wú)限、數(shù)據(jù)無(wú)相關(guān)性的情況下很容易具有良好的擴(kuò)展性,特別適用于計(jì)算網(wǎng)格等領(lǐng)域或者簡(jiǎn)單數(shù)據(jù)庫(kù)查詢的處理上。但是就目前而言,在實(shí)現(xiàn)數(shù)據(jù)庫(kù)管理系統(tǒng)領(lǐng)域,它仍然受限與資源分配、數(shù)據(jù)相關(guān)性等因素的制約,很難達(dá)到MPP發(fā)展的高度。不過(guò)技術(shù)發(fā)展日新月異,也許不出時(shí)日,它就能突破這些障礙,或者與MPP技術(shù)結(jié)合,或許有新技術(shù)助力,追平甚至超越MPP數(shù)據(jù)庫(kù)也是很有可能的。