做黃色網(wǎng)站怎么賺錢瀏覽器下載大全
Presto緩存
引入Presto緩存之前 BackgroundHiveSplitLoader 使用底層的文件系統(tǒng)直接進(jìn)行數(shù)據(jù)的讀寫;
引入Presto緩存機(jī)制之后,底層的文件系統(tǒng)被被CachingFileSystem 代理一層
CachingFileSystem 有兩個(gè)子類,根據(jù)你選用的底層緩存引擎的不同可能會(huì)是下面的兩個(gè)之一:
AlluxioCachingFileSystem /??lu??(?)n/: 在Presto Worker本地利用磁盤進(jìn)行了數(shù)據(jù)的緩存
FileMergeCachingFileSystem: 在本地緩存檢查這個(gè)數(shù)據(jù)塊是否已經(jīng)讀取過了,通過底層的文件系統(tǒng)來從遠(yuǎn)端來讀取數(shù)據(jù),讀取到數(shù)據(jù)之后再添加到本地的磁盤緩存
Presto自己實(shí)現(xiàn)FileSystem接口,添加cacheable參數(shù),確定是否緩存數(shù)據(jù)
如何保證緩存的命中率?
即,相同數(shù)據(jù)請(qǐng)求打到同一節(jié)點(diǎn)上,本地讀取緩存進(jìn)行查詢提速
節(jié)點(diǎn)分發(fā)策略:NodeSelectionStrategy:1.指定節(jié)點(diǎn)。 2.盡量指定節(jié)點(diǎn) 3.隨機(jī)指定節(jié)點(diǎn) ?
將worker節(jié)點(diǎn)進(jìn)行hash計(jì)算,優(yōu)先選擇Prefered Nodes,判斷是否繁忙TotalSplitCount,若繁忙則再選擇最空閑的節(jié)點(diǎn)。
Presto數(shù)據(jù)類型
Type接口封裝,定義了類型定長、變長屬性。
定長:
Boolean: 用?Byte
?來表示, 0-1 表示 是否
float:內(nèi)部對(duì)應(yīng)real ,底層用int表示,因?yàn)閎lock類針對(duì)的都是int
其余:Decimal、時(shí)間類型、字符串、IpAddress、Geo等
變長:
varchar(n)
Presto Slice
Slice是Presto里面用來對(duì)內(nèi)存高效地、自由地進(jìn)行操作的接口。是對(duì)sun.misc.Unsafe的包裝,更加安全易用。
Slice的結(jié)構(gòu)
?? ?Slice里面是通過三個(gè)參數(shù)來確定一個(gè)內(nèi)存地址: base , address , size
?? ?base:是通過JVM分配出來的內(nèi)存,在JVM層面是int數(shù)組、byte數(shù)組的對(duì)象,而對(duì)Slice來說這就是我們要操作的內(nèi)存塊。
?? ?address:Unsafe常量,表示byte數(shù)組里面第一個(gè)元素的地址離整個(gè)byte數(shù)組地址頭的偏移量(為什么會(huì)有這么一個(gè)偏移量?因?yàn)閿?shù)組由元數(shù)據(jù)和數(shù)據(jù)組成,默認(rèn)從16個(gè)字節(jié)以后開始存儲(chǔ)數(shù)據(jù))
?? ?size:是我們這塊內(nèi)存的大小,一般來說就是 base 底層所對(duì)應(yīng)的內(nèi)存的大小(in bytes), 或者更小一點(diǎn)
TupleDomain
TupleDomain 是用來表達(dá) table 里面各個(gè)字段的約束條件、取值范圍的。內(nèi)部維護(hù)了一個(gè)字段名到對(duì)應(yīng)的Domain的映射關(guān)系,表示一個(gè)表里面多個(gè)字段的取值約束條件。
?
Group by 分組聚合操作的邏輯計(jì)劃執(zhí)行流程
stage-0 output
stage-1 exchange aggregation project 讀取上游outputbuffer數(shù)據(jù),聚合
stage-2 tablescan filter project aggregation ?掃描數(shù)據(jù),過濾,局部聚合
生成Stage
生成邏輯執(zhí)行計(jì)劃過程中,遞歸原root樹生成
生成Task
多個(gè)Stage,誰首先生成Task?
由ExecutionPolicy決定,默認(rèn):AllAtOnceExecutionPolicy
生成幾個(gè)Task?
Stage兩種類型,數(shù)據(jù)源讀數(shù)據(jù)和非數(shù)據(jù)源讀數(shù)據(jù)
數(shù)據(jù)源讀數(shù)據(jù),根據(jù)具體的數(shù)據(jù)源類型來確定
如果從connector中拿到的spilt是必須本地訪問的,task數(shù)取決于數(shù)據(jù)分布的節(jié)點(diǎn)數(shù)。
如果從connector中拿到的spilt是遠(yuǎn)程訪問的,取決于limit和presto node個(gè)數(shù)的較小值。
非數(shù)據(jù)源讀數(shù)據(jù)
單節(jié)點(diǎn)或hash_partition_count決定
Task狀態(tài)
內(nèi)部接口每100毫秒調(diào)用一次TaskInfoFetcher
Count(distinct) 優(yōu)化
select A, count(distinct B) from T group by A.
轉(zhuǎn)換成
select A, count(B) from (select A, B from T group by A, B) group by A.