2015-06-15 57 views
3

我很想知道需要使用setNumTasks函數的情況。文檔說,默認是每個執行者的一項任務。風暴:何時使用setNumTasks?

如果我有一個'昂貴'的數據庫任務(需要花費時間的外部數據庫調用)在任何一方執行'快速'任務的螺栓運行,我會添加額外的任務嗎?

或者,這是那些'嘗試它,看看會發生什麼'的情景?

回答

4
  • 任務的數量總是> =約束NUM執行人
    • 執行人的數量是可以改變的(而不殺死拓撲)的數量,但是任務> = NUM​​執行人必須尊重。這就是說,如果你有比執行者更多的任務,你可以重新平衡你的拓撲並給它更多的執行者。

如何決定多少執行人/任務你需要什麼?

  • 找瓶頸,你指出一個是好的,延遲來訪問外部數據源(看在風暴UI螺栓過程延遲)。在這種情況下,你可以(可能應該)在這個螺栓上有更多的執行單元;如果你有「多餘」的任務,你可以將它們推薦給執行者。另一個瓶頸是CPU使用率(查看風暴UI上的螺栓容量),CPU密集度更高的螺栓需要更多的執行單元。

我建議你閱讀this page

+0

我試着用setNumTasks(10)發送http請求來配置一個螺栓。此請求的響應延遲了3秒。我注意到Bolt實際上是一個接一個地發送請求。所以我仍然困惑。 – prehawk

2

我只是驗證了這一點,發現爲什麼有這種混淆的任務。

在這種情況下:

int BoltParallelism = 3; 
int BoltTaskParallelism = 2; 
builder.setBolt("bolt1", new BoltA(), BoltParallelism) 
       .setNumTasks(BoltTaskParallelism) 

BoltParallelism確實是執行者的數量和BoltTaskParallelism確實是任務數。

int BoltParallelism = 3; 
builder.setBolt("bolt1", new BoltA(), BoltParallelism) 

如果不指定setNumTasks,風暴造成BoltParallelism多項任務,並創建BoltParallelism執行人的數量爲好。

如果您創建了3個任務,那麼Storm會創建3個Bolt A實例。如果您的DB數據庫讀取發生在BoltA的一個實例中,那麼很可能其他BoltA實例也會做同樣的事情,因爲這是同一班。然而,如果你寫邏輯的方式使得BoltA類可能在某些情況下執行數據庫讀取,而在其他情況下執行一些其他處理,那麼是的;值得擁有更多的任務,值得讓每個任務都在不同的執行者(線程)中運行,因爲如果你有3個任務並且只有一個執行者,那麼這個任務將由執行者一個一個地執行。