人們通常想知道類(lèi)似的系統(tǒng)如何比較。我們已盡全力將 Samza 的功能集與其他系統(tǒng)進(jìn)行對(duì)比。但是我們不是這些框架的專(zhuān)家,當(dāng)然我們也是完全有偏見(jiàn)的。如果我們有任何東西,請(qǐng)讓我們知道,我們會(huì)糾正。
Storm 和 Samza 是相當(dāng)相似的。兩個(gè)系統(tǒng)提供了許多相同的高級(jí)功能:分區(qū)流模型,分布式執(zhí)行環(huán)境,流處理 API,容錯(cuò),卡夫卡集成等。
Storm 和 Samza 對(duì)于類(lèi)似的概念使用不同的單詞:Storm 中的噴口類(lèi)似于 Samza 中的流消費(fèi)者,螺栓類(lèi)似于任務(wù),元組類(lèi)似于 Samza 中的消息。一些額外的構(gòu)建塊,如三叉戟,拓?fù)涞?,?Samza 中沒(méi)有直接的等價(jià)物。
Storm允許您選擇要處理郵件的保證級(jí)別:
Samza 還提供保證交貨 - 目前僅交貨至少一次,但計(jì)劃支持一次性語(yǔ)義。在每個(gè)流分區(qū)中,Samza 總是按照它們?cè)诜謪^(qū)中顯示的順序來(lái)處理消息,但不能保證在不同的輸入流或分區(qū)之間進(jìn)行排序。該模型允許 Samza 至少提供一次,而不需要祖先跟蹤的開(kāi)銷(xiāo)。在 Samza,使用最多的一次交付(即丟棄消息失?。⒉粫?huì)有性能優(yōu)勢(shì),這就是為什么我們不提供這種模式 - 消息傳遞總是得到保證。
此外,由于 Samza 從未在分區(qū)無(wú)序處理消息,所以更適合處理密鑰數(shù)據(jù)。例如,如果您有一個(gè)數(shù)據(jù)庫(kù)更新流 - 以后的更新可能會(huì)替代以前的更新,那么重新排序消息可能會(huì)改變最終結(jié)果。如果同一個(gè)密鑰的所有更新顯示在同一流分區(qū)中,則 Samza 能夠保證一致的狀態(tài)。
Storm 的較低級(jí)別的 API 不支持在流過(guò)程中管理狀態(tài)。螺栓可以保持內(nèi)存狀態(tài)(如果螺栓死了,則會(huì)丟失),或者可以調(diào)用遠(yuǎn)程數(shù)據(jù)庫(kù)來(lái)讀取和寫(xiě)入狀態(tài)。然而,拓?fù)渫ǔ?梢砸员瓤梢赃M(jìn)行遠(yuǎn)程數(shù)據(jù)庫(kù)的調(diào)用更高的速率來(lái)處理消息,因此對(duì)每個(gè)消息的遠(yuǎn)程調(diào)用迅速成為瓶頸。
作為其更高級(jí)別 Trident API 的一部分,Storm 提供自動(dòng)狀態(tài)管理。它將狀態(tài)保存在內(nèi)存中,并定期檢查它到遠(yuǎn)程數(shù)據(jù)庫(kù)(例如 Cassandra)以獲得持久性,因此遠(yuǎn)程數(shù)據(jù)庫(kù)調(diào)用的成本在多個(gè)處理的元組中進(jìn)行分?jǐn)?。通過(guò)在狀態(tài)旁邊維護(hù)元數(shù)據(jù),Trident 能夠?qū)崿F(xiàn)一次處理語(yǔ)義 - 例如,如果您計(jì)算事件,該機(jī)制允許計(jì)數(shù)器正確,即使機(jī)器故障并且元組被重播。
如果每個(gè)螺栓的狀態(tài)數(shù)量相當(dāng)小 - 也許小于100kB,Storm 的緩存和批處理狀態(tài)變化的方法效果很好。這使得它適合于跟蹤計(jì)數(shù)器,度量的最小值,最大值和平均值等。但是,如果您需要維護(hù)大量的狀態(tài),則這種方法本質(zhì)上會(huì)降低到每個(gè)處理的元組進(jìn)行數(shù)據(jù)庫(kù)調(diào)用,以及相關(guān)的性能成本。
薩馬對(duì)國(guó)家管理采取了完全不同的做法。每個(gè) Samza 任務(wù)都不包括使用遠(yuǎn)程數(shù)據(jù)庫(kù)進(jìn)行持久存儲(chǔ),而是包含位于同一機(jī)器上的嵌入式鍵值存儲(chǔ)。即使當(dāng)商店的內(nèi)容大于可用內(nèi)存時(shí),對(duì)此商店的讀寫(xiě)也非??臁?duì)此鍵值存儲(chǔ)的更改將復(fù)制到集群中的其他計(jì)算機(jī),以便如果一臺(tái)計(jì)算機(jī)已停止,則其運(yùn)行的任務(wù)的狀態(tài)可以在另一臺(tái)計(jì)算機(jī)上恢復(fù)。
通過(guò)在同一臺(tái)機(jī)器上共存存儲(chǔ)和處理,即使有大量的狀態(tài),Samza 也能夠?qū)崿F(xiàn)非常高的吞吐量。如果要執(zhí)行不僅僅是計(jì)數(shù)器的有狀態(tài)操作,這是必要的。例如,如果要執(zhí)行多個(gè)流的窗口連接,或者使用數(shù)據(jù)庫(kù)表(通過(guò)更改日志復(fù)制到Samza)加入流,或?qū)⒍鄠€(gè)相關(guān)消息分組到更大的消息中,則需要保持這么多狀態(tài)將狀態(tài)保持在本地的任務(wù)更為有效。
Samza 的狀態(tài)處理的局限性在于它目前不支持一次性語(yǔ)義 - 現(xiàn)在至少支持一次。但是我們正在努力修復(fù)這個(gè)問(wèn)題,請(qǐng)隨時(shí)關(guān)注更新。
風(fēng)暴的并行模式與 Samza 相似。兩種框架將處理分解成可以并行運(yùn)行的獨(dú)立任務(wù)。資源分配獨(dú)立于任務(wù)數(shù)量:一個(gè)小工作可以將單個(gè)進(jìn)程中的所有任務(wù)保存在單個(gè)計(jì)算機(jī)上; 大量工作可以在許多機(jī)器上將任務(wù)分散在許多過(guò)程中。
最大的區(qū)別是 Storm 在默認(rèn)情況下每個(gè)任務(wù)使用一個(gè)線(xiàn)程,而 Samza 使用單線(xiàn)程進(jìn)程(容器)。Samza 容器可能包含多個(gè)任務(wù),但只有一個(gè)線(xiàn)程依次調(diào)用每個(gè)任務(wù)。這意味著每個(gè)容器映射到一個(gè) CPU 核心,這使得資源模型更簡(jiǎn)單,并減少了在同一臺(tái)機(jī)器上運(yùn)行的其他任務(wù)的干擾。Storm 的多線(xiàn)程模型的優(yōu)點(diǎn)是可以以較不可預(yù)測(cè)的資源模型為代價(jià),更好地利用空閑機(jī)器上的多余容量。
Storm 支持動(dòng)態(tài)重新平衡,這意味著向拓?fù)涮砑痈嗟木€(xiàn)程或進(jìn)程,而無(wú)需重新啟動(dòng)拓?fù)浠蚣?。這是一個(gè)方便的功能,特別是在開(kāi)發(fā)過(guò)程中。我們沒(méi)有把它添加到 Samza:在哲學(xué)上,我們認(rèn)為這種變化應(yīng)該經(jīng)歷一個(gè)正常的配置管理過(guò)程(即版本控制,通知等),因?yàn)樗鼤?huì)影響生產(chǎn)性能。換句話(huà)說(shuō),作業(yè)的代碼和配置應(yīng)該完全重新創(chuàng)建集群的狀態(tài)。
當(dāng)使用具有 Trident 的事務(wù)性噴嘴(實(shí)現(xiàn)一次語(yǔ)義的要求)時(shí),并行性可能會(huì)降低。Trident 依賴(lài)于其輸入流中的全局排序,即排序流的所有分區(qū),而不僅僅是在一個(gè)分區(qū)內(nèi)。這意味著拓?fù)涞妮斎肓鞅仨毥?jīng)過(guò)單個(gè)噴口實(shí)例,有效地忽略了輸入流的劃分。這個(gè)噴口可能成為大容量流的瓶頸。在 Samza,所有的流處理是平行的 - 沒(méi)有這樣的阻塞點(diǎn)。
Storm 集群由運(yùn)行 Supervisor 守護(hù)程序的一組節(jié)點(diǎn)組成。主管守護(hù)進(jìn)程與運(yùn)行名為 Nimbus 守護(hù)進(jìn)程的單個(gè)主節(jié)點(diǎn)進(jìn)行通信。Nimbus 守護(hù)進(jìn)程負(fù)責(zé)在集群中分配工作和管理資源。有關(guān)詳細(xì)信息,請(qǐng)參閱 Storm's Tutorial 頁(yè)面。這與 YARN 非常相似;盡管 YARN 有一些更加全面的特征,旨在成為多框架,Nimbus 更好地與 Storm 集成。
雅虎 還發(fā)布了Storm-YARN。如這個(gè)雅虎 博客文章 所述,Storm-YARN 是一個(gè)封裝,在 YARN 網(wǎng)格內(nèi)啟動(dòng)了一個(gè)單一的 Storm 集群(與 Nimbus 和 Supervisors 完成)。
Storm 的 Nimbus 和 YARN 的 ResourceManager 之間以及 Storm 的主管和 YARN 的節(jié)點(diǎn)管理器之間有很多相似之處。作為 YARN 生態(tài)系統(tǒng)中一流的公民,Samza 應(yīng)該直接使用YARN,而不是編寫(xiě)自己的資源管理框架,或在 YARN 內(nèi)部運(yùn)行第二個(gè)資源管理框架。YARN 穩(wěn)定,采用,功能齊全,可與 Hadoop 進(jìn)行互操作。它還提供了一些很好的功能,如安全性(用戶(hù)驗(yàn)證),cgroup 進(jìn)程隔離等。
Samza 的 YARN 支持是可插拔的,因此如果愿意,您可以將其交換為不同的執(zhí)行框架。
Storm 是用 Java 和 Clojure 編寫(xiě)的,但對(duì)非 JVM 語(yǔ)言有很好的支持。它遵循類(lèi)似于 MapReduce Streaming 的模型:非 JVM 任務(wù)在單獨(dú)的進(jìn)程中啟動(dòng),數(shù)據(jù)被發(fā)送到其 stdin,并且從其 stdout 讀取輸出。
Samza 是用 Java 和 Scala 編寫(xiě)的。它是以多語(yǔ)言支持構(gòu)建的,但目前只支持 JVM 語(yǔ)言。
Storm 提供了代碼中拓?fù)涞慕#ǘ鄠€(gè)階段的處理圖)。Trident 還提供了一個(gè)更高級(jí)別的API,包括熟悉的關(guān)系類(lèi)運(yùn)算符,如過(guò)濾器,分組,聚合和連接。這意味著整個(gè)拓?fù)浣Y(jié)構(gòu)在一個(gè)地方被連線(xiàn),這具有代碼中記錄的優(yōu)點(diǎn),但是缺點(diǎn)是整個(gè)拓?fù)湫枰鳛橐粋€(gè)整體來(lái)開(kāi)發(fā)和部署。
在薩姆薩,每個(gè)工作都是一個(gè)獨(dú)立的實(shí)體。您可以在單個(gè)代碼庫(kù)中定義多個(gè)作業(yè),也可以使用不同的代碼庫(kù),使用不同的工作組來(lái)處理不同的作業(yè)。每個(gè)作業(yè)都被單獨(dú)部署,啟動(dòng)和停止。作業(yè)僅通過(guò)命名流進(jìn)行通信,您可以將作業(yè)添加到系統(tǒng)中,而不會(huì)影響任何其他作業(yè)。這使得 Samza 非常適合處理大型公司的數(shù)據(jù)流。
Samza 的方法可以在 Storm 中通過(guò)代理(如 Kafka )連接兩個(gè)獨(dú)立的拓?fù)鋪?lái)模擬。然而,Storm 的完全一次語(yǔ)義的實(shí)現(xiàn)只能在單個(gè)拓?fù)渲衅鹱饔谩?/p>
我們不能說(shuō) Storm 的成熟度,但是它擁有令人印象深刻的采納者,強(qiáng)大的功能,似乎正在積極發(fā)展。它與許多常見(jiàn)的消息系統(tǒng)(RabbitMQ,Kestrel,Kafka等)很好地集成。
雖然 Samza 建立在固體組件上,但是相當(dāng)不成熟。YARN 是相當(dāng)新的,但已經(jīng)在雅虎的3000多個(gè)節(jié)點(diǎn)集群上運(yùn)行,該項(xiàng)目正在由 Hortonworks 和 Cloudera 積極開(kāi)發(fā)。Kafka 擁有強(qiáng)大的頁(yè)面,近期日益普及。它也經(jīng)常用于 Storm。Samza 是在 LinkedIn 中使用的全新項(xiàng)目。我們的希望是別人會(huì)覺(jué)得有用,也可以采納。
Storm 使用 ZeroMQ 進(jìn)行螺栓之間的非持久通信,從而實(shí)現(xiàn)了極少延遲的元組傳輸。Samza 沒(méi)有等效的機(jī)制,并且總是將任務(wù)輸出寫(xiě)入流。
另一方面,當(dāng)一個(gè)螺栓嘗試使用 ZeroMQ 發(fā)送消息,并且消費(fèi)者不能足夠快地讀取消息時(shí),生產(chǎn)者流程中的 ZeroMQ 緩沖區(qū)開(kāi)始填滿(mǎn)消息。如果此緩沖區(qū)增長(zhǎng)太多,則可能會(huì)達(dá)到拓?fù)涞奶幚沓瑫r(shí),從而導(dǎo)致消息在噴口處重新發(fā)出,并通過(guò)向緩沖區(qū)添加更多消息使問(wèn)題更糟。為了防止這種溢出,您可以隨時(shí)在拓?fù)渲信渲米疃嗫赡茉陲w行中的消息; 當(dāng)達(dá)到該閾值時(shí),噴口阻塞,直到飛行中的某些消息被完全處理。這種機(jī)制允許背壓,但需要仔細(xì)配置拓?fù)?。如果拓?fù)渲械膯蝹€(gè)螺栓開(kāi)始運(yùn)行緩慢,
在嘗試處理容錯(cuò)和消息傳遞語(yǔ)義時(shí),螺栓之間缺乏經(jīng)紀(jì)人也增加了復(fù)雜性。Storm 具有檢測(cè)未被處理的元組的聰明機(jī)制,但 Samza 不需要這樣的機(jī)制,因?yàn)槊總€(gè)輸入和輸出流都是容錯(cuò)和復(fù)制的。
Samza 采取不同的緩沖方法。我們?cè)?StreamTask 之間的每一跳緩沖到磁盤(pán)。比較介紹頁(yè)面詳細(xì)描述了這一決定及其權(quán)衡。這種設(shè)計(jì)決策使得耐久性保證容易,并且具有允許緩沖器在其處理中已經(jīng)落后的情況下吸收大量積壓的消息的優(yōu)點(diǎn)。然而,它的延遲稍微更高的代價(jià)。
如上面的工作流程部分所述,Samza 的方法可以在 Storm 中模擬,但功能上會(huì)丟失。
Storm 提供標(biāo)準(zhǔn)的 UNIX 進(jìn)程級(jí)隔離。如果使用太多的 CPU,磁盤(pán),網(wǎng)絡(luò)或內(nèi)存,您的拓?fù)淇赡軙?huì)影響另一個(gè)拓?fù)涞男阅埽ǚ粗嗳唬?/p>
Samza 依靠 YARN 提供資源級(jí)隔離。目前,YARN 為內(nèi)存和 CPU 限制(通過(guò)cgroups)提供了明確的控制,并且都已經(jīng)成功地與 Samza 一起使用。目前,YARN 不提供磁盤(pán)或網(wǎng)絡(luò)的隔離。
在風(fēng)暴中,您可以編寫(xiě)不僅接受固定事件流的拓?fù)?,還可以讓客戶(hù)端按需運(yùn)行分布式計(jì)算。該查詢(xún)作為特殊口上的元組發(fā)送到拓?fù)渲?,?dāng)拓?fù)溆?jì)算出答案時(shí),它將返回給客戶(hù)端(誰(shuí)同步等待答案)。該工具稱(chēng)為分布式RPC(DRPC)。
Samza 目前沒(méi)有與 DRPC 相同的 API,但您可以使用 Samza 的流處理原語(yǔ)自行構(gòu)建它。
Storm 將所有消息作為具有定義的數(shù)據(jù)模型的元組,但是可插入序列化。
Samza 的序列化和數(shù)據(jù)模型都是可插拔的。我們對(duì)于哪種方法是最好的并不是非常愚蠢的。
更多建議: