王潤(rùn)華 毋建軍 侯佳路
北京政法職業(yè)學(xué)院信息技術(shù)系
分布式實(shí)時(shí)計(jì)算引擎
——Storm研究
王潤(rùn)華 毋建軍 侯佳路
北京政法職業(yè)學(xué)院信息技術(shù)系
王潤(rùn)華(1978)女,碩士,講師,研究方向?yàn)橐苿?dòng)互聯(lián)網(wǎng)方向。
本文介紹了一種分布式實(shí)時(shí)計(jì)算引擎——Storm,它具有簡(jiǎn)單、高性能、高可靠、可伸縮等特點(diǎn),并且支持廣泛的編程語(yǔ)言。本文不僅介紹了Storm的架構(gòu)和特性,還結(jié)合實(shí)例演示了使用Strom進(jìn)行實(shí)時(shí)計(jì)算的具體過(guò)程。
過(guò)去十年在數(shù)據(jù)處理(data processing)領(lǐng)域發(fā)生了一場(chǎng)革命,MapReduce,Hadoop和其他相關(guān)技術(shù)的出現(xiàn),已經(jīng)使數(shù)據(jù)處理系統(tǒng)的存儲(chǔ)能力、計(jì)算能力、伸縮能力達(dá)到了之前無(wú)法想象的高度。但是遺憾的是這些技術(shù)是“批處理系統(tǒng)”而不是實(shí)時(shí)系統(tǒng),實(shí)時(shí)性也不是這些系統(tǒng)所關(guān)心的,然而業(yè)界對(duì)實(shí)時(shí)處理海量數(shù)據(jù)的需求卻越來(lái)越強(qiáng)烈,Storm的出現(xiàn)填補(bǔ)了數(shù)據(jù)處理生態(tài)系統(tǒng)(data processing ecosystem)在實(shí)時(shí)方面的空白。
對(duì)于實(shí)時(shí)處理,典型的傳統(tǒng)方式是手工建立一個(gè)由queues和workers組成的網(wǎng)絡(luò)。workers處理來(lái)自queue的messages,更新數(shù)據(jù)庫(kù)(或其他操作),然后生成新的messages發(fā)送給其他的queues做進(jìn)一步處理。這種方式有以下幾個(gè)問(wèn)題。
(1)繁瑣:需要花大量的時(shí)間去配置向哪里發(fā)送messages、部署workers、部署intermediate queues,真正涉及實(shí)時(shí)處理邏輯代碼所占的比例很小。
(2)脆弱:缺乏完善的故障容錯(cuò)(f aul ttolerance)機(jī)制,在程序運(yùn)行過(guò)程中需要確保每一個(gè)worker和queue都是正常運(yùn)行的。
(3)伸縮性差:系統(tǒng)運(yùn)行過(guò)程中當(dāng)message的吞吐量超過(guò)了單臺(tái)物理機(jī)的承載能力時(shí),就需要將數(shù)據(jù)分布到更多的機(jī)器上去處理,這需要手工重新配置workers以便可以將數(shù)據(jù)分發(fā)新增的機(jī)器上,這樣做不僅麻煩還極易出錯(cuò)。
雖然queues和workers方式在容錯(cuò)和伸縮方面有很大的缺陷,但是基于消息處理(message processing)的模型卻非常適合作為實(shí)時(shí)計(jì)算的基礎(chǔ)模型,Strom也使用基于消息處理(message processing)的基礎(chǔ)模型。
Storm具有如下幾個(gè)主要特點(diǎn):
極其廣泛的應(yīng)用場(chǎng)景;
良好的伸縮性;
無(wú)消息丟失保證;
穩(wěn)定與可維護(hù)性好;
良好的容錯(cuò)性;
支持廣泛的編程語(yǔ)言;
Storm集群
從表面上看Storm集群與Hadoop集群非常類似,Hadoop集群上運(yùn)行MapReduce任務(wù)而Storm集群運(yùn)行被稱為T(mén)opology的任務(wù),但MapReduce與Topology有著非常大的差別——最關(guān)鍵的一點(diǎn)是MapReduce任務(wù)最終會(huì)結(jié)束而Topology一直處理消息,直到被主動(dòng)結(jié)束。
Storm集群架構(gòu)如圖1所示,Storm集群由一個(gè)主節(jié)點(diǎn)(master node)和多個(gè)工作節(jié)點(diǎn)(worker node)組成。主節(jié)點(diǎn)上運(yùn)行著一個(gè)被稱為Nimbus的守護(hù)進(jìn)程,它負(fù)責(zé)在集群中部署代碼、為每個(gè)工作節(jié)點(diǎn)分派任務(wù)并監(jiān)控任務(wù)的執(zhí)行狀態(tài)。每個(gè)工作節(jié)點(diǎn)上也運(yùn)行著一個(gè)被稱為Supervisor的守護(hù)進(jìn)程,Supervisor監(jiān)聽(tīng)分派給該工作節(jié)點(diǎn)的任務(wù),并根據(jù)需要啟動(dòng)或關(guān)閉工作進(jìn)程(worker processes),每個(gè)工作進(jìn)程負(fù)責(zé)執(zhí)行一個(gè)Topology的子集;每個(gè)Topology由分布在多個(gè)工作節(jié)點(diǎn)上的多個(gè)工作進(jìn)程共同執(zhí)行。
Nimbus與Supervisors之間通過(guò)一個(gè)Zookeeper集群來(lái)進(jìn)行協(xié)調(diào)。Nimbus和Supervisor被設(shè)計(jì)為無(wú)狀態(tài)和快速失?。╢ail-fast)的,所有的狀態(tài)信息都保存在Zookeeper集群或本地磁盤(pán)中,這意味著Nimbus和Supervisor失敗退出或被結(jié)束后重新啟動(dòng)將不會(huì)丟失任何信息,這樣的設(shè)計(jì)使得Storm非常的穩(wěn)定。
Topology
前面提到Storm任務(wù)被稱為T(mén)opology,一個(gè)Topology實(shí)際上是一個(gè)由計(jì)算邏輯組成的“圖”,“圖”中每個(gè)節(jié)點(diǎn)包含計(jì)算邏輯,節(jié)點(diǎn)之間的連接指示數(shù)據(jù)如何在節(jié)點(diǎn)間傳播。Storm使用Thrift作為通信中間件,所以可以使用任何Thrift支持的語(yǔ)言來(lái)編寫(xiě)Topology。
圖1 Storm集群架構(gòu)
Stream
Stream是Storm的核心抽象概念。在Storm中消息被稱為元組(tuple),Stream就是一個(gè)數(shù)量無(wú)限的元組序列,Storm提供了一組原語(yǔ)可以以分布和可靠的方式將一個(gè)Stream傳播到另一個(gè)Stream,其中Spout和Bolt就其中兩個(gè)最基本的原語(yǔ),用戶程序通過(guò)實(shí)現(xiàn)Spout和Bolt的接口來(lái)定制自己的應(yīng)用邏輯。Spout是Stream的源,Bolt是一個(gè)或多個(gè)Stream的消費(fèi)者,做一些處理,也可能生成新的Stream。一個(gè)復(fù)雜的應(yīng)用往往需要多個(gè)步驟也就是多個(gè)Bolt,Bolt可以做非常多的事情,例如:運(yùn)行函數(shù)、元組過(guò)濾、Stream聚合、Stream join、與數(shù)據(jù)庫(kù)對(duì)話等。
由Spout和Bolt組成的網(wǎng)絡(luò)(圖)既是Topology,而圖中的邊則是Stream,Stream指示元組如何在Spout和Bolt間傳播。Topology中的每個(gè)節(jié)點(diǎn)(Spout或Bolt)都是并行執(zhí)行的,用戶可以指定每個(gè)節(jié)點(diǎn)的并行度,Storm便會(huì)產(chǎn)生相應(yīng)數(shù)量的子任務(wù)在集群上執(zhí)行。
前面提到Topology會(huì)一直處理消息,直到被主動(dòng)結(jié)束。Storm會(huì)重新分配失敗的任務(wù),此外Strom保證沒(méi)有消息會(huì)丟失,即使硬件出現(xiàn)故障。
數(shù)據(jù)模型
Strom使用消息即元組(tuple)作為數(shù)據(jù)模型,一個(gè)元組可以有多個(gè)字段(field),字段的類型可以是字符串或字節(jié)數(shù)組,通過(guò)一定的擴(kuò)展用戶也可以使用自定義的字段類型。
Stream grouping
Stream grouping告訴Topology如何在節(jié)點(diǎn)間傳輸元組。前面提到Spout和Bolt都是并行執(zhí)行的,如圖3所示,如果Bolt A需要向Bolt B發(fā)送元組,那么元組如何在Bolt A的子任務(wù)和Bolt B的子任務(wù)間傳播呢?傳播策略的不同在有些情況下可能會(huì)極大的影響計(jì)算結(jié)果,Stream grouping就是用來(lái)解決這個(gè)問(wèn)題的,我們將在Strom應(yīng)用實(shí)例部分進(jìn)行詳細(xì)的說(shuō)明。
圓圈代表Spout或Bolt的并行子任務(wù)
這里通過(guò)一個(gè)對(duì)單詞計(jì)數(shù)的Topol o gy(WordCountTopology)來(lái)演示Storm的具體應(yīng)用方法。代碼如圖4所示,該代碼摘自Storm自身的示例程序,并去掉了對(duì)說(shuō)明用法無(wú)關(guān)的細(xì)節(jié)。
圖2 Topology是由Spouts和Bolts組成的圖
圖3 Topology的執(zhí)行過(guò)程
圖4 WordCountTopology代碼
要實(shí)現(xiàn)一個(gè)Topology最主要的工作就是提供具體的Spout、Bolt (用戶的Spout和Bolt需要實(shí)現(xiàn)特定接口或繼承自已有的基類)和他們之間Stream grouping。WordCountTopology有一個(gè)Spout和兩個(gè)Bolt,Soput引用了已有的一個(gè)類RandomSentenceSpout來(lái)產(chǎn)生隨機(jī)的句子,Bolt SplitSentence將句子拆分成單詞,Bolt WordCount對(duì)單詞進(jìn)行統(tǒng)計(jì)。RandomSentenceSpout與SplitSentence之間的Stream grouping類型為Shuffle grouping,即子任務(wù)間任意傳播元組,而SplitSentence與WordCount間的Stream grouping類型為Fields grouping,即相同的單詞都傳輸給同一個(gè)子任務(wù),這對(duì)單詞統(tǒng)計(jì)的正確性是非常重要的。
Storm的出現(xiàn)填補(bǔ)了數(shù)據(jù)處理生態(tài)系統(tǒng)(d ata processing ecosystem)在實(shí)時(shí)方面的空白,同時(shí)Storm具有高可靠、伸縮性好、編程模型簡(jiǎn)單、支持廣泛的編程語(yǔ)言等特點(diǎn),極大的簡(jiǎn)化了分布式實(shí)時(shí)系統(tǒng)的開(kāi)發(fā)。
10.3969/j.issn.1001-8972.2015.06.027