数据流计算模型及其在大数据处理中的应用
點(diǎn)擊上方藍(lán)字關(guān)注我們
數(shù)據(jù)流計(jì)算模型及其在大數(shù)據(jù)處理中的應(yīng)用
畢倪飛,?丁光耀,?陳啟航,?徐辰,?周傲英
華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院,上海 200062
論文引用格式:
畢倪飛,?丁光耀,?陳啟航,?徐辰,?周傲英.數(shù)據(jù)流計(jì)算模型及其在大數(shù)據(jù)處理中的應(yīng)用.?大數(shù)據(jù)[J], 2020, 6(3):73-86
BI N F, DING G Y, CHEN Q H, XU C, ZHOU A?Y.Dataflow model and its applications in big data processing.?Big Data Research[J], 2020, 6(3): 73-86
1 引言
計(jì)算機(jī)體系結(jié)構(gòu)的計(jì)算模型可以分為控制流和數(shù)據(jù)流兩大類。控制流計(jì)算機(jī)也被稱為馮·諾伊曼型計(jì)算機(jī),它是主流計(jì)算機(jī)一直采用的體系結(jié)構(gòu)。控制流計(jì)算模型按指令的順序來驅(qū)動(dòng)操作,數(shù)據(jù)是否參加運(yùn)算取決于當(dāng)時(shí)所執(zhí)行的指令是否需要。數(shù)據(jù)流計(jì)算模型采用數(shù)據(jù)驅(qū)動(dòng)方式,只有當(dāng)一條或一組指令所需的操作數(shù)全部準(zhǔn)備好時(shí),才能激發(fā)相應(yīng)指令的執(zhí)行,執(zhí)行結(jié)果又流向等待這一數(shù)據(jù)的下一條或一組指令,以驅(qū)動(dòng)該條或該組指令的執(zhí)行。大數(shù)據(jù)處理中也存在數(shù)據(jù)流計(jì)算模型的概念,但是大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型用于完成復(fù)雜的數(shù)據(jù)處理工作,與計(jì)算機(jī)體系結(jié)構(gòu)中的數(shù)據(jù)流計(jì)算模型位于不同層面,并非同一個(gè)概念。此外,Murray和McSherry等人提出增量數(shù)據(jù)流計(jì)算模型,主要用于解決迭代算法中增量計(jì)算的問題,TensorFlow的數(shù)據(jù)流模型主要用于抽象描述機(jī)器學(xué)習(xí)算法中的狀態(tài)和計(jì)算,Bonna和Loubach等人提出的場(chǎng)景感知數(shù)據(jù)流模型主要對(duì)動(dòng)態(tài)應(yīng)用程序進(jìn)行建模和仿真,而本文大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型用于低時(shí)延、正確地處理大規(guī)模、無界、亂序的數(shù)據(jù),因此這些數(shù)據(jù)流計(jì)算模型與本文大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型不是同一個(gè)概念。
現(xiàn)有的大數(shù)據(jù)處理系統(tǒng)按照?qǐng)?zhí)行引擎可以分為兩大類。一類是基于批處理引擎的大數(shù)據(jù)處理系統(tǒng),如MapReduce 、Spar k、Spark Streaming、Structured Streami ng和Dr yad等;另一類是基于流計(jì)算引擎的大數(shù)據(jù)處理系統(tǒng),如S torm、Mill wheel、Samza和Flink等。在執(zhí)行引擎層面 ,大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型體現(xiàn)為數(shù)據(jù)流圖。大數(shù)據(jù)處理系統(tǒng)通常使用數(shù)據(jù)流圖來直觀地表達(dá)復(fù)雜的數(shù)據(jù)處理邏輯,用戶編寫的數(shù)據(jù)處理流程在系統(tǒng)中先被轉(zhuǎn)換為邏輯數(shù)據(jù)流圖,該圖是由一組頂點(diǎn)和邊構(gòu)成的有向無環(huán)圖,該有向無環(huán)圖在被交給底層執(zhí)行引擎之前,根據(jù)特定的并發(fā)度又被進(jìn)一步轉(zhuǎn)換為物理數(shù)據(jù)流圖。在統(tǒng)一編程層面,大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型體現(xiàn)為 數(shù)據(jù)流編程模型。數(shù)據(jù)流編程模型將批處理和流計(jì)算引擎的編程方式進(jìn)行抽象統(tǒng)一,引入了事件時(shí)間、窗口和水位線等重要概念,旨在滿足數(shù)據(jù)消費(fèi)者對(duì)窗口、時(shí)間語(yǔ)義以及處理時(shí)延等的需求。
本文結(jié)合Spark批處理引擎和Flink流計(jì)算引擎等多個(gè)執(zhí)行引擎,對(duì)比分析了數(shù)據(jù)流圖和數(shù)據(jù)流編程模型在兩者中的具體實(shí)現(xiàn)。
2 數(shù)據(jù)流圖
本節(jié)首先介紹大數(shù)據(jù)處理中的邏輯數(shù)據(jù)流圖,其次介紹物理數(shù)據(jù)流圖,最后結(jié)合Spark批處理引擎和Flink流計(jì)算引擎分析物理數(shù)據(jù)流圖在兩者中的具體體現(xiàn)。
2.1 邏輯數(shù)據(jù)流圖
大數(shù)據(jù)處理系統(tǒng)通常使用邏輯數(shù)據(jù)流圖來抽象描述整個(gè)數(shù)據(jù)處理的邏輯流程,邏輯數(shù)據(jù)流圖是一個(gè)由一組頂點(diǎn)和邊構(gòu)成的有向無環(huán)圖。有向無環(huán)圖中的每個(gè)頂點(diǎn)代表了整個(gè)數(shù)據(jù)處理流程中一個(gè)特定的數(shù)據(jù)處理步驟,封裝了用戶定義的數(shù)據(jù)轉(zhuǎn)換操作,如選擇、過濾、聚合、連接等,對(duì)接收到的輸入數(shù)據(jù)執(zhí)行轉(zhuǎn)換操作后產(chǎn)生輸出數(shù)據(jù)。頂點(diǎn)和頂點(diǎn)之間通過有向邊連接,每條有向邊代表了數(shù)據(jù)的流動(dòng)和數(shù)據(jù)的依賴。與有向邊起點(diǎn)相連的頂點(diǎn)表示數(shù)據(jù)的生產(chǎn)者,與有向邊終點(diǎn)相連的頂點(diǎn)表示數(shù)據(jù)的消費(fèi)者,數(shù)據(jù)由生產(chǎn)者流向消費(fèi)者,消費(fèi)者對(duì)數(shù)據(jù)的處理依賴于生產(chǎn)者的處理結(jié)果。如圖1所示,該邏輯數(shù)據(jù)流圖由5個(gè)表示計(jì)算邏輯的頂點(diǎn)和4條表示數(shù)據(jù)流動(dòng)和數(shù)據(jù)依賴的有向邊組成,表達(dá)了數(shù)據(jù)從讀取頂點(diǎn)被讀取后,依次流經(jīng)映射、按鍵值分組和過濾3個(gè)頂點(diǎn),并在這3個(gè)頂點(diǎn)中進(jìn)行轉(zhuǎn)換處理,最終通過保存頂點(diǎn)將處理結(jié)果存儲(chǔ)下來的整個(gè)數(shù)據(jù)處理流程。
2.2 物理數(shù)據(jù)流圖
大數(shù)據(jù)處理系統(tǒng)通常采用并行化的策略進(jìn)行數(shù)據(jù)處理,將數(shù)據(jù)按照特定的分區(qū)策略進(jìn)行分區(qū),并為每個(gè)數(shù)據(jù)處理頂點(diǎn)設(shè)定并行度,讓不同的數(shù)據(jù)分區(qū)流入各自相應(yīng)的數(shù)據(jù)處理頂點(diǎn)實(shí)例,以達(dá)到并行處理的目的。但是邏輯數(shù)據(jù)流圖中的頂點(diǎn)和邊僅僅是對(duì)處理過程的邏輯抽象,即每個(gè)頂點(diǎn)是一個(gè)邏輯的處理步驟,不包含系統(tǒng)實(shí)際處理數(shù)據(jù)時(shí)并行化的概念,每條邊也只描述了邏輯頂點(diǎn)之間的數(shù)據(jù)流動(dòng)。因此,邏輯數(shù)據(jù)流圖不能被直接應(yīng)用到底層執(zhí)行引擎,而需要先在邏輯數(shù)據(jù)流圖中引入并行度,將其轉(zhuǎn)換為物理數(shù)據(jù)流圖后才能交給底層執(zhí)行引擎。圖2展示了圖1中描述的邏輯數(shù)據(jù)流圖根據(jù)特定的并行度轉(zhuǎn)換后得到的物理數(shù)據(jù)流圖,該物理數(shù)據(jù)流圖中讀取和映射2個(gè)數(shù)據(jù)處理頂點(diǎn)的并行度為3,按鍵值分組、過濾和保存3個(gè)數(shù)據(jù)處理頂點(diǎn)的并行度為2。由于批處理引擎和流計(jì)算引擎2種執(zhí)行引擎的數(shù)據(jù)交換機(jī)制不同,物理數(shù)據(jù)流圖在這2種執(zhí)行引擎中的具體體現(xiàn)也有所不同。
圖1???邏輯數(shù)據(jù)流圖
圖2???物理數(shù)據(jù)流圖
2.2.1 批處理引擎中的物理數(shù)據(jù)流圖
在批處理引擎中,一個(gè)物理數(shù)據(jù)流圖通常被劃分為多個(gè)階段,階段之間根據(jù)依賴關(guān)系按序執(zhí)行,一個(gè)階段只有等其依賴的所有階段都執(zhí)行結(jié)束后才能開始執(zhí)行。每個(gè)階段由與分區(qū)數(shù)相同個(gè)數(shù)的任務(wù)組成,一個(gè)任務(wù)負(fù)責(zé)一個(gè)分區(qū),各個(gè)任務(wù)之間相互獨(dú)立執(zhí)行,不會(huì)發(fā)生數(shù)據(jù)交換。當(dāng)某個(gè)任務(wù)中的一條數(shù)據(jù)被處理完成后,并不會(huì)立刻通過網(wǎng)絡(luò)將其傳輸?shù)较乱粋€(gè)階段的任務(wù)中,而是先將其放在緩存中,當(dāng)緩存達(dá)到一定的閾值時(shí),再將緩存中的數(shù)據(jù)溢寫到本地磁盤上。只有當(dāng)一個(gè)階段中所有的任務(wù)都完成數(shù)據(jù)處理,并將處理結(jié)果寫入磁盤后,才開始將這個(gè)階段處理后的中間結(jié)果通過網(wǎng)絡(luò)傳輸?shù)较乱粋€(gè)階段進(jìn)行后續(xù)處理。
例如,在基于批處理引擎的Spark系統(tǒng)中,將每個(gè)邏輯數(shù)據(jù)流圖根據(jù)給定的并行度轉(zhuǎn)換為物理數(shù)據(jù)流圖后,系統(tǒng)會(huì)根據(jù)數(shù)據(jù)交換將該物理數(shù)據(jù)流圖劃分為多個(gè)階段按序執(zhí)行。如圖3所示,因?yàn)樵诎存I值分組頂點(diǎn)處發(fā)生數(shù)據(jù)交換,所以整個(gè)物理數(shù)據(jù)流圖在此處被切分,形成階段0和階段1這2個(gè)階段。其中,階段1中的數(shù)據(jù)處理依賴于階段0處理后的中間結(jié)果,即2個(gè)階段的執(zhí)行存在先后順序,階段1只有在階段0的處理全部完成后才能開始執(zhí)行。在階段0中,系統(tǒng)啟動(dòng)3個(gè)線程分別處理相互獨(dú)立的3個(gè)分區(qū)中的數(shù)據(jù),并將得到的中間結(jié)果存儲(chǔ)在3個(gè)線程各自的本地磁盤上。等到階段0中的3個(gè)線程都完成處理后,系統(tǒng)開始進(jìn)行階段1的處理,階段1中啟動(dòng)2個(gè)線程分別負(fù)責(zé)2個(gè)分區(qū)的數(shù)據(jù),每個(gè)線程通過網(wǎng)絡(luò)從階段0的中間結(jié)果處獲取屬于自己的數(shù)據(jù)進(jìn)行后續(xù)處理。
2.2.2 流計(jì)算引擎中的物理數(shù)據(jù)流圖
在流計(jì)算引擎中,物理數(shù)據(jù)流圖不會(huì)被劃分為多個(gè)階段,數(shù)據(jù)流圖中的所有處理任務(wù)同時(shí)啟動(dòng)并且長(zhǎng)時(shí)間運(yùn)行,直到整個(gè)作業(yè)完成或終止。任務(wù)之間的數(shù)據(jù)交換不需要阻塞式地將中間結(jié)果數(shù)據(jù)先寫入磁盤再發(fā)送給下游任務(wù),而是采用流水線的方式,即在處理完一條數(shù)據(jù)后立即將其發(fā)送給下游任務(wù)。這種方式有效地降低了數(shù)據(jù)處理的時(shí)延,但會(huì)導(dǎo)致過多的網(wǎng)絡(luò)輸入/輸出(input/output,I/O)次數(shù),從而造成系統(tǒng)吞吐量的下降。為了減少發(fā)送數(shù)據(jù)的網(wǎng)絡(luò)I/O次數(shù)對(duì)吞吐量性能的影響,流計(jì)算引擎通常會(huì)設(shè)置內(nèi)存緩沖區(qū)收集結(jié)果數(shù)據(jù),當(dāng)緩沖區(qū)內(nèi)的數(shù)據(jù)量積累到一定大小(例如32 KB)后再一并發(fā)送給下游任務(wù)。
圖3???批處理引擎中的物理數(shù)據(jù)流圖
在基于流計(jì)算引擎的Flink系統(tǒng)中,物理數(shù)據(jù)流圖中的每個(gè)任務(wù)在處理一條數(shù)據(jù)后將結(jié)果放入內(nèi)存緩沖區(qū)中,緩沖區(qū)不斷接收任務(wù)產(chǎn)生的結(jié)果數(shù)據(jù),當(dāng)緩沖區(qū)數(shù)據(jù)大小達(dá)到閾值(默認(rèn)32 KB)或緩沖區(qū)保存數(shù)據(jù)的時(shí)間超過設(shè)定的閾值(默認(rèn)100 ms)時(shí),系統(tǒng)就將緩沖區(qū)內(nèi)的數(shù)據(jù)通過網(wǎng)絡(luò)傳輸給下游任務(wù)。Flink通過設(shè)置內(nèi)存緩沖區(qū)一次發(fā)送小批數(shù)據(jù)來避免過多的網(wǎng)絡(luò)I/O次數(shù),以犧牲部分時(shí)延性能為代價(jià)提升了系統(tǒng)的吞吐量,用戶可以根據(jù)應(yīng)用需求設(shè)置超時(shí)閾值,以在系統(tǒng)的吞吐量和時(shí)延之間進(jìn)行權(quán)衡。如圖4所示,每個(gè)物理任務(wù)都維護(hù)一個(gè)本地緩沖池,緩沖池中含有多個(gè)用于網(wǎng)絡(luò)傳輸?shù)木彌_區(qū)。最右側(cè)已經(jīng)填滿數(shù)據(jù)的緩沖區(qū)將被發(fā)送到下游算子,中間還未填滿數(shù)據(jù)的緩沖區(qū)直到填滿數(shù)據(jù)或觸發(fā)超時(shí)機(jī)制后才會(huì)被發(fā)送到下游任務(wù),最左側(cè)還未填充任何數(shù)據(jù)的緩沖區(qū)只有在先驅(qū)緩沖區(qū)被填滿或者觸發(fā)超時(shí)機(jī)制后才開始接收本地任務(wù)的輸出數(shù)據(jù)。
圖4???流計(jì)算引擎中的物理數(shù)據(jù)流圖
3 數(shù)據(jù)流編程模型
本節(jié)介紹Google公司提出的數(shù)據(jù)流編程模型,首先闡明有界數(shù)據(jù)和無界數(shù)據(jù)的概念,其次介紹數(shù)據(jù) 流編程模型中的時(shí)間語(yǔ)義和水位線2個(gè)重要概念,在此基礎(chǔ)上依次在原語(yǔ)算子中介紹計(jì)算結(jié)果的方式,在窗口操作中介紹數(shù)據(jù)按事件時(shí)間被分到哪個(gè)窗口中計(jì)算結(jié)果,在觸發(fā)器中介紹被分配到窗口內(nèi)的數(shù)據(jù)按處理時(shí)間何時(shí)被處理,并展示給用戶,在修正策略中介紹同一窗口的多個(gè)結(jié)果之間如何相互關(guān)聯(lián)。
3.1 有界數(shù)據(jù)和無界數(shù)據(jù)
當(dāng)談到有限/無限數(shù)據(jù)時(shí),有些地方可能會(huì)將其描述為批/流數(shù)據(jù)。但是批/流數(shù)據(jù)容易讓人產(chǎn)生誤解,即批處理系統(tǒng)用于處理批數(shù)據(jù),流計(jì)算系統(tǒng)用于處理流數(shù)據(jù)。而事實(shí)上,批處理系統(tǒng)也可以用于處理流數(shù)據(jù),如Structured Streaming常被用于處理流數(shù)據(jù),而其底層是Spark批處理系統(tǒng)。類似地,也可以用流計(jì)算系統(tǒng)Flink來處理批數(shù)據(jù)。因此,使用批/流數(shù)據(jù)概念容易造成誤解,故本文統(tǒng)一使用有界/無界數(shù)據(jù)來表示有限/無限數(shù)據(jù),將批和流用于描述批處理引擎和流計(jì)算引擎。
3.2 時(shí)間語(yǔ)義和水位線
考慮到系統(tǒng)處理記錄的順序和它們的原始順序可能存在不一致性,在處理數(shù)據(jù)時(shí),需要考慮2個(gè)時(shí)間域。
● 事件時(shí)間:事件實(shí)際發(fā)生的時(shí)間,即當(dāng)該事件發(fā)生時(shí),其所在系統(tǒng)的當(dāng)前時(shí)間。
● 處理時(shí)間:系統(tǒng)執(zhí)行數(shù)據(jù)處理的過程中,一個(gè)事件被數(shù)據(jù)處理系統(tǒng)觀察到的時(shí)間。也就是,該事件被系統(tǒng)處理時(shí),其所在系統(tǒng)的當(dāng)前時(shí)間。
比如在傳感器采集事件時(shí),對(duì)應(yīng)的系統(tǒng)時(shí)間就是事件時(shí)間,然后將事件發(fā)送到相應(yīng)的數(shù)據(jù)處理系統(tǒng)進(jìn)行處理時(shí)對(duì)應(yīng)的系統(tǒng)時(shí)間就是處理時(shí)間。一個(gè)事件的事件時(shí)間是永遠(yuǎn)不變的,但是一個(gè)事件的處理時(shí)間會(huì)隨著它在數(shù)據(jù)管道中一步步被處理而持續(xù)變化。很多時(shí)候需要根據(jù)事件時(shí)間進(jìn)行數(shù)據(jù)分析,而不是處理時(shí)間。例如,收到傳感器采集到的數(shù)據(jù)后,希望統(tǒng)計(jì)某一時(shí)間段內(nèi)所監(jiān)控事物的變化情況,那么依據(jù)事件時(shí)間統(tǒng)計(jì)更為合理(而不是處理時(shí)間)。
3.3 原語(yǔ)算子
從有界數(shù)據(jù)集的角度來看,數(shù)據(jù)流編程模型把所有的數(shù)據(jù)抽象為鍵值對(duì),基于鍵值對(duì)有2個(gè)核心的原語(yǔ)算子。
● ParDo:對(duì)數(shù)據(jù)進(jìn)行并行化處理,相當(dāng)于MapReduce中的map原語(yǔ),將輸入的鍵值對(duì)進(jìn)行一次變換,產(chǎn)生若干個(gè)新的鍵值對(duì)。
● GroupByKey:按鍵值把元素重新分組,與MapReduce中的Shuffle類似,將含有相同鍵值的元素分到同一組。
這2個(gè)核心原語(yǔ)算子可以組合成聚合、去重和連接等 復(fù)合算子,例如,圖6右側(cè)的Sum ByKey算子是由圖6左側(cè)的GroupByKey和ParDo組合而成的一個(gè)復(fù)合算子,該復(fù)合算子是一個(gè)聚合算子,統(tǒng)計(jì)每個(gè)字母出現(xiàn)次數(shù)的總和。其中, GroupByKey操作將含有相同字母的元素分配到同一組,形成新的鍵值對(duì);ParDo在新的鍵值對(duì)上進(jìn)行求和運(yùn)算,得到最終的聚合結(jié)果。
圖5???水位線
圖6???由原語(yǔ)算子組合成的復(fù)合算子
3.4 窗口操作
當(dāng)處理無界數(shù)據(jù)時(shí),由于ParDo原語(yǔ)只涉及處理單個(gè)數(shù)據(jù),ParDo可以自然地以一次處理一條已到達(dá)數(shù)據(jù)的方式來處理無界數(shù)據(jù)。與ParDo原語(yǔ)不同, GroupByKey原語(yǔ)涉及同時(shí)處理一個(gè)給定Key上的所有數(shù)據(jù),而由于數(shù)據(jù)是無界的,系統(tǒng)永遠(yuǎn)無法等到給定Key上的所有數(shù)據(jù)都到達(dá)的那一刻,所以GroupByKey無法直接用于處理無界數(shù)據(jù)。為了支持無界數(shù)據(jù)上的GroupByKey操作,需要結(jié)合窗口操作將GroupByKey重新定義為GroupByKeyAndWindow。窗口操作的核心是通過引入窗口將無界的數(shù)據(jù)集切分為有界的數(shù)據(jù)塊,在每個(gè)窗口中的有界數(shù)據(jù)塊上進(jìn)一步實(shí)現(xiàn)按Key進(jìn)行聚合。
窗口可以分為基于時(shí)間的窗口和基于元組的窗口,但兩者本質(zhì)上都是基于時(shí)間的窗口,這是由于基于元組的窗口本質(zhì)上可以看作基于邏輯時(shí)間域的窗口,每個(gè)窗口中的元素帶有遞增的邏輯時(shí)間戳。基于時(shí)間的窗口又可以進(jìn)一步分為對(duì)齊窗口和非對(duì)齊窗口,對(duì)齊窗口用于落在窗口時(shí)間范圍內(nèi)的所有數(shù)據(jù),非對(duì)齊窗口用于落在窗口時(shí)間范圍內(nèi)的特定數(shù)據(jù)。滑動(dòng)窗口和會(huì)話窗口是處理無界數(shù)據(jù)時(shí)常用的2種窗口。
● 滑動(dòng)窗口:滑動(dòng)窗口通過一個(gè)窗口長(zhǎng)度和一個(gè)滑動(dòng)間隔來定義,滑動(dòng)間隔小于窗口長(zhǎng)度。滑動(dòng)窗口通常是對(duì)齊窗口。例如圖7中定義了一個(gè)窗口長(zhǎng)度為10 min的滑動(dòng)窗口,每隔5 min滑動(dòng)一次生成一個(gè)新的窗口。值得注意的是,此處的滑動(dòng)窗口只是為了給人一種滑動(dòng)的感覺,實(shí)際上3個(gè)不同的Key上都有3個(gè)窗口,而不僅僅是一個(gè)窗口。當(dāng)滑動(dòng)間隔等于窗口長(zhǎng)度時(shí),該窗口被稱為固定窗口。當(dāng)滑動(dòng)間隔大于窗口長(zhǎng)度時(shí),該窗口被稱為跳躍窗口。
● 會(huì)話窗口:會(huì)話窗口是指在數(shù)據(jù)子集上有一段活動(dòng)時(shí)間的窗口。會(huì)話窗口通過一個(gè)超時(shí)時(shí)間來定義,在超時(shí)時(shí)間內(nèi)的所有數(shù)據(jù)都被分在同一個(gè)窗口中,形成一個(gè)會(huì)話窗口。會(huì)話窗口是非對(duì)齊窗口。例如圖7中定義了一個(gè)超時(shí)時(shí)間為5 min的會(huì)話窗口,Key1上的會(huì)話1和會(huì)話2之間的間隔為6 min,超過了超時(shí)時(shí)間,因此被劃分為2個(gè)會(huì)話。
圖7???常用窗口
3.5 觸發(fā)器
窗口操作決定了數(shù)據(jù)按事件時(shí)間被分到哪個(gè)窗口內(nèi)一起進(jìn)行聚合操作,劃分好數(shù)據(jù)后進(jìn)一步需要解決的是窗口內(nèi)的數(shù)據(jù)按處理時(shí)間何時(shí)被處理并展示給用戶。本文在第3.2節(jié)中介紹了一種水位線機(jī)制,水位線機(jī)制用于評(píng)估窗口內(nèi)數(shù)據(jù)到達(dá)的完整性,每個(gè)窗口都帶有起始和終止事件時(shí)間戳,一旦水位線越過了某個(gè)窗口的終止時(shí)間戳,就認(rèn)為該窗口中的數(shù)據(jù)都已到達(dá),于是處理該窗口內(nèi)的數(shù)據(jù),并將結(jié)果反饋給用戶。但是水位線機(jī)制本質(zhì)上只是對(duì)窗口內(nèi)數(shù)據(jù)到達(dá)完整性的一種猜測(cè),這種猜測(cè)與真實(shí)的數(shù)據(jù)到達(dá)完整性相比可能過快或過慢。如圖8所示,如果水位線設(shè)置得過快,那么水位線之后仍有屬于該窗口內(nèi)的數(shù)據(jù)<a,1>繼續(xù)到達(dá),但沒有被處理,造成處理結(jié)果不正確;如果水位線設(shè)置得過慢,那么當(dāng)水位線越過窗口終止事件時(shí)間戳?xí)r才觸發(fā)計(jì)算,可能導(dǎo)致整個(gè)處理結(jié)果的展示具有較高的時(shí)延。因此,僅僅使用水位線機(jī)制來觸發(fā)計(jì)算和展示結(jié)果是不夠的。
圖8???水位線設(shè)置過快或過慢
為了既能使用戶盡快獲得結(jié)果,又能保證結(jié)果的正確性,需要定義多個(gè)觸發(fā)器,針對(duì)每個(gè)窗口多次向用戶提供結(jié)果。如圖9所示,在水位線觸發(fā)窗口計(jì)算得到結(jié)果之前,可以定義一個(gè)基于固定處理時(shí)間的觸發(fā)器向用戶盡早提供結(jié)果,該觸發(fā)器按處理時(shí)間每隔1 min觸發(fā)一次計(jì)算并提供結(jié)果。同樣地,在水位線之后到達(dá)的數(shù)據(jù)可以由一個(gè)基于元組個(gè)數(shù)的觸發(fā)器來處理,該觸發(fā)器每遇到一條數(shù)據(jù)就觸發(fā)計(jì)算,并為用戶提供結(jié)果。
圖9???觸發(fā)器
3.6 修正策略
除了控制何時(shí)觸發(fā)計(jì)算并展示結(jié)果之外,還需要一種方法來控制同一窗口因多次觸發(fā)計(jì)算而得到的多個(gè)結(jié)果之間如何相互關(guān)聯(lián),觸發(fā)器機(jī)制提供了拋棄、累積和累積并撤回3種不同的策略來修正同一個(gè)窗口的計(jì)算結(jié)果。
● 拋棄:觸發(fā)器一旦觸發(fā),窗口中的內(nèi)容就被拋棄,之后觸發(fā)得到的結(jié)果和之前的結(jié)果不存在任何相關(guān)性。
● 累積:觸發(fā)器觸發(fā)后,窗口中數(shù)據(jù)的聚合結(jié)果被保留到系統(tǒng)狀態(tài)中,之后觸發(fā)的計(jì)算會(huì)累積到之前的結(jié)果上,成為針對(duì)之前結(jié)果的一個(gè)修正版本。
● 累積并撤回:觸發(fā)器觸發(fā)后,窗口中數(shù)據(jù)的聚合結(jié)果被保留到系統(tǒng)狀態(tài),當(dāng)窗口再次觸發(fā)計(jì)算時(shí),先對(duì)上一次的結(jié)果做撤回處理,再將新的結(jié)果作為修正后的結(jié)果。
4 數(shù)據(jù)流編程模型在執(zhí)行引擎中的實(shí)現(xiàn)
本節(jié)先介紹批處理引擎和流計(jì)算引擎各自的執(zhí)行模型,再結(jié)合執(zhí)行引擎實(shí)例,從數(shù)據(jù)流編程模型的時(shí)間語(yǔ)義和水位線機(jī)制、操作算子、窗口操作、觸發(fā)器以及修正策略5個(gè)方面,分析數(shù)據(jù)流編程模型在批處理引擎和流計(jì)算引擎中的具體實(shí)現(xiàn),最后對(duì)這2種執(zhí)行引擎在實(shí)現(xiàn)數(shù)據(jù)流編程模型上的異同進(jìn)行對(duì)比。
在批處理引擎的執(zhí)行模型中,數(shù)據(jù)操作的粒度為一批數(shù)據(jù),即一次讀取并處理一整批數(shù)據(jù)。整個(gè)數(shù)據(jù)處理邏輯通常被劃分為多個(gè)階段,多個(gè)階段按序被調(diào)度執(zhí)行,每個(gè)階段中的任務(wù)處理所得的中間結(jié)果需要落盤,只有等到該階段所有數(shù)據(jù)都處理完成后,才能將中間結(jié)果發(fā)送給下一個(gè)階段繼續(xù)處理。而在流計(jì)算引擎的執(zhí)行模型中,數(shù)據(jù)操作的粒度為一條數(shù)據(jù),即一次計(jì)算一條數(shù)據(jù)。所有數(shù)據(jù)處理任務(wù)一開始就同時(shí)啟動(dòng),并長(zhǎng)時(shí)間運(yùn)行直到終止,每個(gè)長(zhǎng)時(shí)間任務(wù)隨著數(shù)據(jù)的不斷進(jìn)入而不停地執(zhí)行計(jì)算,每個(gè)任務(wù)處理完一條數(shù)據(jù)后,就將其發(fā)送給下一個(gè)任務(wù)繼續(xù)處理,而不需要像批處理引擎的執(zhí)行模型那樣將中間結(jié)果落盤。
4.1 數(shù)據(jù)流編程模型在批處理引擎中的實(shí)現(xiàn)
為了支持基于事件時(shí)間語(yǔ)義的處理,批處理引擎要求讀入的每一批數(shù)據(jù)中的每一條元組都自帶一個(gè)事件時(shí)間戳,并且在處理數(shù)據(jù)時(shí)由用戶指定每條數(shù)據(jù)中哪個(gè)字段是事件時(shí)間戳,該事件時(shí)間戳用于生成水位線。按照數(shù)據(jù)流編程模型中提出的水位線機(jī)制,批處理引擎應(yīng)當(dāng)能夠根據(jù)一個(gè)批次中的每一條數(shù)據(jù)立即更新當(dāng)前的水位線,并且一旦水位線越過某個(gè)窗口的終止事件時(shí)間戳,就觸發(fā)該窗口的計(jì)算,并向用戶展示結(jié)果。但是這與批處理引擎的處理機(jī)制是矛盾的,因?yàn)榕幚硪嬷荒軐⒄麄€(gè)批次中的所有數(shù)據(jù)一起進(jìn)行處理,而不能對(duì)一個(gè)批次中的數(shù)據(jù)進(jìn)行切割,只處理一個(gè)批次中的一部分?jǐn)?shù)據(jù),所以批處理引擎難以實(shí)現(xiàn)數(shù)據(jù)流編程模型中的水位線機(jī)制。例如,在基于批處理引擎的Structured Streaming系統(tǒng)中支持事件時(shí)間語(yǔ)義和水位線,但無法按照水位線觸發(fā)窗口計(jì)算。如圖10所示,假設(shè)在Structured Streaming中定義一個(gè)窗口長(zhǎng)度為1 min的滾動(dòng)窗口,每隔10 s讀取一批數(shù)據(jù)且一起進(jìn)行處理。如果要讓Structured Streaming做到根據(jù)每一條數(shù)據(jù)更新水位線并按水位線觸發(fā)計(jì)算,則在該例子中,當(dāng)讀到(b,1,12:01:01)這條數(shù)據(jù)時(shí),就應(yīng)該將水位線按照當(dāng)前收到的數(shù)據(jù)的最大事件時(shí)間戳更新為12:01:01,并觸發(fā)[12:00:00,12:01:00]窗口的計(jì)算,但這違背了批處理引擎按一整批數(shù)據(jù)進(jìn)行計(jì)算的機(jī)制。Structured Streaming只能做到按一整批數(shù)據(jù)進(jìn)行處理,并將水位線設(shè)置為當(dāng)前已收到的所有數(shù)據(jù)中的最大事件時(shí)間戳的值,下一批次中如果存在某個(gè)元組的事件時(shí)間小于上一批次生成的水位線,如該例子中的(a,1,12:00:58)的事件時(shí)間戳12:00:58小于上一批次生成的水位線12:01:02,則直接丟棄該元組,不再對(duì)其進(jìn)行處理。此外,基于批處理引擎的MapReduce、Spark和Dryad等系統(tǒng)都沒有引入時(shí)間語(yǔ)義和水位線。在基于批處理引擎的Spark Streaming系統(tǒng)中雖然引入了時(shí)間語(yǔ)義,但僅支持基于處理時(shí)間語(yǔ)義的處理,不支持基于事件時(shí)間語(yǔ)義的處理,因此也沒有水位線機(jī)制,無法按水位線觸發(fā)計(jì)算。
圖10???Structured Streaming中的水位線機(jī)制
在操作算子方面,批處理引擎能夠按照數(shù)據(jù)流編程模型的概念,提供類似ParDo和GroupByKeyAndWindow的算子,但前提是需要批處理引擎支持基于窗口的計(jì)算。值得注意的是,批處理引擎中的聚合操作是在每一批數(shù)據(jù)上的操作,即要等到一個(gè)批次中的數(shù)據(jù)都獲取后,才對(duì)這一批次中的所有數(shù)據(jù)按鍵值進(jìn)行分組。例如,在Structured Streaming中支持基于窗口的計(jì)算,提供了類似ParDo和GroupByKeyAndWindow的算子,最終所有算子被轉(zhuǎn)換為Spark批處理引擎的RDD數(shù)據(jù)模型上的操作,一次操作一批數(shù)據(jù)。在MapReduce、Spark和Dryad等系統(tǒng)中,有類似ParDo的算子,一次處理一批數(shù)據(jù),但不提供類似GroupByKeyAndWindow的算子,因?yàn)樗鼈兌疾恢С只诖翱诘牟僮鳌T赟park Streaming中,由于Spark Streaming僅支持基于處理時(shí)間語(yǔ)義的窗口,因此無法提供事件時(shí)間語(yǔ)義上的GroupByKeyAndWindow算子,僅提供處理時(shí)間語(yǔ)義上的GroupByKeyAndWindow算子。
關(guān)于窗口操作,批處理引擎按批次將數(shù)據(jù)分配到窗口。也就是說,對(duì)于到達(dá)的每一個(gè)批次,根據(jù)事件時(shí)間將該批次中的每一個(gè)元組劃分到其所屬的窗口中。對(duì)于觸發(fā)器來說,由于批處理引擎中數(shù)據(jù)成批到達(dá)、成批處理的特性,批處理引擎難以實(shí)現(xiàn)按水位線和按元組個(gè)數(shù)觸發(fā)計(jì)算,易實(shí)現(xiàn)按照固定處理時(shí)間間隔觸發(fā)窗口的計(jì)算。如上所述,批處理引擎難以按水位線觸發(fā)計(jì)算,按元組個(gè)數(shù)觸發(fā)計(jì)算同樣也要求批處理引擎切割一個(gè)批次,只計(jì)算一個(gè)批次中的一部分?jǐn)?shù)據(jù),這與批處理引擎的處理機(jī)制相背離。Structured Streaming只支持按固定時(shí)間間隔觸發(fā)窗口計(jì)算,即根據(jù)固定處理時(shí)間間隔劃分?jǐn)?shù)據(jù)批次,并按 批次觸發(fā)窗口計(jì)算。如圖11所示,假定Structured Streaming每隔10 s讀取一批數(shù)據(jù),如果要支持每到達(dá)一個(gè)元組就觸發(fā)窗口計(jì)算,那么當(dāng)數(shù)據(jù)元素(a,1,12:00:57)到達(dá)時(shí)就要觸發(fā)計(jì)算,并將結(jié)果展示給用戶,這違背了批處理引擎成批處理的機(jī)制。在該例子中,系統(tǒng)每隔10 s讀取一次數(shù)據(jù)并觸發(fā)一次計(jì)算,然后將處理結(jié)果展示給用戶,再過10 s讀取下一批數(shù)據(jù)并觸發(fā)下一次的計(jì)算。對(duì)于每一個(gè)窗口多次觸發(fā)計(jì)算而得到的多個(gè)結(jié)果,批處理引擎理論上能夠提供拋棄、累積和累積并撤回3種策略來進(jìn)行關(guān)聯(lián),但是目前在Structured Streaming中只實(shí)現(xiàn)了累積策略。在MapReduce、Spark和Dryad中,由于不支持基于窗口的計(jì)算,因此沒有觸發(fā)器和修正策略。而Spark Streaming支持基于處理時(shí)間語(yǔ)義的窗口計(jì)算,可提供基于固定時(shí)間間隔的觸發(fā)器和累積修正策略。
圖11???St ructured Streaming中的觸發(fā)器
4.2 數(shù)據(jù)流編程模型在流計(jì)算引擎中的實(shí)現(xiàn)
與批處理引擎相同,為了支持事件時(shí)間,流計(jì)算引擎也要求數(shù)據(jù)源中的每條數(shù)據(jù)都自帶事件時(shí)間戳,并由用戶指定每條數(shù)據(jù)中的某個(gè)字段作為事件時(shí)間戳。但是流計(jì)算引擎的水位線機(jī)制與批處理引擎不同。對(duì)于流計(jì)算引擎來說,每來一條數(shù)據(jù)就立即處理一條數(shù)據(jù),因此它能夠做到來一條數(shù)據(jù)就更新一次水位線,并當(dāng)水位線越過某個(gè)窗口的終止事件時(shí)間戳?xí)r,就觸發(fā)該窗口的計(jì)算并將結(jié)果反饋給用戶。例如,基于流計(jì)算引擎的Flink系統(tǒng)支持事件時(shí)間語(yǔ)義和水位線,并且能夠按照水位線觸發(fā)窗口計(jì)算。如圖12所示,在Flink中定義一個(gè)窗口長(zhǎng)度為1 min的滾動(dòng)窗口,當(dāng)數(shù)據(jù)(b,1,12:01:01)到達(dá)時(shí),根據(jù)當(dāng)前已收到的數(shù)據(jù)的最大事件時(shí)間戳,水位線被設(shè)置為12:01:01。此時(shí),水位線超過了[12:00:00,12:01:00]窗口的終止事件時(shí)間戳,立即觸發(fā)該窗口的計(jì)算,并將結(jié)果反饋給用戶。同樣地,基于流計(jì)算引擎的Storm、Millwheel、Samza系統(tǒng)也支持事件時(shí)間語(yǔ)義和水位線,并能夠按照水位線觸發(fā)窗口計(jì)算。
圖12???Flink中的水位線
在操作算子方面,流計(jì)算引擎能夠按照數(shù)據(jù)流編程模型的概念,提供類似ParDo和GroupByKeyAndWindow的算子,但前提是系統(tǒng)支持基于窗口的計(jì)算。值得注意的是,與批處理引擎不同,流計(jì)算引擎是來一條數(shù)據(jù)就處理一條數(shù)據(jù)。因此在流計(jì)算引擎中,聚合操作是在每一條數(shù)據(jù)上的操作,即每來一條數(shù)據(jù)就將其按鍵值劃分到所屬的分組中。例如,在基于流計(jì)算引擎的Flink、Storm和MillWheel、Samza系統(tǒng)中,所有算子都是每來一條數(shù)據(jù)就處理一條數(shù)據(jù)。
窗口操作在流計(jì)算引擎中的實(shí)現(xiàn)與在批處理引擎中不同,流計(jì)算引擎按元組將數(shù)據(jù)分配到窗口。也就是說,每來一個(gè)元組,系統(tǒng)就按照事件時(shí)間戳將其分配到對(duì)應(yīng)的窗口中。對(duì)于觸發(fā)器,流計(jì)算引擎中每到達(dá)一條數(shù)據(jù)就處理一條數(shù)據(jù),因此流計(jì)算引擎自然能夠按元組個(gè)數(shù)觸發(fā)窗口計(jì)算。如上所述,流計(jì)算引擎也能按水位線觸發(fā)窗口計(jì)算。此外,流計(jì)算引擎還能做到按固定處理時(shí)間間隔觸發(fā)窗口計(jì)算,只需在到達(dá)處理時(shí)間間隔時(shí),對(duì)窗口中已到達(dá)的數(shù)據(jù)進(jìn)行處理,并將處理結(jié)果展示給用戶。例如,Flink提供了按水位線、按元組個(gè)數(shù)和按固定時(shí)間間隔3種觸發(fā)策略的觸發(fā)器,Flink甚至還支持用戶自定義觸發(fā)器的觸發(fā)策略,以便靈活組合使用多種觸發(fā)策略。如圖13所示,在Flink中設(shè)置一個(gè)按每到達(dá)一個(gè)元組就觸發(fā)窗口計(jì)算的觸發(fā)器,那么當(dāng)數(shù)據(jù)(a,1,12:00:57)到達(dá)時(shí)就觸發(fā)計(jì)算,并將處理結(jié)果展示給用戶;當(dāng)數(shù)據(jù)(b,1,12:01:01)到達(dá)時(shí),再次觸發(fā)窗口計(jì)算,并將結(jié)果反饋給用戶。對(duì)于每一個(gè)窗口多次觸發(fā)計(jì)算而得到的多個(gè)結(jié)果,流計(jì)算引擎理論上能夠提供拋棄、累積和累積并撤回3種策略來進(jìn)行關(guān)聯(lián),但是目前在Flink中只實(shí)現(xiàn)了累積策略。在Storm中也提供了按水位線、按元組個(gè)數(shù)和按固定時(shí)間間隔3種觸發(fā)策略的觸發(fā)器,但是難以組合使用多種類型的觸發(fā)器,在修正策略上Storm僅支持累積策略。Samza支持以上3種觸發(fā)策略的觸發(fā)器,并且可以基于過早觸發(fā)和過晚觸發(fā)的條件來組合使用各類觸發(fā)器,在修正策略上同樣只支持累積策略。
圖13???Flink 中的觸發(fā)器
4.3 數(shù)據(jù)流編程模型在批/流引擎實(shí)現(xiàn)中的異同
數(shù)據(jù)流編程模型在批處理引擎和流計(jì)算引擎中的實(shí)現(xiàn)既有相同之處,也有不同之處。相同之處是兩者都要求引入時(shí)間語(yǔ)義,并讓用戶指定數(shù)據(jù)中的某一列為事件時(shí)間戳列,以支持基于事件時(shí)間語(yǔ)義的處理。此外,修正策略在批處理引擎和流計(jì)算引擎中的實(shí)現(xiàn)也有相同之處,兩者理論上都能實(shí)現(xiàn)數(shù)據(jù)流編程模型中提出的3種修正策略。
批處理引擎和流計(jì)算引擎的數(shù)據(jù)處理機(jī)制不同,兩者在實(shí)現(xiàn)數(shù)據(jù)流編程模型時(shí)也有不同之處。批處理引擎一次處理一批數(shù)據(jù),因此批處理引擎中的操作算子和窗口操作的對(duì)象都是一批數(shù)據(jù),而流計(jì)算引擎一次計(jì)算一條數(shù)據(jù),因此流計(jì)算引擎中的操作算子和窗口操作的對(duì)象都是一條數(shù)據(jù)。此外,兩者的觸發(fā)機(jī)制也不同,批處理引擎難以實(shí)現(xiàn)按水位線或元組個(gè)數(shù)觸發(fā)窗口計(jì)算,只支持按固定處理時(shí)間間隔觸發(fā)計(jì)算。而流計(jì)算引擎能夠?qū)崿F(xiàn)數(shù)據(jù)流編程模型中提出的各種觸發(fā)器,如基于水位線的觸發(fā)器、基于元組個(gè)數(shù)的觸發(fā)器以及基于固定處理時(shí)間間隔的觸發(fā)器等。總體來說,流計(jì)算引擎比批處理引擎更適合用于實(shí)現(xiàn)數(shù)據(jù)流編程模型。
5 結(jié)束語(yǔ)
本文說明了計(jì)算機(jī)計(jì)算模型中的數(shù)據(jù)流計(jì)算模型與大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型的不同。一方面,從執(zhí)行引擎層面分析了大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型體現(xiàn)的數(shù)據(jù)流圖,并結(jié)合Spark批處理引擎和Flink流計(jì)算引擎2個(gè)典型的執(zhí)行引擎,描述了數(shù)據(jù)流圖在兩者中的具體體現(xiàn);另一方面,從統(tǒng)一編程層面闡述了大數(shù)據(jù)處理中的數(shù)據(jù)流計(jì)算模型體現(xiàn)的數(shù)據(jù)流編程模型,結(jié)合批處理引擎和流計(jì)算引擎各自的執(zhí)行模型,并選取基于批處理引擎的Structured Streaming、Spark Streaming、Dryad和基于流計(jì)算引擎的Flink、Storm、Samza等多個(gè)系統(tǒng),對(duì)比分析了數(shù)據(jù)流編程模型在批處理引擎和流計(jì)算引擎中的具體實(shí)現(xiàn)。
目前,無界、亂序的大規(guī)模數(shù)據(jù)已經(jīng)越來越普遍,消費(fèi)者對(duì)數(shù)據(jù)處理的需求也越來越復(fù)雜,這對(duì)大數(shù)據(jù)處理系統(tǒng)提出了更高的要求。本文介紹的數(shù)據(jù)流計(jì)算模型是朝這個(gè)方向邁出的重要一步,該模型將批處理引擎和流計(jì)算引擎的編程方式進(jìn)行抽象統(tǒng)一,并引入事件時(shí)間、窗口、水位線和觸發(fā)器等概念,使得大數(shù)據(jù)處理系統(tǒng)能夠高效地應(yīng)對(duì)無界、亂序的大規(guī)模數(shù)據(jù)。如今,許多大數(shù)據(jù)處理系統(tǒng)已經(jīng)朝著該數(shù)據(jù)流計(jì)算模型發(fā)展,基于流計(jì)算引擎實(shí)現(xiàn)該數(shù)據(jù)流計(jì)算模型的大數(shù)據(jù)處理系統(tǒng)將是一個(gè)研究方向,但是基于批處理引擎的大數(shù)據(jù)處理系統(tǒng)在時(shí)延性和觸發(fā)機(jī)制等方面還存在缺陷,需要進(jìn)一步研究。
作者簡(jiǎn)介
畢倪飛(1996-),男,華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院碩士生,主要研究方向?yàn)楫悩?gòu)分布式系統(tǒng)中的查詢優(yōu)化 。
丁光耀(1996-),男,華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院博士生,主要研究方向?yàn)椴⑿信c分布式系統(tǒng) 。
陳啟航(1996-),男,華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院碩士生,主要研究方向?yàn)楫悩?gòu)分布式計(jì)算中的查詢優(yōu)化 。
徐辰(1988-),男,華東師范大學(xué)數(shù)據(jù)科學(xué)與工程學(xué)院副教授、碩士生導(dǎo)師,主要研究方向?yàn)榇笠?guī)模分布式數(shù)據(jù)管理 E-mail:cxu@dase.ecnu.edu.cn。
周傲英(1965-),男,博士,華東師范大學(xué)副校長(zhǎng)、“智能+”研究院院長(zhǎng)、數(shù)據(jù)科學(xué)與工程學(xué)院教授。現(xiàn)任第七屆國(guó)務(wù)院學(xué)位委員會(huì)學(xué)科評(píng)議組成員,中國(guó)計(jì)算機(jī)學(xué)會(huì)會(huì)士,上海市計(jì)算機(jī)學(xué)會(huì)副理事長(zhǎng),《計(jì)算機(jī)學(xué)報(bào)》《大數(shù)據(jù)》期刊副主編。曾入選“長(zhǎng)江學(xué)者計(jì)劃”特聘教授,曾獲國(guó)家杰出青年基金項(xiàng)目資助,主要研究方向?yàn)閿?shù)據(jù)庫(kù)、數(shù)據(jù)管理、數(shù)據(jù)驅(qū)動(dòng)的計(jì)算教育學(xué),以及教育科技(EduTech)、物流科技(LogTech)等基于數(shù)據(jù)的應(yīng)用科技 。
大數(shù)據(jù)期刊
《大數(shù)據(jù)(Big Data Research,BDR)》雙月刊是由中華人民共和國(guó)工業(yè)和信息化部主管,人民郵電出版社主辦,中國(guó)計(jì)算機(jī)學(xué)會(huì)大數(shù)據(jù)專家委員會(huì)學(xué)術(shù)指導(dǎo),北京信通傳媒有限責(zé)任公司出版的期刊,已成功入選中文科技核心期刊、中國(guó)計(jì)算機(jī)學(xué)會(huì)會(huì)刊、中國(guó)計(jì)算機(jī)學(xué)會(huì)推薦中文科技期刊,并被評(píng)為2018年國(guó)家哲學(xué)社會(huì)科學(xué)文獻(xiàn)中心學(xué)術(shù)期刊數(shù)據(jù)庫(kù)“綜合性人文社會(huì)科學(xué)”學(xué)科最受歡迎期刊。
關(guān)注《大數(shù)據(jù)》期刊微信公眾號(hào),獲取更多內(nèi)容
往期文章回顧
《大數(shù)據(jù)》2020年第3期目次&摘要
專題導(dǎo)讀:數(shù)據(jù)資產(chǎn)化探索
數(shù)據(jù)資產(chǎn)化框架初探
基于利潤(rùn)最大化的數(shù)據(jù)資產(chǎn)價(jià)值評(píng)估模型
基于區(qū)塊鏈的數(shù)據(jù)市場(chǎng)
數(shù)據(jù)資產(chǎn)標(biāo)準(zhǔn)研究進(jìn)展與建議
面向價(jià)值實(shí)現(xiàn)的數(shù)據(jù)資產(chǎn)管理體系構(gòu)建
專題導(dǎo)讀:面向大數(shù)據(jù)處理的數(shù)據(jù)流計(jì)算技術(shù)
面向大數(shù)據(jù)處理的數(shù)據(jù)流編程模型和工具綜述
總結(jié)
以上是生活随笔為你收集整理的数据流计算模型及其在大数据处理中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML对象关系与箭头对应表
- 下一篇: PlantUML时序图