storm的利用並行度提升處理速度的經驗

在storm的流計算框架中,在數據量很是大或者計算邏輯比較複雜的狀況下,可能會形成處理速度變慢的狀況,最後反而不知足了系統的處理要求,所以這裏討論一下。本文的內容是我在storm的使用過程當中所獲得的一些經驗,我的的觀點,若是考慮不夠全面或者有某些問題,之後會慢慢補齊或者改進。java

在數據量必定的狀況下,若是要提升計算效率,固然首要的任務是算法

(1)要將系統中的算法調優。有可能一個算法浪費了一小部分時間,但因爲數據量可能比較大,以致於總體上1秒的時間內可能浪費大量的時間。所以,算法的設計仍是比較重要的。服務器

 

(2)其次,就是調整系統中佔用資源比較多、運算速度比較慢的那些spout和bolt。在進行topology設計時須要設計好每一個bolt的並行度。對於運行速度比較慢的bolt,須要調大他們的並行度,是得更多的資源用到這些計算上面來。這裏,bolt運行的快慢是能夠從ui界面中看到的,以下圖:負載均衡

如上圖,其中,capacity表示一種容量,其實就是佔用的資源的百分比。好比,0.799就表示佔用了79.9%的分配給這個bolt的資源。這個數值越大,則表示的處理起來速度越慢,則更要加大它的並行度。框架

 

(3)而後就是設置acker的數量。acker是在bolt成功處理後,進行ack調用的線程(仍是進程,我忘記了)。當數據量比較大時,須要使用這個線程的次數就比較多,所以有可能這個線程就是制約處理速度的因素。所以,能夠適當調大acker的數量,用於進行ack的調用。系統中,若是不設置的話,acker的數量默認爲1;能夠經過如下語句在topology中進行設定:ui

 

 

(4)再就是,在算法的設計過程當中,當須要使用某些算法時,好比進行分組的算法,則儘可能使用storm系統中自帶的fieldsgrouping的方法來代替本身實現的算法。這樣效率應該會有提升。spa

 

conf.put(Config.TOPOLOGY_ACKER_EXECUTORS, 10);//設置acker的數量


 

(5)在設置線程的並行度時,最好可以根服務器集羣的及其數量和其每臺的cpu的核心數有所關聯。我通常這樣設置,好比,在個人使用的集羣中,假如共有5臺用於工做的服務器,則我在進行資源消耗較多的bolt的並行度設置時,通常設置其並行度是5的倍數,如10,15,20等。這樣能夠更容易的促進系統自動進行負載的均衡。.net

 

(6)設置好worker的數量。worker是指工做進程的數量,其上能夠運行多個工做線程。在設置worker的數量時,首先查看系統中的全部的executors線程數共有多少,好比,有45個。那麼,在設置worker的數量時,最好使得每一個worker進程所佔有的線程數不要太大,也不要過小。我通常設置爲3,也就是說每一個worker進程大約有3個左右的線程。在上面的45個executors線程的例子中,若共有5臺機器,則設置共有25個worker,則每臺機器上有5個worker;對於45個線程,每臺機器上有15個;這樣一平均,則每一個worker進程中有3個executors線程。線程

(這是我本身的見解,你們能夠試一下。我感受若是負載均衡了會更有利於大型集羣的運算處理。)設計

 

(7)當集羣中數據量比較大時,則最好能設置spout中的等待處理的數據量的大小。當集羣中等待的數據量比較大時,也就是數據發送比較快,可是處理太慢。這個時候應該阻止spout的發送,不然可能會致使系統隊列爆掉。所以,設置如下:

 

conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 10000);//設置一個spout task上面最多有多少個沒有處理的tuple(沒有ack/failed)回覆,以防止tuple隊列爆掉


 

 

 

--------------------- 本文來自 shuaiokshuai 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/shuaiOKshuai/article/details/38365279?utm_source=copy

相關文章
相關標籤/搜索