在前1篇文章中,介紹到了Galaxy的增量計(jì)算性質(zhì),其state是框架內(nèi)部管理的,和與Storm的簡(jiǎn)單對(duì)照。這篇文章將講述更多Galaxy增量模型的事情,并介紹這套增量模型之上實(shí)現(xiàn)的Galaxy SQL和Galaxy Operator,同時(shí)會(huì)從增量角度對(duì)照Spark Streaming。
MRM模型全稱為MapReduceMerge,比MapReduce做了1個(gè)Merge操作。merge階段可與state交互,讀寫(xiě)某個(gè)key的oldValue,并且這個(gè)merge接口還具有rollback語(yǔ)義。在流計(jì)算場(chǎng)景下,數(shù)據(jù)按時(shí)間或條數(shù)切成不同的批,批內(nèi)可以做普遍意義下的MapReduce操作,批之間需要merge階段做跨批聚合的計(jì)算。大家可以對(duì)照Spark Streaming的UpdateStateByKey操作,在1個(gè)DStream內(nèi),各個(gè)時(shí)間段內(nèi)的RDD(即各批)可以通過(guò)這個(gè)接口更新1次任務(wù)內(nèi)的state。而galaxy的merge本質(zhì)上是1次add的進(jìn)程,對(duì)應(yīng)的rollback是1次delete的進(jìn)程,從數(shù)據(jù)庫(kù)的語(yǔ)義看,兩個(gè)進(jìn)程合起來(lái)相當(dāng)因而update操作,而這倆進(jìn)程都是根據(jù)1個(gè)primary key來(lái)做的,所以這件事情與spark streaming的updateStateByKey做的事情是1樣的,但是細(xì)看的話,二者還是存在很大的差異。
galaxy的state暴露給計(jì)算task是線程級(jí)別獨(dú)享的,spark streaming的state是任務(wù)內(nèi)全局同享的。線程級(jí)別獨(dú)享的優(yōu)點(diǎn),就在于同1批數(shù)據(jù),按key shuffle以后來(lái)到不同的merge計(jì)算節(jié)點(diǎn),各自不會(huì)阻塞各自的計(jì)算進(jìn)程,而spark streaming的updateStateByKey操作會(huì)阻塞其他rdd的計(jì)算,雖然spark streaming能做到DStream內(nèi)各個(gè)RDD并發(fā)履行,但是只要有state操作,終究還是落到了時(shí)間序列上的阻塞。本時(shí)間點(diǎn)StateRDD的計(jì)算需要依賴前1時(shí)間點(diǎn)父StateRDD的計(jì)算結(jié)果,而批內(nèi)各個(gè)key對(duì)state操作是相互阻塞和影響的,所以著眼在這層barrier上的話,galaxy的merge進(jìn)程更加精細(xì),add和delete進(jìn)程是分開(kāi)的,批內(nèi)的key是落到不同線程上計(jì)算而state是線程內(nèi)獨(dú)享的。
Galaxy有3種Model,分別是MapOnlyModel,MapReduceModel,MapReduceMergeModel。即,你可使用M Model和MR Model做普通的流計(jì)算或小批計(jì)算,當(dāng)需要跨批操作的時(shí)候就使用MRM Model。Model之間是隨便組合串連的,接口相比MapReduce實(shí)際上是相當(dāng)靈活乃至過(guò)于靈活的,靈活的弊端是計(jì)算模型上帶來(lái)復(fù)雜性。
Galaxy SQL是1種StreamSQL,而且是目前業(yè)界沒(méi)有的。從語(yǔ)法上Galaxy SQL貼近HiveSQL,但又有些流計(jì)算語(yǔ)義上(無(wú)窮數(shù)據(jù)流)不能支持的語(yǔ)法,比如limit, order by。
Intel那邊弄了1個(gè)Spark Streaming + Spark SQL的結(jié)合,叫StreamSQL。利用Spark SQL里的SchemaRDD,為Spark Streaming流進(jìn)來(lái)的RDD帶上了Schema元信息。借助Spark Streaming支持的操作,這類StreamSQL可以做滑窗效果的sql計(jì)算。但是真正跨批的增量語(yǔ)義(不單單是固定的window跨批計(jì)算),是支持不了的。Galaxy SQL可以做真實(shí)的增量流式SQL。
舉個(gè)最簡(jiǎn)單的例子,
第1句sql中,根據(jù)t1的a字段分組,求了個(gè)count值。第2句sql中,t2表分組的字段變成t1表里count出來(lái)的cnt值。大家可以想象,在流計(jì)算場(chǎng)景里,第1次a求count出來(lái)的值多是100,下1個(gè)時(shí)間點(diǎn),同1個(gè)a的key,count出來(lái)的值就是200了,這時(shí)候候,100這個(gè)cnt已丟到t2表里計(jì)算出結(jié)果了,現(xiàn)在100已更新到200了,200這個(gè)新的值的計(jì)算是簡(jiǎn)單的,但問(wèn)題是如何把t2里之前100的計(jì)算結(jié)果撤消呢?
可以仔細(xì)想一想,StreamSQL是做不了這樣的sql的,本質(zhì)上是由于spark streaming不支持這樣的操作。Galaxy計(jì)算框架的merge階段可以做rollback操作,回滾之前"毛病"的狀態(tài),使得Galaxy SQL可以做散布式流式SQL。
Galaxy Operator是Galaxy MRM編程接口之上的1層DAG封裝,兼具易用性和表達(dá)能力。
算子層終究將映照成多個(gè)Galaxy的MRM Model,使用戶可以更加關(guān)注計(jì)算邏輯,屏蔽較復(fù)雜的MRM Model,特別是merge階段。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)