(1)要將系統中的算法調優。有可能一個算法浪費了一小部分時間,但因爲數據量可能比較大,以致於總體上1秒的時間內可能浪費大量的時間。所以,算法的設計仍是比較重要的。算法
(2)其次,就是調整系統中佔用資源比較多、運算速度比較慢的那些spout和bolt。在進行topology設計時須要設計好每一個bolt的並行度。對於運行速度比較慢的bolt,須要調大他們的並行度,是得更多的資源用到這些計算上面來。這裏,bolt運行的快慢是能夠從ui界面中看到的,以下圖:ui
如上圖,其中,capacity表示一種容量,其實就是佔用的資源的百分比。好比,0.799就表示佔用了79.9%的分配給這個bolt的資源。這個數值越大,則表示的處理起來速度越慢,則更要加大它的並行度。線程
(3)而後就是設置acker的數量。acker是在bolt成功處理後,進行ack調用的線程(仍是進程,我忘記了)。當數據量比較大時,須要使用這個線程的次數就比較多,所以有可能這個線程就是制約處理速度的因素。所以,能夠適當調大acker的數量,用於進行ack的調用。系統中,若是不設置的話,acker的數量默認爲1;能夠經過如下語句在topology中進行設定:設計
conf.put(Config.TOPOLOGY_ACKER_EXECUTORS, 10);//設置acker的數量
(4)當集羣中數據量比較大時,則最好能設置spout中的等待處理的數據量的大小。當集羣中等待的數據量比較大時,也就是數據發送比較快,可是處理太慢。這個時候應該阻止spout的發送,不然可能會致使系統隊列爆掉。所以,設置如下:code
conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 10000);//設置一個spout task上面最多有多少個沒有處理的tuple(沒有ack/failed)回覆,以防止tuple隊列爆掉
(5)在Spout調用nextTuple方法時,若是沒有emit tuple,那麼默認須要休眠1ms,這個具體的策略是可配置的,所以能夠根據本身的具體場景,進行設置,以達到合理利用cpu資源。orm
topology.spout.wait.strategy "backtype.storm.spout.SleepSpoutWaitStrategy" topology.sleep.spout.wait.strategy.time.ms 1