我很想知道需要使用setNumTasks函數的情況。文檔說,默認是每個執行者的一項任務。風暴:何時使用setNumTasks?
如果我有一個'昂貴'的數據庫任務(需要花費時間的外部數據庫調用)在任何一方執行'快速'任務的螺栓運行,我會添加額外的任務嗎?
或者,這是那些'嘗試它,看看會發生什麼'的情景?
我很想知道需要使用setNumTasks函數的情況。文檔說,默認是每個執行者的一項任務。風暴:何時使用setNumTasks?
如果我有一個'昂貴'的數據庫任務(需要花費時間的外部數據庫調用)在任何一方執行'快速'任務的螺栓運行,我會添加額外的任務嗎?
或者,這是那些'嘗試它,看看會發生什麼'的情景?
如何決定多少執行人/任務你需要什麼?
我建議你閱讀this page
我只是驗證了這一點,發現爲什麼有這種混淆的任務。
在這種情況下:
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個任務並且只有一個執行者,那麼這個任務將由執行者一個一個地執行。
我試着用setNumTasks(10)發送http請求來配置一個螺栓。此請求的響應延遲了3秒。我注意到Bolt實際上是一個接一個地發送請求。所以我仍然困惑。 – prehawk