您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Storm是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Storm是什么
如果只用一句話來描述storm的話,可能會是這樣:分布式實(shí)時計算系統(tǒng)。按照storm作者的說法,storm對于實(shí)時計算的意義類似于 hadoop對于批處理的意義。我們都知道,根據(jù)google mapreduce來實(shí)現(xiàn)的hadoop為我們提供了map, reduce原語,使我們的批處理程序變得非常地簡單和優(yōu)美。同樣,storm也為實(shí)時計算提供了一些簡單優(yōu)美的原語。
我們來看一下storm的適用場景。
1、流數(shù)據(jù)處理。 Storm可以用來處理源源不斷流進(jìn)來的消息,處理之后將結(jié)果寫入到某個存儲中去。
2、持續(xù)計算。連續(xù)發(fā)送數(shù)據(jù)到客戶端,使它們能夠?qū)崟r更新并顯示結(jié)果,如網(wǎng)站指標(biāo)。
3、分布式rpc。由于storm的處理組件是分布式的,而且處理延遲極低,所以可以作為一個通用的分布式rpc框架來使用。當(dāng)然,其實(shí)我們的搜索引擎本身也是一個分布式rpc系統(tǒng)。
Storm特點(diǎn)
Storm是一個開源的分布式實(shí)時計算系統(tǒng),可以簡單、可靠的處理大量的數(shù)據(jù)流。Storm有很多使用場景:如實(shí)時分析,在線機(jī)器學(xué)習(xí),持續(xù)計算,分布式RPC,ETL等等。Storm支持水平擴(kuò)展,具有高容錯性,保證每個消息都會得到處理,而且處理速度很快(在一個小集群中,每個結(jié)點(diǎn)每秒可以處理數(shù)以百萬計的消息)。 Storm的部署和運(yùn)維都很便捷,而且更為重要的是可以使用任意編程語言來開發(fā)應(yīng)用。
Storm集群架構(gòu):
Nimbus主節(jié)點(diǎn):
主節(jié)點(diǎn)通常運(yùn)行一個后臺程序 —— Nimbus,用于響應(yīng)分布在集群中的節(jié)點(diǎn),分配任務(wù)和監(jiān)測故障。這個很類似亍Hadoop中的Job Tracker。
Supervisor工作節(jié)點(diǎn):
工作節(jié)點(diǎn)同樣會運(yùn)行一個后臺程序 —— Supervisor,用于收聽工作指派并基于要求運(yùn)行工作進(jìn)程。每個工作節(jié)點(diǎn)都是topology中一個子集的實(shí)現(xiàn)。而Nimbus和Supervisor之間的協(xié)調(diào)則通過Zookeeper系統(tǒng)或者集群。
Zookeeper
Zookeeper是完成Supervisor和Nimbus之間協(xié)調(diào)的服務(wù)。而應(yīng)用程序?qū)崿F(xiàn)實(shí)時的邏輯則被封裝進(jìn)Storm中的"topology"。topology則是一組由Spouts(數(shù)據(jù)源)和Bolts(數(shù)據(jù)操作)通過Stream Groupings進(jìn)行連接的圖。
Topology(拓?fù)洌?
storm中運(yùn)行的一個實(shí)時應(yīng)用程序,因?yàn)楦鱾€組件間的消息流勱形成邏輯上的一個拓?fù)浣Y(jié)構(gòu)。一個topology是spouts和bolts組成的圖, 通過stream groupings將圖中的spouts和bolts連接起來,如下圖:
一個topology會一直運(yùn)行直到你手動kill掉,Storm自動重新分配執(zhí)行失敗的任務(wù),并且Storm可以保證你不會有數(shù)據(jù)丟失(如果開啟了高可靠性的話)。如果一些機(jī)器意外停機(jī)它上面的所有任務(wù)會被轉(zhuǎn)移到其他機(jī)器上。
運(yùn)行一個topology很簡單。首先,把你所有的代碼以及所依賴的jar打進(jìn)一個jar包。然后運(yùn)行類似下面的這個命令:
storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2
這個命令會運(yùn)行主類: backtype.strom.MyTopology, 參數(shù)是arg1, arg2。這個類的main函數(shù)定義這個topology并且把它提交給Nimbus。 storm jar負(fù)責(zé)連接到Nimbus并且上傳jar包。
Topology的定義是一個Thrift結(jié)構(gòu),并且Nimbus就是一個Thrift服務(wù), 你可以提交由任何語言創(chuàng)建的topology。上面的是用JVM-based語言提交的最簡單的方法。
Tuple
storm使用tuple來作為它的數(shù)據(jù)模型。每個tuple是一堆值,每個值有一個名字,并且每個值可以是任何類型, 在我的理解里面一個tuple可以看作一個沒有方法的java對象??傮w來看,storm支持所有的基本類型、字符串以及字節(jié)數(shù)組作為tuple的值類型。你也可以使用你自己定義的類型來作為值類型, 只要你實(shí)現(xiàn)對應(yīng)的序列化器(serializer)。
一個Tuple代表數(shù)據(jù)流中的一個基本的處理單元,例如一條cookie日志,它可以包含多個Field,每個Field表示一個屬性。
Tuple本來應(yīng)該是一個Key-Value的Map,由于各個組件間傳遞的tuple的字段名稱已經(jīng)事先定義好了,所以Tuple只需要按序填入各個Value,所以就是一個Value List。
一個沒有邊界的、源源不斷的、連續(xù)的Tuple序列就組成了Stream。
Stream
Stream是storm里面的關(guān)鍵抽象。一個stream是一個沒有邊界的tuple序列。 storm提供一些原語來分布式地、可靠地把一個stream傳輸進(jìn)一個新的stream。比如: 你可以把一個tweets流傳輸?shù)綗衢T話題的流。
storm提供的最基本的處理stream的原語是spout和bolt。你可以實(shí)現(xiàn)Spout和Bolt對應(yīng)的接口以處理你的應(yīng)用的邏輯
Spout
消息源spout是Storm里面一個topology里面的消息生產(chǎn)者,簡而言之,Spout從來源處讀取數(shù)據(jù)并放入topology。 spout是流的源頭。 比如一個spout可能從Kestrel隊(duì)列里面讀取消息并且把這些消息發(fā)射成一個流。又比如一個spout可以調(diào)用twitter的一個api并且把返回的tweets發(fā)射成一個流。
通常Spout會從外部數(shù)據(jù)源(隊(duì)列、數(shù)據(jù)庫等)讀取數(shù)據(jù),然后封裝成Tuple形式,之后發(fā)送到Stream中。 Spout是一個主動的角色,在接口內(nèi)部有個nextTuple函數(shù),Storm框架會不停的調(diào)用該函數(shù)。
Bolt
Topology中所有的處理都由Bolt完成。即所有的消息處理邏輯被封裝在bolts里面。 Bolt可以完成任何事,比如:連接的過濾、聚合、訪問文件/數(shù)據(jù)庫、等等。
Bolt處理輸入的Stream,并產(chǎn)生新的輸出Stream。 Bolt可以執(zhí)行過濾、函數(shù)操作、 Join、操作數(shù)據(jù)庫等任何操作。 Bolt是一個被動的角色,其接口中有一個execute(Tuple input)方法,在接收到消息后會調(diào)用此函數(shù),用戶可以在此方法中執(zhí)行自己的處理邏輯。
Bolt從Spout中接收數(shù)據(jù)并進(jìn)行處理,如果遇到復(fù)雜流的處理也可能將tuple發(fā)送給另一個Bolt進(jìn)行處理。即需要經(jīng)過很多blots。比如算出一堆圖片里面被轉(zhuǎn)發(fā)最多的圖片就至少需要兩步:第一步算出每個圖片的轉(zhuǎn)發(fā)數(shù)量。第二步找出轉(zhuǎn)發(fā)最多的前10個圖片。(如果要把這個過程做得更具有擴(kuò)展性那么可能需要更多的步驟)。
Stream Groupings
Stream Grouping定義了一個流在Bolt任務(wù)間該如何被切分。 這里有storm提供的7個Stream Grouping類型:
1)隨機(jī)分組(Shuffle grouping):隨機(jī)分發(fā)tuple到Bolt的任務(wù),保證每個任務(wù)獲得相等數(shù)量的tuple。
2)字段分組(Fields grouping):根據(jù)指定字段分割數(shù)據(jù)流,并分組。例如,根據(jù)“user-id”字段,相同“user-id”的元組總是分發(fā)到同一個任務(wù),不同“user-id”的元組可能分發(fā)到不同的任務(wù)。
3)全部分組(All grouping):tuple被復(fù)制到bolt的所有任務(wù)。這種類型需要謹(jǐn)慎使用。
4)全局分組(Global grouping):全部流都分配到bolt的同一個任務(wù)。明確地說,是分配給ID最小的那個task。
5)無分組(None grouping):你不需要關(guān)心流是如何分組。目前,無分組等效于隨機(jī)分組。但最終,Storm將把無分組的Bolts放到Bolts或Spouts訂閱它們的同一線程去執(zhí)行(如果可能)。
6)直接分組(Direct grouping):這是一個特別的分組類型。元組生產(chǎn)者決定tuple由哪個元組處理者任務(wù)接收。
7) 本地或隨機(jī)分組(Local or shuffle grouping):如果目標(biāo)bolt有一個或多個任務(wù)在同一個的worker進(jìn)程中,tuples會隨機(jī)發(fā)送給這些任務(wù)。否則,就和普通的隨機(jī)分組一樣。
當(dāng)然還可以實(shí)現(xiàn)CustomStreamGroupimg接口來定制自己需要的分組。
運(yùn)行中的Topology主要由以下三個組件組成的:
Worker processes(進(jìn)程)
Executors (threads)(線程)
Tasks
Worker:運(yùn)行具體處理組件邏輯的進(jìn)程。一個Topology可能會在一個或者多個Worker(工作進(jìn)程)里面執(zhí)行,每個worker是一個物理JVM并且執(zhí)行整個Topology的一部分。storm會盡量均勻地將工作分配給所有的worker
executor:每個execcutor對應(yīng)一個線程。1個executor是1個worker進(jìn)程生成的1個線程。它可能運(yùn)行著1個相同的組件(spout或bolt)的1個或多個task
Task:每個Spout或者Bolt會被當(dāng)做很多task在整個集群中運(yùn)行,在executor這個線程中運(yùn)行一個或多個task
“Storm是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。