批處理
批處理的輸入是在一段時間內已經采集並存儲好的有邊界數據(相關概念見后面附錄介紹)。同樣的,輸出數據也一樣是有邊界數據。當然,每次經過批處理后所產生的輸出也可以作為下一次批處理的輸入。
舉個例子,你在每年年初所看到的“支付寶年賬單”就是一個數據批處理的典型例子:
支付寶會將我們在過去一年中的消費數據存儲起來作為批處理輸入,提取出過去一年中產生的交易數據,經過一系列業務邏輯處理,得到各種有趣的信息作為輸出。
在許多情況下,批處理任務會被安排並以預先定義好的時間間隔來運行,例如一天、一月或者一年這樣的周期時間。
由於批處理的任務一般都是將輸入數據累積一段時間后一塊一塊的交由程序處理。所以,完成批處理任務具有高延遲性,一般可以需要花費幾小時,幾天甚至是幾周的時間。要是在開發業務中有快速響應用戶的時間需求,我們則需要考慮使用流處理 / 實時處理來處理大數據。
流處理
流處理的輸入基本上都是無邊界數據。
流處理可以理解為系統需要接收並處理一系列連續不斷變化的數據。例如,旅行預訂系統,處理社交媒體更新信息的有關系統等等。
流處理的特點是要足夠快、低延時,以便能夠處理來自各種數據源的大規模數據。流處理所需的響應時間更應該以毫秒(或微秒)來進行計算。像我們平時用到的搜索引擎,系統必須在用戶輸入關鍵字后以毫秒級的延時返回搜索結果給用戶。還記得我們在介紹批處理架構中所說到的不足嗎?沒錯,是高延遲。而流處理架構則恰恰擁有高吞度量和低延遲等特點。
現如今的開源架構生態圈中,如 Apache Kafka、Apache Flink、Apache Storm、Apache Samza 等,都是流行的流處理架構平台。
最簡單的說,基本的區別在於每一條新數據在到達時是被處理的,還是需要累積一段時間后集中處理。這種區分將處理分為批處理和流處理:
批處理模式在不需要實時分析結果的情況下是一種很好的選擇。尤其當業務邏輯需要處理大量的數據以挖掘更為深層次數據信息的時候。
而在需要對數據進行實時分析處理時,或者說當有些數據是永無止境的事件流時(例如傳感器發送回來的數據時),我們則應該選擇用流處理模式。
附錄:
無邊界數據和有邊界數據
這個世界上的數據可以抽象成為兩種,分別是無邊界數據(Unbounded Data)和有邊界數據(Bounded Data)。
顧名思義,無邊界數據是一種不斷增長,可以說是無限的數據集。這種類型的數據,我們無法判定它們到底什么時候會停止發送。例如,從手機或者從傳感器發送出來的信號數據,又比如我們所熟知的移動支付領域中的交易數據。因為每時每刻都會有交易產生,所以我們不能判定在某一刻這類數據就會停止發送了。
在一些技術文章上,有時候我們會看到“流數據(Streaming Data)”這一說法,其實它和無邊界數據表達的是同一個概念。
與此相反,有邊界數據是一種有限的數據集。這種數據更常見於已經保存好了的數據中。例如,數據庫中的數據,或者是我們常見的 CSV 格式文件中的數據。
當然了,如果我們把無邊界數據按照時間窗口提取一小份出來,那這樣的數據就變成了有邊界數據了。所以,有邊界數據其實可以看作是無邊界數據的一個子集。