批量計算和流式計算


一、數據集類型

現實世界中,所有的數據都是以流式的形態產生的,不管是哪里產生的數據,在產生的過程中都是一條條地生成,最后經過了存儲和轉換處理,形成了各種類型的數據集。如下圖所示,根據現實的數據產生方式和數據產生是否含有邊界(具有起始點和終止點)角度,將數據分為兩種類型的數據集,一種是有界數據集,另外一種是無界數據集。

  1. 有界數據集
    有界數據集具有時間邊界,在處理過程中數據一定會在某個時間范圍內起始和結束,有可能是一分鍾,也有可能是一天內的交易數據。對有界數據集的數據處理方式被稱為批計算(Batch Processing),例如將數據從RDBMS或文件系統等系統中讀取出來,然后在分布式系統內處理,最后再將處理結果寫入存儲介質中,整個過程就被稱為批處理過程。而針對批數據處理,目前業界比較流行的分布式批處理框架有Apache Hadoop和Apache Spark等。
  2. 無界數據集
    對於無界數據集,數據從開始生成就一直持續不斷地產生新的數據,因此數據是沒有邊界的,例如服務器的日志、傳感器信號數據等。和批量數據處理方式對應,對無界數據集的數據處理方式被稱為流式數據處理,簡稱為流處理(Streaming Process)。可以看出,流式數據處理過程實現復雜度會更高,因為需要考慮處理過程中數據的順序錯亂,以及系統容錯等方面的問題,因此流處理需要借助專門的流數據處理技術。目前業界的Apache Storm、Spark Streaming、Apache Flink等分布式計算引擎都能不同程度地支持處理流式數據。
  3. 統一數據處理
    有界數據集和無界數據集只是一個相對的概念,主要根據時間的范圍而定,可以認為一段時間內的無界數據集其實就是有界數據集,同時有界數據也可以通過一些方法轉換為無界數據。例如系統一年的訂單交易數據,其本質上應該是有界的數據集,可是當我們把它一條一條按照產生的順序發送到流式系統,通過流式系統對數據進行處理,在這種情況下可以認為數據是相對無界的。對於無界數據也可以拆分成有界數據進行處理,例如將系統產生的數據接入到存儲系統,按照年或月進行切割,切分成不同時間長度的有界數據集,然后就可以通過批處理方式對數據進行處理。從以上分析我們可以得出結論:有界數據和無界數據其實是可以相互轉換的。有了這樣的理論基礎,對於不同的數據類型,業界也提出了不同的能夠統一數據處理的計算框架。
    目前在業界比較熟知的開源大數據處理框架中,能夠同時支持流式計算和批量計算,比較典型的代表分別為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM