storm從入門到精通 第二節 基礎知識講解

2021-07-23 18:56:14 字數 2952 閱讀 1113

topologies

streams

spouts

bolts

stream groupings

reliability

tasks

workers

configuration

storm集群架構

nimbus和supervisor的關係就是傳統的主從關係,它們單獨都可以做成集群模式。zookeeper相當於任務排程分配的作用。

topology

乙個topology是由spouts和bolts組成的圖, 通過stream groupings將圖中的spouts和bolts連線起來

資料tuple是包含多個鍵值對的列表,這些源源不斷的tuple資料流稱之為stream。也可以說

乙個訊息流是乙個沒有邊界的tuple序列, 而這些tuple序列會以一種分布式的方式並行地建立和處理。通過對stream中tuple序列中每個字段命名來定義stream。stream是storm裡的關鍵抽象。

spout是storm裡面乙個topology裡面的訊息生產者。一般來說訊息源會從乙個外部源讀取資料並且向topology裡面發出訊息:tuple。(spout是資料tuple的產生者。這是相對的說法,如果在storm內部機制中,spout就是資料的生產者,水龍頭意思估計就這麼來的。那麼從storm的外部來看,它就不是資料的生產者。因為真正生成資料的是kafak或檔案系統,storm只不過是系統中的乙個中間訊息處理者)。

在設計spout時,盡量簡單,保證速速處理的原則,避免在裡面設計一些io這些消耗資源和效能的操作。

所有的訊息處理邏輯被封裝在bolts裡面。bolts可以做很多事情:過濾,聚合,查詢資料庫等等。

定義如何分配資料給bolts。7種型別的stream grouping:

shuffle grouping: 隨機分組也是平均分組, 隨機派發stream裡面的tuple,保證每個bolt接收到的tuple數目大致相同。

fields grouping:按欄位分組, 比如按userid來分組, 具有同樣userid的tuple會被分到相同的bolts裡的乙個task, 而不同的userid則會被分配到不同的bolts裡的task。

all grouping:廣播傳送,對於每乙個tuple,所有的bolts都會收到。相當於shuffle grouping

*****下面這些不常用====

global grouping:全域性分組, 這個tuple被分配到storm中的乙個bolt的其中乙個task。再具體一點就是分配給id值最低的那個task。

non grouping:不分組,這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和shuffle grouping是一樣的效果, 有一點不同的是storm會把這個bolt放到這個bolt的訂閱者同乙個執行緒裡面去執行。

direct grouping:直接分組, 這是一種比較特別的分組方法,用這種分組意味著訊息的傳送者指定由訊息接收者的哪個task處理這個訊息。 只有被宣告為direct stream的訊息流可以宣告這種分組方法。而且這種訊息tuple必須使用emitdirect方法來發射。訊息處理者可以通過topologycontext來獲取處理它的訊息的task的id (outputcollector.emit方法也會返回task的id)。

local or shuffle grouping:如果目標bolt有乙個或者多個task在同乙個工作程序中,tuple將會被隨機發生給這些tasks。否則,和普通的shuffle grouping行為一致。

storm保證每個tuple會被topology完整的執行。storm會追蹤由每個spout tuple所產生的tuple樹(乙個bolt處理乙個tuple之後可能會發射別的tuple到另外乙個bolt,從而形成樹狀結構--有向無環圖),並且跟蹤這棵tuple樹什麼時候成功處理完。每個topology都有乙個訊息超時的設定,如果storm在這個超時的時間內檢測不到某個tuple樹到底有沒有執行成功, 那麼topology會把這個tuple標記為執行失敗,並且過一會兒重新發射這個tuple(重發時是**失敗發**)。

為了利用storm的可靠性特性,在你發出乙個新的tuple以及你完成處理乙個tuple的時候你必須要通知storm。這一切是由outputcollector來完成的。通過emit方法來通知乙個新的tuple產生了,通過ack方法通知乙個tuple處理完成了。(ack相當於乙個通知,將處理的結果通知給storm)。

每乙個spout和bolt會被當作很多task在整個集群裡執行。每乙個executor對應到乙個執行緒,在這個執行緒上執行多個task,而stream grouping則是定義怎麼從一堆task發射tuple到另外一堆task。你可以呼叫topologybuilder類的setspout和setbolt來設定並行度(也就是有多少個task)。

乙個topology可能會在乙個或者多個worker(工作程序)裡面執行,每個worker是乙個物理jvm並且執行整個topology的一部分。比如,對於並行度是300的topology來說,如果我們使用50個工作程序來執行,那麼每個工作程序會處理其中的6個tasks。storm會盡量均勻的工作分配給所有的worker。

storm裡面有一堆引數可以配置用以調整nimbus, supervisor以及正在執行的topology的行為,一些配置是系統級別的,一些配置是topology級別的。default.yaml裡面有所有的預設配置。你可以通過定義個storm.yaml在你的classpath裡來覆蓋這些預設配置。並且你也可以在**裡面設定一些topology相關的配置資訊(使用stormsubmitter)

C 從入門到工作 第二節 20180708

1.a 5 a a 5 其他的計算相近,這裡有的人說區分不開放在前面和放在後面的意義,其實這個單純地看做乙個符號是最好的。和 無關,和 無關,和兩者的組合有關。2.判斷語句if if word else 如果僅為一條結果語句也可以省略花括號 if word std cout it is a word...

Storm入門到精通(二)

先整體介紹一下搭建storm集群的步驟 我們知道storm通過zookeeper來協調整個集群。zookeeper不是用來做訊息傳遞,因此storm不會給zookeeper帶來很大的壓力。單節點的zookeeper在大多情形下是可以勝任的,但是如果你想得到更好的可靠性或者部署大集群的話,你可能就需要...

Linux C程式設計從入門到精通 Linux基礎

乙個完整的linux作業系統由linux核心 shell 檔案系統和使用工具組成。1.linux核心 2.shell shell是系統的使用者介面,提供了一種使用者與核心進行互動操作的介面。它接收使用者輸入的命令並把它送入核心去執行。實際上shell應該是乙個命令直譯器,它解釋由使用者輸入的命令並且...