最近團隊中有分析的場景,用到了jstorm來做資料的實時分析,於是花時間對於一些概念做了了解。
什麼是storm?
這個的話出來應該有幾年時間了,阿里巴巴也重寫了一套jstorm,核心的類名都是服用的storm的,他是一套實時資料處理系統,容錯行好,然後足夠穩定,目前很多資料實時分析的場景,選擇storm的越來越多了。
核心概念介紹
nimbus:負責在集群裡面傳送**,分配工作給機器,並且監控狀態。全域性只有乙個。相當於master的角色。
supervisor:監聽分配給它那台機器的工作,根據需要啟動/關閉工作程序worker。每乙個要執行storm的機器上都要部署乙個,並且,按照機器的配置設定上面分配的槽位數。
zookeeper:storm重點依賴的外部資源。nimbus和supervisor甚至實際執行的worker都是把心跳儲存在zookeeper上的。nimbus也是根據zookeerper上的心跳和任務執行狀況,進行排程和任務分配的。兩者之間的排程器。
spout:在乙個topology中產生源資料流的元件。通常情況下spout會從外部資料來源中讀取資料,然後轉換為topology內部的源資料。spout是乙個主動的角色,其介面中有個nexttuple()函式,storm框架會不停地呼叫此函式,使用者只要在其中生成源資料即可。
bolt:在乙個topology中接受資料然後執行處理的元件。bolt可以執行過濾、函式操作、合併、寫資料庫等任何操作。bolt是乙個被動的角色,其介面中有個execute(tuple input)函式,在接受到訊息後會呼叫此函式,使用者可以在其中執行自己想要的操作。
topology:storm中執行的乙個實時應用程式,因為各個元件間的訊息流動形成邏輯上的乙個拓撲結構。
worker:具體處理組建邏輯的程序,
task:不再與物理程序對應,是處理任務的執行緒,
stream:源源不斷傳遞的tuple就組成了stream。
tuple:一次訊息傳遞的基本單元。本來應該是乙個key-value的map,但是由於各個元件間傳遞的tuple的欄位名稱已經事先定義好,所以tuple中只要按序填入各個value就行了,所以就是乙個value list.
整體物理布局
放一張nimbus和supervisior的關係圖
資料處理的流程
topology是乙個完成的資料處理流程,在nimbus提交jar,然後nimbus分發到supervisior中,sport負責資料流的讀入,是入口,然後bolt是處理資料加工資料的節點,中間資料被封裝在tuple中,然後bolt節點可以產生新的tuple。總體流程圖如下
storm如何保證訊息被最終處理
總體的流程介紹,首先spout發完tuple後傳送一條ack訊息給acker執行緒,告訴acker自己傳送了哪些tuple需要ack,每乙個bolt 的 task 在執行完對tuple的處理之後,需要手動的ack一下,ack的時候傳送一條ack訊息給acker執行緒,告知自己要ack的tuple和需要下面的節點ack的tuple,當acker收到所有的ack的時候就向spout傳送一條ack訊息,通知這棵樹上的tuple被完整的處理了。
每當乙個spout傳送出乙個tuple,就會在拓撲中產生了一棵由tuple構成的樹,jstorm中為每棵樹設定了乙個rootid來唯一的標示這棵樹。
storm如何儲存資料
嚴格來講,storm中設計的組建,沒有專門儲存資料的,一般情況下,會借助第三方的儲存,例如mysql、nosql 等,bolt的節點,可以用於儲存計算的中間結果或者最終結果。
從這裡看,storm在取捨上拿捏的恰到好處,發揮裡實時處理資料的核心場景。
spout和bolt為啥需要實現序列化
這兩個核心的介面,都實現了序列化,在開發web類系統的時候,一般介面或者操作類,是沒有必要實現序列化介面的,這裡為啥需要呢。
深入理解一些storm的機制,乙個topology程式提交到集群,是先提交到nimbus的,然後由其進行分發,分發是跨程序的,到了另外乙個程序中,是需要反序列化出來這個處理類的。
storm中的grouping機制有那些
乙個 bolt 可以設定為多個 task 併發執行資料處理任務,訂閱了乙個 spout 的 stream,那麼應該把 spout 的資料傳送給哪乙個具體的task執行,這個是由grouping的方式決定的。
1、隨機分組,偽隨機,按照一定的邏輯均勻的分發
2、特定字段分組
3、真正的隨機分組
4、廣播,每個都發一遍
5、直接制定那個任務接收
事務拓撲是怎麼回事
事務拓撲,保證流入拓撲的資料能夠被完整的處理且處理一次;
acker拓撲,保證流入拓撲的資料能夠被完整的處理,但不保證不重複;
普通拓撲,不保證流入拓撲的資料能夠被完整的處理;
如何測試這種程式設計模型的系統呢
簡單想了一些測試的思路,這種實時處理,資料是流動的,測試難度比較大
1、驗證資料,擷取特定時間點的分析結果資料快照,然後利用這些時間在離線的分析集群裡面對照寫分析邏輯,看結果是否一致;
2、驗證資料分析處理邏輯,中間的bolt階段,涉及到資料的加工分析以及過濾,可以mock資料輸入,驗證計算邏輯是否準確;
3、測試環境下,模擬有可能異常的業務資料,流入系統,看系統的容錯機制如何;
spout如何獲取資料
1、直接鏈結,spout作為資料輸入的源頭,啟動執行緒直接鏈結對應的資料來源,拉取特定條件的資料;
2、通過佇列過度,不是直接的方式,通過訊息佇列來進行過度;
3、外部系統通知,訊息系統通知到spout,然後轉換為tuple進行傳輸;
實時計算業務場景舉例
1、日誌分析
例如應用系統產生大量的業務日誌,這些例如閘道器系統的api呼叫情況日誌,這些日誌,不太適合馬上存入資料庫,需要進行加工,日誌檔案的量又非常大,所以沒法直接統計,這時候可以通過storm來進行分析。
2、大資料實時統計
網際網路的資料量是海量的時候,沒有辦法在資料庫層面直接sql來進行統計,需要對於產生的資料,進行二次加工,然後產出結果,正好把實時變化的資料流到storm中處理一遍。
3、管道傳輸
例如有資料需要從a系統流道b系統,這時候需要中間處理一下,場景是不是很切和。
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
閱讀 31,232 次 毫無疑問,redis 開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。希望你喜歡這個比喻。下面是一篇新鮮出爐的文章,其作者是re...