參考文章:
Nimbus和Supervisor
Strom集群中有一個主控節(jié)點和一個工作節(jié)點册舞。主控節(jié)點中運行一個叫"Nimbus"的守護進程匀奏;而工作節(jié)點中運行一個"Supervisor"的守護進程破加。
Nimbus主控節(jié)點
Nimbus是作為調(diào)度器角色鸳玩,它負責在集群內(nèi)分發(fā)代碼菲盾,為每個工作結(jié)點指派任務和監(jiān)控失敗的任務磺芭;用于響應分布在集群中的節(jié)點婴噩,分配任務和監(jiān)測故障骆撇。這個很類似于Hadoop中的Job Tracker瞒御。
Supervisor工作結(jié)點
Supervisor 作為worker的代理角色,用于收聽工作(Worker)指派并基于要求運行工作進程神郊。每個工作節(jié)點都是topology中一個子集的實現(xiàn)肴裙。而Nimbus和Supervisor之間的協(xié)調(diào)則通過Zookeeper系統(tǒng)或者集群
Zookeeper
zookeeper作為整個系統(tǒng)的協(xié)調(diào)者趾唱,協(xié)調(diào)Supervisor和Nimbus之間的服務。Nimbus和Supervisor之間的所有協(xié)調(diào)工作都是通過一個Zookeeper集群來完成蜻懦。并且甜癞,nimbus進程和supervisor都是快速失敗(fail-fast)和無狀態(tài)的宛乃。所有的狀態(tài)要么在Zookeeper里面悠咱,要么在本地磁盤上。這也就意味著你可以用kill-9來殺死nimbus和supervisor進程征炼,然后再重啟它們析既,它們可以繼續(xù)工作,就好像什么都沒有發(fā)生過似的谆奥。這個設計使得storm不可思議的穩(wěn)定眼坏。
Topology拓撲的構(gòu)成
1、Storm 分布式計算結(jié)構(gòu)稱為 topology(拓撲)雄右,由 stream(數(shù)據(jù)流)空骚,spout(數(shù)據(jù)流的生成者), bolt(運算)組成擂仍。各個組件間的消息流動形成邏輯上的一個拓撲結(jié)構(gòu)囤屹。
2、一個topology是spouts和bolts組成的圖逢渔, 通過streamgroupings將圖中的spouts和bolts連接起來肋坚。
3、Storm topology 大致等同與 Hadoop 這類批處理運算中的 job肃廓。然而智厌,批處理運算中的 job對運算的起始和終止有著明確定義, Stormtopology 會一直運行下去盲赊,除非進程被殺死或被取消部署
Tuple
1 铣鹏、storm使用tuple來作為它的數(shù)據(jù)模型。
2哀蘑、tuple是 包 含 了 一 個 或 者 多 個 鍵 值 對 的 列 表诚卸;每個值有一個名字,并且每個值可以是任何類型绘迁, 在我的理解里面一個tuple可以看作一個沒有方法的java對象合溺。總體來看缀台,storm支持所有的基本類型棠赛、字符串以及字節(jié)數(shù)組作為tuple的值類型。你也可以使用你自己定義的類型來作為值類型, 只要你實現(xiàn)對應的序列化器(serializer)睛约。
3鼎俘、一個Tuple代表數(shù)據(jù)流中的一個基本的處理單元,例如一條cookie日志痰腮,它可以包含多個Field而芥,每個Field表示一個屬性
4、Tuple本來應該是一個Key-Value的Map膀值,由于各個組件間傳遞的tuple的字段名稱已經(jīng)事先定義好了,所以Tuple只需要按序填入各個Value误辑,所以就是一個Value List沧踏。
Stream
1、Stream是storm里面的關鍵抽象巾钉。
2翘狱、一個沒有邊界的、源源不斷的砰苍、連續(xù)的Tuple序列就組成了Stream
3潦匈、storm提供一些原語來分布式地、可靠地把一個stream傳輸進一個新的stream赚导。比如: 你可以
把一個tweets流傳輸?shù)綗衢T話題的流茬缩。
4、提供的最基本的處理stream的原語是spout和bolt吼旧。你可以實現(xiàn)Spout和Bolt對應的接口以處理你的應用的邏輯凰锡。
消息源頭Spout
1、是一個topology里面的消息生產(chǎn)者圈暗,充當采集器的角色掂为。
2、Spout會從外部數(shù)據(jù)源(隊列员串、數(shù)據(jù)庫等)讀取數(shù)據(jù)勇哗,然后封裝成Tuple形式,之后發(fā)送到Strea中寸齐。
3欲诺、Spout是一個主動的角色,在接口內(nèi)部有個nextTuple函數(shù)访忿,Storm框架會不停的調(diào)用該函數(shù)瞧栗。
4、開發(fā)一個 spout 的主要工作就是編寫代碼從數(shù)據(jù)源或者 API 消費數(shù)據(jù)海铆,而不會用來實現(xiàn)具體的業(yè)務邏輯迹恐。
Blot
1、Topology中所有的處理都由Bolt完成卧斟。即所有的消息處理邏輯(具體的業(yè)務邏輯)被封裝在bolts里面殴边。 Bolt可以完成任何事憎茂,比如:過濾 tuple、連接( join)和聚合操作( aggregation)锤岸、訪問文件/數(shù)據(jù)庫竖幔、等等。
2是偷、將一個或者多個Stream數(shù)據(jù)流作為輸入拳氢,對數(shù)據(jù)實施運算后,選擇性地輸出一個或者多個新的數(shù)據(jù)流Stream
3蛋铆、Bolt是一個被動的 角色馋评,其接口中有一個execute(Tuple input)方法,在接收到消息之后會調(diào)用此函數(shù)刺啦,用戶可以在此方法中執(zhí)行自己的處理邏輯留特。
4、如果遇到復雜流的處理也可能將tuple發(fā)送給另一個Bolt進行處理玛瘸。即在實時計算的項目中通常需要經(jīng)過很多blots蜕青。
Stream Groupings
Stream Grouping定義了一個流在Bolt任務間該如何被切分。 這里有storm提供的9個Stream Grouping類型
1糊渊、shuffleGrouping(隨機分組)
隨機分發(fā)tuple到Bolt的任務右核,保證每個任務獲得相等數(shù)量的tuple。
2再来、fieldsGrouping(字段分組)
根據(jù)指定字段分割數(shù)據(jù)流蒙兰,并分組。例如芒篷,根據(jù)"user-id"字段搜变,相同"user-id"的元組總是分發(fā)到同一個任務,不同“ user-id”的元組可能分發(fā)到不同的任務针炉。
原理是 對某個或幾個字段做hash挠他,然后用hash結(jié)果求模得出目標taskId。
3篡帕、globalGrouping(全局分組)
全部流都分配到bolt的同一個任務殖侵。明確地說,是分配給ID最小的那個task镰烧。
4拢军、allGrouping(全部分組)
tuple被復制到bolt的所有任務。這種類型需要謹慎使用怔鳖。
5茉唉、directGrouping(直接分組)
這是一個特別的分組類型。元組生產(chǎn)者決定tuple由哪個元組處理者(Blot)任務接收。
6度陆、noneGrouping(無分組)
目前艾凯,無分組等效于隨機分組。但最終懂傀,Storm將把無分組的Bolts放到Bolts或Spouts訂閱它們的同一線程去執(zhí)行(如果可能)趾诗。
7、localOrShuffleGrouping(本地或隨機分組)
如果目標bolt有一個或多個任務在同一個的worker進程中蹬蚁,tuples會隨機發(fā)送給這些任務恃泪。 否則,就和普通的隨機分組一樣犀斋。
8悟泵、PartialKeyGrouping(部分關鍵字分組) after v1.0.0
這種方式與字段分組很相似,根據(jù)定義的字段來對數(shù)據(jù)流進行分組闪水,不同的是,這種方式會考慮下游 Bolt 數(shù)據(jù)處理的均衡性問題蒙具,在輸入數(shù)據(jù)源關鍵字不平衡時會有更好的性能球榆。
9、自定義分組
可以實現(xiàn)customGrouping接口來選擇出目標task禁筏。
總結(jié)
每個Topology都由Spout和Bolt組成持钉,在Spout和Bolt傳遞信息的基本單位叫做Tuple,由Spout發(fā)出的連續(xù)不斷的Tuple及其在相應Bolt上處理的子Tuple連起來稱為一個Steam篱昔,每個Stream的命名是在其首個Tuple被Spout發(fā)出的時候每强,此時Storm會利用內(nèi)部的Ackor機制保證每個Tuple可靠的被處理。而Tuple可以理解成鍵值對州刽,其中空执,鍵就是在定義在declareStream方法中的Fields字段,而值就是在emit方法中發(fā)送的Values字段
運行中的Topology的組件
Worker processes(進程)
1穗椅、運行具體處理組件邏輯的進程
2辨绊、一個Topology可能會在一個或者多個Worker(工作進程)里面執(zhí)行,每個worker是一個物理JVM并且執(zhí)行整個Topology的一部分匹表。 storm會盡量均勻地將工作分配給所有的worker门坷。
Executors (threads)(線程)
executor:每個execcutor對應一個線程。 1個executor是1個worker進程生成的1個線程袍镀。它可能運行著1個相同的組件(spout或bolt)的1個或多個task默蚌。
Tasks
每個Spout或者Bolt 會被當做很多task在整個集群中運行,在executor這個線程中運行一個或多個task苇羡。