您好,登錄后才能下訂單哦!
這篇文章給大家介紹PB級(jí)數(shù)據(jù)分析工具Prestodb怎么用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
prestodb,是facebook開源的一款sql on hadoop系統(tǒng),是facebook的工程師對(duì)hive的查詢速度忍無可忍后,下決心開發(fā)的一款高性能查詢引擎,基于java8編寫,其基于page的pipeline技術(shù),使其具有高效的交互式查詢性能,并可以高效的控制GC;而其和底層數(shù)據(jù)源解耦的特性,使其能夠?qū)痈黝悢?shù)據(jù)源,并具有跨源查詢的特性。目前在國(guó)內(nèi),有京東、美團(tuán)、同城以及滴滴等公司對(duì)prestodb有深度使用,在國(guó)外,除facebook外,還有uber等公司對(duì)prestodb有深度使用,而teradata公司則在維護(hù)獨(dú)立的分支,并將其作為自己的主打的即系查詢產(chǎn)品的后臺(tái)。本文介紹prestodb,先主要介紹presto的架構(gòu)和查詢?cè)恚琾resto的搭建比較簡(jiǎn)單,大家可以參考官網(wǎng)的文章進(jìn)行操作。
如上圖所示,prestodb主要由一個(gè)coordinator和多個(gè)worker組成,coordinaor節(jié)點(diǎn)負(fù)責(zé)和client對(duì)接,接收client發(fā)送過來的各類請(qǐng)求(DDL和DML)。coordinator在接收到client的請(qǐng)求后,就開始進(jìn)行請(qǐng)求的處理,最后把查理結(jié)果返回給client。coordinator在進(jìn)行請(qǐng)求處理時(shí),對(duì)各類sql語句進(jìn)行詞法解析、語法分析、語義分析、優(yōu)化、生成執(zhí)行計(jì)劃最后在調(diào)度模塊進(jìn)行任務(wù)的分發(fā),把子任務(wù)分發(fā)到各個(gè)worker節(jié)點(diǎn)。worker節(jié)點(diǎn)是實(shí)際的執(zhí)行節(jié)點(diǎn),會(huì)執(zhí)行包括聚合、排序、join以及去重等操作。整體執(zhí)行流程如下圖所示:
其中大多數(shù)流程會(huì)在后邊會(huì)進(jìn)行詳細(xì)的介紹。
這篇文章的主要目的是入門和普及分布式sql的執(zhí)行原理,看過一些其他的相關(guān)文章,都是從上到下的介紹,個(gè)人感覺這樣不利于入門,很多人看到執(zhí)行計(jì)劃那里就“知難而退”了。所以我在介紹presto時(shí),準(zhǔn)備采用從下到上的方式來介紹。
分布式sql說白了也是sql,既然是sql,典型的幾個(gè)查詢語句就是groupby、orderby、join等。本文以groupby為例來進(jìn)行介紹,orderby和join等的執(zhí)行流程也會(huì)在后續(xù)文章中進(jìn)行介紹。
物理執(zhí)行計(jì)劃是最接近我們理解的一個(gè)步驟了,所以這里先來看看presot中得物理執(zhí)行計(jì)劃。假設(shè)我們有一張訂單表,這個(gè)訂單表的數(shù)據(jù)分布在兩個(gè)節(jié)點(diǎn)上,node1上的數(shù)據(jù)分片是:
node2上得數(shù)據(jù)分片是:
假設(shè)我們有這樣一個(gè)分組聚合查詢查詢:
SELECT sum(totalprice),orderpriorityFROM orderswhere custkey<100GROUP BY orderpriority
這個(gè)查詢中有過濾(custkey<100),有分組(group by orderpriority),有聚合(sum),是一個(gè)非常典型的數(shù)據(jù)庫(kù)查詢語句。我們先不看presto怎么實(shí)現(xiàn)這樣的查詢,我們可以先自己想想如果我們自己去完成這樣的操作我們要怎么做?首先,我們肯定會(huì)先從數(shù)據(jù)源讀取數(shù)據(jù),但是讀到數(shù)據(jù)并非符合我們的需要,這時(shí)我們就需要對(duì)數(shù)據(jù)按照一定的條件進(jìn)行過濾,過濾完之后的數(shù)據(jù)就是我們感興趣的數(shù)據(jù);那么過濾完之后留下的數(shù)據(jù)我們是先聚合還是先分組呢?肯定是先分組了,如果沒有分組,聚合也就無從談起了,因?yàn)榫酆暇褪轻槍?duì)一個(gè)組內(nèi)的數(shù)據(jù)進(jìn)行的聚合,如果是不同組就沒有聚合的必要了。分組的方法很多,可以使用hash的方式完成分組,也可以使用sort的方式完成分組,或者更高級(jí)的,如果有倒排索引,組已經(jīng)就是分好的了,省了很多事情。presto采用hash的方式完成分組。等分組完成后,就可以在一個(gè)組內(nèi)進(jìn)行聚合操作了,比如進(jìn)行計(jì)數(shù)統(tǒng)計(jì)、求和或者求平均等。
好了,那么我們看看presot的執(zhí)行流程(物理執(zhí)行計(jì)劃)是否符合我們的預(yù)期:
上圖所示有三個(gè)大的方框,每個(gè)方框表示一個(gè)presto執(zhí)行過程中的一個(gè)stage(類似spark中的stage,以shuffle操作作為stage的邊界),先看標(biāo)號(hào)為3的方框,在這個(gè)方框內(nèi)有三個(gè)operator,最下邊的是ScanFilterAndProjectOperotor,從名字就可以看出,這個(gè)物理操作符的主要任務(wù)是掃描、過濾和投影,掃描和過濾后的數(shù)據(jù)如下:
可以看出,custkey大于100的行已經(jīng)被過濾掉了。這里的投影(project)的意思是把上層operator需要的字段值篩選出來,以上圖的sql為例,要帥選的字段包括orderpriority和totalprice,因?yàn)檫@兩個(gè)字段才是后續(xù)的分組和聚合需要的字段,而字段custkey只是起了一個(gè)過濾數(shù)據(jù)的作用,所以在project是不會(huì)被向上層傳遞。所以上層operator接收到的數(shù)據(jù)如下:
等數(shù)據(jù)被發(fā)送到上一級(jí)的operator后,就要開始進(jìn)行分組了,這里用到的操作符是HashAggregationOperator,從名字可以看出,這里使用了hash的方式對(duì)數(shù)據(jù)進(jìn)行了分組,即把具有相同hash值的數(shù)據(jù)作為一個(gè)組,同時(shí)在分組完成后進(jìn)行了聚合操作(Aggregation),注意這里的HashAggregationOperator后跟了一個(gè)(partial)關(guān)鍵字,表示這一步的分組和聚合只是完成一個(gè)局部的分組聚合,這是因?yàn)閿?shù)據(jù)在分布式環(huán)境下,一個(gè)group的數(shù)據(jù)可能是存在多個(gè)partition下,甚至是跨不同物理機(jī)的,所以需要首先完成局部聚合,降低后續(xù)要進(jìn)行shuffle的數(shù)據(jù)量。這就類似spark中的reduceByKey算子,可以對(duì)數(shù)據(jù)進(jìn)行map side combine,從而減少shuffle時(shí)數(shù)據(jù)的傳輸量,而如果使用groupByKey,沒有進(jìn)行map side combine,就會(huì)產(chǎn)生大量的數(shù)據(jù)需要通過網(wǎng)絡(luò)傳輸。經(jīng)過這個(gè)局部聚合后的數(shù)據(jù)如下圖所示:
其中在node1,有三個(gè)分組,分別是high,mid,low,在node2右兩個(gè)分組,分別是high和low。
在往上看,操作符是PartitionedOutputOperator,可以看出這是一個(gè)分區(qū)操作,主要是把上一步聚合分組和聚合的結(jié)果根據(jù)分組的key(即組名,例如high,low等)進(jìn)行分區(qū),寫到不同的分區(qū)文件中(類似spark的shuffle操作中shuffle write)。至此,方框3(stage 3)中的操作完成。
接下來到了stage2 ,在這個(gè)stage中,首先要進(jìn)行的上一個(gè)stage最后階段輸出數(shù)據(jù)的拉取(類似spark中得shuffle read),在presto中對(duì)應(yīng)的操作符是ExchangeOperator,拉取了數(shù)據(jù)之后,展現(xiàn)給上一層操作符的數(shù)據(jù)如下:
可以看出,不同節(jié)點(diǎn)相同分組key的數(shù)據(jù)已經(jīng)被聚合分組在一起了,這時(shí)只需要再進(jìn)行一次聚合操作即可最終的分組聚合操作。在進(jìn)行分組聚合查詢時(shí),經(jīng)常會(huì)使用到hiving這樣的操作,而再上一層的FilterAndProject操作就是進(jìn)行分組聚合結(jié)果的過濾和投影,最后把這樣的處理結(jié)果交給最后一個(gè)stage,即stage1,進(jìn)行結(jié)果的輸出。
至此,一個(gè)典型的group by查詢的分布式物理執(zhí)行計(jì)劃就按照一定的邏輯執(zhí)行完成了。從以上這個(gè)物理執(zhí)行流程,我們可以看出presto在進(jìn)行分布式數(shù)據(jù)處理時(shí)和sparksql有諸多類似的地方,其實(shí)不止是和sparksql類似,所有的分布式sql都是遵循這樣那個(gè)的基本原理。
關(guān)于PB級(jí)數(shù)據(jù)分析工具Prestodb怎么用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。