批量計算和流式計算
一、資料集型別
現實世界中,所有的資料都是以流式的形態產生的,不管是哪裡產生的資料,在產生的過程中都是一條條地生成,最後經過了儲存和轉換處理,形成了各種型別的資料集。如下圖所示,根據現實的資料產生方式和資料產生是否含有邊界(具有起始點和終止點)角度,將資料分為兩種型別的資料集,一種是有界資料集,另外一種是無界資料集。
- 有界資料集
有界資料集具有時間邊界,在處理過程中資料一定會在某個時間範圍內起始和結束,有可能是一分鐘,也有可能是一天內的交易資料。對有界資料集的資料處理方式被稱為批計算(Batch Processing),例如將資料從RDBMS或檔案系統等系統中讀取出來,然後在分散式系統內處理,最後再將處理結果寫入儲存介質中,整個過程就被稱為批處理過程。而針對批資料處理,目前業界比較流行的分散式批處理框架有Apache Hadoop和Apache Spark等。 - 無界資料集
對於無界資料集,資料從開始生成就一直持續不斷地產生新的資料,因此資料是沒有邊界的,例如伺服器的日誌、感測器訊號資料等。和批量資料處理方式對應,對無界資料集的資料處理方式被稱為流式資料處理,簡稱為流處理(Streaming Process)。可以看出,流式資料處理過程實現複雜度會更高,因為需要考慮處理過程中資料的順序錯亂,以及系統容錯等方面的問題,因此流處理需要藉助專門的流資料處理技術。目前業界的Apache Storm、Spark Streaming、Apache Flink等分散式計算引擎都能不同程度地支援處理流式資料。 - 統一資料處理
有界資料集和無界資料集只是一個相對的概念,主要根據時間的範圍而定,可以認為一段時間內的無界資料集其實就是有界資料集,同時有界資料也可以通過一些方法轉換為無界資料。例如系統一年的訂單交易資料,其本質上應該是有界的資料集,可是當我們把它一條一條按照產生的順序傳送到流式系統,通過流式系統對資料進行處理,在這種情況下可以認為資料是相對無界的。對於無界資料也可以拆分成有界資料進行處理,例如將系統產生的資料接入到儲存系統,按照年或月進行切割,切分成不同時間長度的有界資料集,然後就可以通過批處理方式對資料進行處理。從以上分析我們可以得出結論:有界資料和無界資料其實是可以相互轉換的。有了這樣的理論基礎,對於不同的資料型別,業界也提出了不同的能夠統一資料處理的計算框架。
目前在業界比較熟知的開源大資料處理框架中,能夠同時支援流式計算和批量計算,比較典型的代表分別為Apache Spark和Apache Flink兩套框架。其中Spark通過批處理模式來統一處理不同型別的資料集,對於流資料是將資料按照批次切分成微批(有界資料集)來進行處理。Flink則從另外一個角度出發,通過流處理模式來統一處理不同型別的資料集。Flink用比較符合資料產生的規律方式處理流式資料,對於有界資料可以轉換成無界資料統一進行流式,最終將批處理和流處理統一在一套流式引擎中,這樣使用者就可以使用一套引擎進行批計算和流計算的任務。
前面已經提到使用者可能需要通過將多種計算框架並行使用來解決不同型別的資料處理,例如使用者可能使用Flink作為流計算的引擎,使用Spark或者MapReduce作為批計算的引擎,這樣不僅增加了系統的複雜度,也增加了使用者學習和運維的成本。而Flink作為一套新興的分散式計算引擎,能夠在統一平臺中很好地處理流式任務和批量任務,同時使用流計算模式更符合資料產生的規律,相信Flink會在未來成為眾多大資料處理引擎的一顆明星。
二、實時計算、離線計算、流式計算和批量計算分別是什麼?有什麼區別?
大資料的計算模式主要分為批量計算(batch computing)、流式計算(stream computing)、互動計算(interactive computing)、圖計算(graph computing)等。其中,流式計算和批量計算是兩種主要的大資料計算模式,分別適用於不同的大資料應用場景。
流資料(或資料流)是指在時間分佈和數量上無限的一系列動態資料集合體,資料的價值隨著時間的流逝而降低,因此必須實時計算給出秒級響應。流式計算,顧名思義,就是對資料流進行處理,是實時計算。批量計算則統一收集資料,儲存到資料庫中,然後對資料進行批量處理的資料計算方式。主要體現在以下幾個方面:
1、資料時效性不同:流式計算實時、低延遲, 批量計算非實時、高延遲。
2、資料特徵不同:流式計算的資料一般是動態的、沒有邊界的,而批處理的資料一般則是靜態資料。
3、應用場景不同:流式計算應用在實時場景,時效性要求比較高的場景,如實時推薦、業務監控...批量計算一般說批處理,應用在實時性要求不高、離線計算的場景下,資料分析、離線報表等。
4、執行方式不同,流式計算的任務持續進行的,批量計算的任務則一次性完成。
流式處理可以用於兩種不同場景: 事件流和持續計算。
1、事件流
事件流具能夠持續產生大量的資料,這類資料最早出現與傳統的銀行和股票交易領域,也在網際網路監控、無線通訊網等領域出現、需要以近實時的方式對更新資料流進行復雜分析如趨勢分析、預測、監控等。簡單來說,事件流採用的是查詢保持靜態,語句是固定的,資料不斷變化的方式。
2、持續計算
比如對於大型網站的流式資料:網站的訪問PV/UV、使用者訪問了什麼內容、搜尋了什麼內容等,實時的資料計算和分析可以動態實時地重新整理使用者訪問資料,展示網站實時流量的變化情況,分析每天各小時的流量和使用者分佈情況;
比如金融行業,毫秒級延遲的需求至關重要。一些需要實時處理資料的場景也可以應用Storm,比如根據使用者行為產生的日誌檔案進行實時分析,對使用者進行商品的實時推薦等。
五、流式計算的價值
通過大資料處理我們獲取了資料的價值,但是資料的價值是恆定不變的嗎?顯然不是,一些資料在事情發生後不久就有了更高的價值,而且這種價值會隨著時間的推移而迅速減少。流處理的關鍵優勢在於它能夠更快地提供洞察力,通常在毫秒到秒之間。
流式計算的價值在於業務方可在更短的時間內挖掘業務資料中的價值,並將這種低延遲轉化為競爭優勢。比方說,在使用流式計算的推薦引擎中,使用者的行為偏好可以在更短的時間內反映在推薦模型中,推薦模型能夠以更低的延遲捕捉使用者的行為偏好以提供更精準、及時的推薦。
流式計算能做到這一點的原因在於,傳統的批量計算需要進行資料積累,在積累到一定量的資料後再進行批量處理;而流式計算能做到資料隨到隨處理,有效降低了處理延時。
目前主流的流式計算框架有Storm、Spark Streaming、Flink三種,其基本原理如下:
Apache Storm
在Storm中,需要先設計一個實時計算結構,我們稱之為拓撲(topology)。之後,這個拓撲結構會被提交給叢集,其中主節點(master node)負責給工作節點(worker node)分配程式碼,工作節點負責執行程式碼。在一個拓撲結構中,包含spout和bolt兩種角色。資料在spouts之間傳遞,這些spouts將資料流以tuple元組的形式傳送;而bolt則負責轉換資料流。
Apache Spark
Spark Streaming,即核心Spark API的擴充套件,不像Storm那樣一次處理一個數據流。相反,它在處理資料流之前,會按照時間間隔對資料流進行分段切分。Spark針對連續資料流的抽象,我們稱為DStream(Discretized Stream)。 DStream是小批處理的RDD(彈性分散式資料集), RDD則是分散式資料集,可以通過任意函式和滑動資料視窗(視窗計算)進行轉換,實現並行操作。
Apache Flink
針對流資料+批資料的計算框架。把批資料看作流資料的一種特例,延遲性較低(毫秒級),且能夠保證訊息傳輸不丟失不重複。
Flink創造性地統一了流處理和批處理,作為流處理看待時輸入資料流是無界的,而批處理被作為一種特殊的流處理,只是它的輸入資料流被定義為有界的。Flink程式由Stream和Transformation這兩個基本構建塊組成,其中Stream是一箇中間結果資料,而Transformation是一個操作,它對一個或多個輸入Stream進行計算處理,輸出一個或多個結果Stream。
這三種計算框架的對比如下:
原文連結:https://blog.csdn.net/Jack__iT/java/article/details/103266486