Storm背后的想法是使用上述組件定義大量小型的離散操作,隨后將多個(gè)組件組成所需拓?fù)?。默認(rèn)情況下Storm提供了“至少一次”的處理保證,這意味著可以確保每條消息至少可以被處理一次,但某些情況下如果遇到失敗可能會(huì)處理多次。Storm無(wú)法確??梢园凑仗囟樞蛱幚硐?。
為了實(shí)現(xiàn)嚴(yán)格的一次處理,即有狀態(tài)處理,可以使用一種名為T(mén)rident的抽象。嚴(yán)格來(lái)說(shuō)不使用Trident的Storm通常可稱(chēng)之為Core Storm。Trident會(huì)對(duì)Storm的處理能力產(chǎn)生極大影響,會(huì)增加延遲,為處理提供狀態(tài),使用微批模式代替逐項(xiàng)處理的純粹流處理模式。
為避免這些問(wèn)題,通常建議Storm用戶盡可能使用Core Storm。然而也要注意,Trident對(duì)內(nèi)容嚴(yán)格的一次處理保證在某些情況下也比較有用,例如系統(tǒng)無(wú)法智能地處理重復(fù)消息時(shí)。如果需要在項(xiàng)之間維持狀態(tài),例如想要計(jì)算一個(gè)小時(shí)內(nèi)有多少用戶點(diǎn)擊了某個(gè)鏈接,此時(shí)Trident將是你唯一的選擇。盡管不能充分發(fā)揮框架與生俱來(lái)的優(yōu)勢(shì),但Trident提高了Storm的靈活性。
Trident拓?fù)浒?/strong>
流批(Stream batch):這是指流數(shù)據(jù)的微批,可通過(guò)分塊提供批處理語(yǔ)義。
操作(Operation):是指可以對(duì)數(shù)據(jù)執(zhí)行的批處理過(guò)程。
優(yōu)勢(shì)和局限
目前來(lái)說(shuō)Storm可能是近實(shí)時(shí)處理領(lǐng)域的最佳解決方案。該技術(shù)可以用極低延遲處理數(shù)據(jù),可用于希望獲得最低延遲的工作負(fù)載。如果處理速度直接影響用戶體驗(yàn),例如需要將處理結(jié)果直接提供給訪客打開(kāi)的網(wǎng)站頁(yè)面,此時(shí)Storm將會(huì)是一個(gè)很好的選擇。
Storm與Trident配合使得用戶可以用微批代替純粹的流處理。雖然借此用戶可以獲得更大靈活性打造更符合要求的工具,但同時(shí)這種做法會(huì)削弱該技術(shù)相比其他解決方案最大的優(yōu)勢(shì)。話雖如此,但多一種流處理方式總是好的。
Core Storm無(wú)法保證消息的處理順序。Core Storm為消息提供了“至少一次”的處理保證,這意味著可以保證每條消息都能被處理,但也可能發(fā)生重復(fù)。Trident提供了嚴(yán)格的一次處理保證,可以在不同批之間提供順序處理,但無(wú)法在一個(gè)批內(nèi)部實(shí)現(xiàn)順序處理。
在互操作性方面,Storm可與Hadoop的YARN資源管理器進(jìn)行集成,因此可以很方便地融入現(xiàn)有Hadoop部署。除了支持大部分處理框架,Storm還可支持多種語(yǔ)言,為用戶的拓?fù)涠x提供了更多選擇。
總結(jié)
對(duì)于延遲需求很高的純粹的流處理工作負(fù)載,Storm可能是最適合的技術(shù)。該技術(shù)可以保證每條消息都被處理,可配合多種編程語(yǔ)言使用。由于Storm無(wú)法進(jìn)行批處理,如果需要這些能力可能還需要使用其他軟件。如果對(duì)嚴(yán)格的一次處理保證有比較高的要求,此時(shí)可考慮使用Trident。不過(guò)這種情況下其他流處理框架也許更適合。
Apache Samza
Apache Samza是一種與Apache Kafka消息系統(tǒng)緊密綁定的流處理框架。雖然Kafka可用于很多流處理系統(tǒng),但按照設(shè)計(jì),Samza可以更好地發(fā)揮Kafka獨(dú)特的架構(gòu)優(yōu)勢(shì)和保障。該技術(shù)可通過(guò)Kafka提供容錯(cuò)、緩沖,以及狀態(tài)存儲(chǔ)。
Samza可使用YARN作為資源管理器。這意味著默認(rèn)情況下需要具備Hadoop集群(至少具備HDFS和YARN),但同時(shí)也意味著Samza可以直接使用YARN豐富的內(nèi)建功能。
流處理模式
Samza依賴Kafka的語(yǔ)義定義流的處理方式。Kafka在處理數(shù)據(jù)時(shí)涉及下列概念:
Topic(話題):進(jìn)入Kafka系統(tǒng)的每個(gè)數(shù)據(jù)流可稱(chēng)之為一個(gè)話題。話題基本上是一種可供消耗方訂閱的,由相關(guān)信息組成的數(shù)據(jù)流。
Partition(分區(qū)):為了將一個(gè)話題分散至多個(gè)節(jié)點(diǎn),Kafka會(huì)將傳入的消息劃分為多個(gè)分區(qū)。分區(qū)的劃分將基于鍵(Key)進(jìn)行,這樣可以保證包含同一個(gè)鍵的每條消息可以劃分至同一個(gè)分區(qū)。分區(qū)的順序可獲得保證。
Broker(代理):組成Kafka集群的每個(gè)節(jié)點(diǎn)也叫做代理。
Producer(生成方):任何向Kafka話題寫(xiě)入數(shù)據(jù)的組件可以叫做生成方。生成方可提供將話題劃分為分區(qū)所需的鍵。
Consumer(消耗方):任何從Kafka讀取話題的組件可叫做消耗方。消耗方需要負(fù)責(zé)維持有關(guān)自己分支的信息,這樣即可在失敗后知道哪些記錄已經(jīng)被處理過(guò)了。
由于Kafka相當(dāng)于永恒不變的日志,Samza也需要處理永恒不變的數(shù)據(jù)流。這意味著任何轉(zhuǎn)換創(chuàng)建的新數(shù)據(jù)流都可被其他組件所使用,而不會(huì)對(duì)最初的數(shù)據(jù)流產(chǎn)生影響。
優(yōu)勢(shì)和局限
乍看之下,Samza對(duì)Kafka類(lèi)查詢系統(tǒng)的依賴似乎是一種限制,然而這也可以為系統(tǒng)提供一些獨(dú)特的保證和功能,這些內(nèi)容也是其他流處理系統(tǒng)不具備的。