大數(shù)據(jù)流計算之三S演義:Storm、Spark、Samza

責(zé)任編輯:editor004

2015-03-13 14:02:39

摘自:TechTarget中國

現(xiàn)如今,實時或近實時處理大數(shù)據(jù)的分布式計算系統(tǒng)的確有不少。至少送達(dá)一次(使用Trident接口能實現(xiàn)精確一次) 有且只有一次(某些發(fā)生故障的場景除外) 至少送達(dá)一次

現(xiàn)如今,實時或近實時處理大數(shù)據(jù)的分布式計算系統(tǒng)的確有不少。本文對來自Apache的三個處理框架進(jìn)行一個簡短的描述,并從整體上對它們進(jìn)行快速的比較,了解它們的相似和差異點。

Apache Storm

在Storm中,用戶需設(shè)計一個實時計算圖,即拓?fù)洌═opology),并將其部署到集群上。Storm集群的主節(jié)點會將代碼分發(fā)至工作節(jié)點來執(zhí)行該拓?fù)洹T谝粋€拓?fù)渲?,?shù)據(jù)流以只讀Key-Value對集合的形式存在,稱之為元組(Tuple),數(shù)據(jù)流通過Spout形成元組,Bolt對元組進(jìn)行變換(如聚合、過濾等)。另外, Bolt可以串聯(lián)起來,以處理流水線的形式將數(shù)據(jù)傳遞到下一個Bolt。

Apache Spark

Spark Streaming(一個基于Spark核心接口的擴(kuò)展項目)并不是像Storm那樣,一次處理一個數(shù)據(jù)流。取而代之地,Spark Streaming在處理前將數(shù)據(jù)流進(jìn)行分片,按照時間間隔形成小的批處理任務(wù)。對于持續(xù)數(shù)據(jù)流的抽象,Spark稱之為DStream(即Discretized Stream,離散數(shù)據(jù)流)。一個DStream是一個由RDD(ResilientDistributed Datasets,彈性分布式數(shù)據(jù)集)構(gòu)成的微批處理任務(wù)。RDD是一個分布式集合,對其可以進(jìn)行多種并行函數(shù)操作、指定時間窗口內(nèi)的數(shù)據(jù)轉(zhuǎn)換操作(窗口計算)等。

Apache Samza

Samza的流計算處理策略是,對接收到的消息逐一、即時處理。Samza的流計算原語并非是上文中提到的元組(Tuple)或離散數(shù)據(jù)流(DStream),而稱之為消息(Message)。數(shù)據(jù)流被分成多個分片(Partition),每個分片是由多個只讀消息構(gòu)成的有序序列,其中每條消息會有一個唯一標(biāo)識,即偏移量(Offset)。Samza同樣支持批處理任務(wù)(Batching),比如對同一個數(shù)據(jù)流分片中的若干條消息進(jìn)行消費。Samza的執(zhí)行引擎和流處理模塊均是插件化可插拔的,Samza通常依賴于Hadoop的YARN(Yet Another Resource Negotiator,另一個資源協(xié)調(diào)器)組件和Apache Kafka項目。

共同點

以上三種實時計算系統(tǒng)均是開源、低延遲、分布式、可擴(kuò)展以及容錯的。它們具有并行執(zhí)行流處理任務(wù)的功能,并將任務(wù)分布到計算集群中,提供故障切換的能力。而且,他們均提供簡單接口,對底層復(fù)雜的實現(xiàn)進(jìn)行了抽象和封裝。

三個框架使用了不同的術(shù)語來描述類似的概念:

Apache

Storm

Spark

Samza

流式數(shù)據(jù)數(shù)據(jù)源(S)

Spouts

Receivers

Consumers

流式數(shù)據(jù)原語(P)

Tuple

DStream

Message

流計算(C)

Bolts

變換(Tranformations)

窗口操作(Window Operations)

任務(wù)(Tasks)

對比

下表總結(jié)了三個系統(tǒng)的一些不同點:

Apache

Storm

Spark

Samza

送達(dá)語義

至少送達(dá)一次(使用Trident接口能實現(xiàn)精確一次)

有且只有一次(某些發(fā)生故障的場景除外)

至少送達(dá)一次

狀態(tài)管理

無狀態(tài)管理(自行實現(xiàn)或使用Trident接口)

有狀態(tài)管理(將狀態(tài)持久化到存儲中)

有狀態(tài)管理(內(nèi)置Key-Value存儲)

延遲

亞秒級

秒級(依賴于批處理大?。?/p>

亞秒級

語言支持

JVM語言,Ruby,Python,Javascript,Perl

 

Scala,Java,Python

僅支持JVM語言(如Scala,Java)

關(guān)于送達(dá)模式,通常有以下三類:

1. 至多送達(dá)一次:消息可能丟失。這通常不是想要的結(jié)果。

2. 至少送達(dá)一次:消息可能會被多次投遞(無丟失,但可能重復(fù))。對于許多應(yīng)用場景不錯。

3. 有且只有一次:每條消息只會投遞一次(無丟失,無重復(fù))。這是一個理想的結(jié)果,但很多場景均難以保證。

需要注意的另一方面是關(guān)于狀態(tài)管理(state management)的。對于狀態(tài)的存儲是有不同策略的。Spark Streaming將數(shù)據(jù)寫到分布式文件系統(tǒng)上(如HDFS)。Samza使用內(nèi)置的Key-Value存儲。而Storm,則要么在用戶應(yīng)用層對自身的狀態(tài)進(jìn)行管理,要么使用更高的接口抽象即Trident。

用例

以上三種框架均是高效處理持續(xù)化、海量實時數(shù)據(jù)的不錯之選。三者選其一怎么選呢?這并無定規(guī),有幾條意見僅供參考。

如果你想要一個能夠支持增量計算的高速事件處理系統(tǒng),Storm是不錯的選擇。如果你的進(jìn)一步需求是按需進(jìn)行分布式計算,而客戶端會同步等待結(jié)果的返回,那么分布式RPC(RPC)開箱即用,效果不錯。最后一條也是重要的一條是Storm使用了Apache Thrift庫,你可以使用任何語言來寫拓?fù)?。如果你需要對狀態(tài)進(jìn)行持久化或者要求有且只有一次的送達(dá)保證,那么就看一看更高層次的接口Trident,該接口提供微批處理(micro-batching)的功能。

使用Storm框架的公司有:Twitter,雅虎,Spotify,The Weather Channel等。

提到微批處理,如果你要求內(nèi)置狀態(tài)管理的計算、有且只有一次的送達(dá)保證、并不在意稍微高一些的延遲,那么應(yīng)當(dāng)考慮Spark Streaming。尤其是你打算做圖計算、機(jī)器學(xué)習(xí)或使用SQL接口,Spark Streaming是不錯的選擇。Apache Spark軟件棧支持將流計算與多種庫(如Spark SQL、MLlib、GraphX)結(jié)合,并提供方便統(tǒng)一的編程模型。有必要指出的一點是流計算算法(如K-means算法)能夠使用Spark實時地加速決策。

使用Spark的公司有:亞馬遜,雅虎,NASA JPL,eBay,百度等。

如果你有大量的狀態(tài)需要處理(如每個分片多達(dá)幾個GB),Samza能夠?qū)⒋鎯吞幚肀M可能的集中到同一機(jī)器上,進(jìn)而允許即使在狀態(tài)超出內(nèi)存的情況下也能正常工作。該框架還提供可插拔的API以提高其靈活性:其默認(rèn)的執(zhí)行引擎、消息隊列和存儲引擎均可被按照用戶想法進(jìn)行替換。此外,如果你的應(yīng)用場景是不同的團(tuán)隊使用不同的代碼來處理大量的數(shù)據(jù),Samza的粗粒度任務(wù)特性則特別適合,因為他們可以在連鎖反應(yīng)最小化的前提下進(jìn)行添加或刪除。

使用Samza的公司有:LinkedIn,Intuit,Metamarkets,Quantiply,F(xiàn)ortscale等。結(jié)語

對于三個頂級的Apache項目,本文僅作淺嘗輒止。并未對它們的大量特性和不同之處做進(jìn)一步描述。不過,一定要記得上面的比較是有局限性的,因為這些系統(tǒng)會一直演化和進(jìn)步。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號