流處理能力是由Spark Streaming實(shí)現(xiàn)的。Spark本身在設(shè)計上主要面向批處理工作負(fù)載,為了彌補(bǔ)引擎設(shè)計和流處理工作負(fù)載特征方面的差異,Spark實(shí)現(xiàn)了一種叫做微批(Micro-batch)*的概念。在具體策略方面該技術(shù)可以將數(shù)據(jù)流視作一系列非常小的“批”,借此即可通過批處理引擎的原生語義進(jìn)行處理。
Spark Streaming會以亞秒級增量對流進(jìn)行緩沖,隨后這些緩沖會作為小規(guī)模的固定數(shù)據(jù)集進(jìn)行批處理。這種方式的實(shí)際效果非常好,但相比真正的流處理框架在性能方面依然存在不足。
優(yōu)勢和局限
使用Spark而非Hadoop MapReduce的主要原因是速度。在內(nèi)存計算策略和先進(jìn)的DAG調(diào)度等機(jī)制的幫助下,Spark可以用更快速度處理相同的數(shù)據(jù)集。
Spark的另一個重要優(yōu)勢在于多樣性。該產(chǎn)品可作為獨(dú)立集群部署,或與現(xiàn)有Hadoop集群集成。該產(chǎn)品可運(yùn)行批處理和流處理,運(yùn)行一個集群即可處理不同類型的任務(wù)。
除了引擎自身的能力外,圍繞Spark還建立了包含各種庫的生態(tài)系統(tǒng),可為機(jī)器學(xué)習(xí)、交互式查詢等任務(wù)提供更好的支持。相比MapReduce,Spark任務(wù)更是“眾所周知”地易于編寫,因此可大幅提高生產(chǎn)力。
為流處理系統(tǒng)采用批處理的方法,需要對進(jìn)入系統(tǒng)的數(shù)據(jù)進(jìn)行緩沖。緩沖機(jī)制使得該技術(shù)可以處理非常大量的傳入數(shù)據(jù),提高整體吞吐率,但等待緩沖區(qū)清空也會導(dǎo)致延遲增高。這意味著Spark Streaming可能不適合處理對延遲有較高要求的工作負(fù)載。
由于內(nèi)存通常比磁盤空間更貴,因此相比基于磁盤的系統(tǒng),Spark成本更高。然而處理速度的提升意味著可以更快速完成任務(wù),在需要按照小時數(shù)為資源付費(fèi)的環(huán)境中,這一特性通??梢缘窒黾拥某杀?。
Spark內(nèi)存計算這一設(shè)計的另一個后果是,如果部署在共享的集群中可能會遇到資源不足的問題。相比Hadoop MapReduce,Spark的資源消耗更大,可能會對需要在同一時間使用集群的其他任務(wù)產(chǎn)生影響。從本質(zhì)來看,Spark更不適合與Hadoop堆棧的其他組件共存一處。
總結(jié)
Spark是多樣化工作負(fù)載處理任務(wù)的最佳選擇。Spark批處理能力以更高內(nèi)存占用為代價提供了無與倫比的速度優(yōu)勢。對于重視吞吐率而非延遲的工作負(fù)載,則比較適合使用Spark Streaming作為流處理解決方案。
Apache Flink
Apache Flink是一種可以處理批處理任務(wù)的流處理框架。該技術(shù)可將批處理數(shù)據(jù)視作具備有限邊界的數(shù)據(jù)流,借此將批處理任務(wù)作為流處理的子集加以處理。為所有處理任務(wù)采取流處理為先的方法會產(chǎn)生一系列有趣的副作用。
這種流處理為先的方法也叫做Kappa架構(gòu),與之相對的是更加被廣為人知的Lambda架構(gòu)(該架構(gòu)中使用批處理作為主要處理方法,使用流作為補(bǔ)充并提供早期未經(jīng)提煉的結(jié)果)。Kappa架構(gòu)中會對一切進(jìn)行流處理,借此對模型進(jìn)行簡化,而這一切是在最近流處理引擎逐漸成熟后才可行的。
流處理模型
Flink的流處理模型在處理傳入數(shù)據(jù)時會將每一項視作真正的數(shù)據(jù)流。Flink提供的DataStream API可用于處理無盡的數(shù)據(jù)流。Flink可配合使用的基本組件包括:
Stream(流)是指在系統(tǒng)中流轉(zhuǎn)的,永恒不變的無邊界數(shù)據(jù)集 Operator(操作方)是指針對數(shù)據(jù)流執(zhí)行操作以產(chǎn)生其他數(shù)據(jù)流的功能 Source(源)是指數(shù)據(jù)流進(jìn)入系統(tǒng)的入口點(diǎn) Sink(槽)是指數(shù)據(jù)流離開Flink系統(tǒng)后進(jìn)入到的位置,槽可以是數(shù)據(jù)庫或到其他系統(tǒng)的連接器
為了在計算過程中遇到問題后能夠恢復(fù),流處理任務(wù)會在預(yù)定時間點(diǎn)創(chuàng)建快照。為了實(shí)現(xiàn)狀態(tài)存儲,F(xiàn)link可配合多種狀態(tài)后端系統(tǒng)使用,具體取決于所需實(shí)現(xiàn)的復(fù)雜度和持久性級別。
此外Flink的流處理能力還可以理解“事件時間”這一概念,這是指事件實(shí)際發(fā)生的時間,此外該功能還可以處理會話。這意味著可以通過某種有趣的方式確保執(zhí)行順序和分組。
批處理模型
Flink的批處理模型在很大程度上僅僅是對流處理模型的擴(kuò)展。此時模型不再從持續(xù)流中讀取數(shù)據(jù),而是從持久存儲中以流的形式讀取有邊界的數(shù)據(jù)集。Flink會對這些處理模型使用完全相同的運(yùn)行時。
Flink可以對批處理工作負(fù)載實(shí)現(xiàn)一定的優(yōu)化。例如由于批處理操作可通過持久存儲加以支持,F(xiàn)link可以不對批處理工作負(fù)載創(chuàng)建快照。數(shù)據(jù)依然可以恢復(fù),但常規(guī)處理操作可以執(zhí)行得更快。