簡體   English   中英

元組的動態重定向的Apache Storm問題(對端到端延遲的影響令人困惑)

[英]Apache Storm issue with Dynamic redirection of tuples (baffling impact on end-to-end latency)

在下面,我包含解釋我在Storm中面臨的問題的文本。 無論如何,我知道這是一篇很長的文章(請多加注意),任何評論/指示都值得歡迎。 描述如下:

我已經在一台服務器上安裝了Storm 0.9.4和ZooKeeper 3.4.6(2個插槽,裝有Intel Xeon 8核芯片,運行CentOS的96 GB內存),並且已經設置了一個偽分布式的單節點Storm運行時。 我的配置包括1個Zookeeper服務器,1個nimbus進程,1個主管進程和1個工作進程(提交拓撲時),它們都在同一台計算機上運行。 我的實驗的目的是查看輸入負載在執行程序線程之間動態分配時,Storm在單節點設置上的行為。

出於實驗目的,我輸入了由1個long和1個整數組成的元組。 輸入數據來自兩個從磁盤文件讀取元組的噴嘴,我控制輸入速率以遵循該模式:前24秒(時間0-24秒)為200元/秒,接下來的12秒為800元/秒( 24-36秒)200個元組/秒,持續6秒(時間36-42秒)。回到我的拓撲結構,我有兩種類型的螺栓:a)一個分派器螺栓,它接收來自兩個噴嘴的輸入,以及(b)一個消費者螺栓,它在元組上執行操作並保持一些元組為狀態。 Dispatcher的並行性提示是一個(1個執行程序/線程),因為我已經檢查過它永遠不會達到其容量的10%。 對於Consumer螺栓,我有兩個並行提示(該螺栓有2個執行程序/線程)。 選擇了我前面提到的輸入速率,以便我可以使用Consumer螺栓上的適當數量的執行器來監視不到10毫秒的端到端延遲。 詳細地說,我使用一個Consumer執行程序運行了相同的拓撲,它可以處理200個元組/秒的輸入速率,端到端延遲<10毫秒。 同樣,如果我再添加一個消費者執行器(總共2個執行器),則拓撲可以消耗800個元組/秒,端到端延遲小於10毫秒。 在這一點上,我不得不說,如果我使用1個消費者執行器以800個元組/秒的速度運行,則端到端延遲將達到2秒。 順便說一句,我不得不提到,我使用螺栓的ack()函數來測量端到端的延遲,並查看從發送拓撲中的元組到完全確認其元組樹之間需要花費多少時間。

到現在為止,您的目標是通過模擬另一個Consumer執行器的添加來查看我是否可以將輸入尖峰的端到端延遲保持在<10毫秒以內,以便模擬為輸入添加處理資源峰值,我使用直接分組,在峰值之前,我僅將元組發送給兩個消費者執行器之一。 當在Dispatcher上檢測到峰值時,它也開始將元組發送到另一個Consumer,以便在兩個線程之間平衡輸入負載。 因此,我希望當我開始將元組發送到附加的Consumer線程時,端到端的延遲將降至其可接受的值。 但是,以前沒有發生。

為了驗證我的假設,即兩個Consumer執行器能夠在峰值期間保持小於10毫秒的延遲,我執行了相同的實驗,但是這次,我在整個實驗過程中將元組發送給兩個執行器(線程)。 在這種情況下,端到端延遲保持穩定並處於可接受的水平。 因此,我不知道模擬中真正發生了什么。 在將輸入負載重定向到附加的Consumer執行程序的情況下,我無法真正找出導致端到端延遲惡化的原因。

為了進一步了解Storm的機制,我在較小的計算機上進行了相同的設置並進行了性能分析。 我看到大部分時間都花在了lmax干擾器的BlockingWaitStrategy中,它支配着CPU。 我的實際處理功能(在Consumer螺栓中)僅占lmax BlockingWaitStrategy的一小部分。 因此,我認為這是隊列之間的I / O問題,而不是與Consumer中元組的處理有關。

關於出什么問題的任何想法,我都會得到這種激進/令人困惑的行為?

謝謝。

首先,感謝您提出的詳細而有條理的問題! 我這邊有很多評論(不確定是否已經是答案...):

  1. 您的實驗相當短(時間范圍小於1分鍾),我認為這可能無法顯示可靠的數字。
  2. 您如何檢測峰值?
  3. 您是否對Storm中的內部緩沖機制感到敬畏(請在此處查看: http : //www.michael-noll.com/blog/2013/06/21/understanding-storm-internal-message-buffers/
  4. 您配置了多少個acker?
  5. 我假設在您的峰值期間,在檢測到峰值之前,緩沖區已被填滿,清空它們需要一些時間。 因此,延遲不會立即下降(也許延長您的上一周期即可解決)。
  6. 許多人都使用ack機制,但這是不精確的。 首先,它顯示一個平均值 (使用平均值,分位數或最大值會更好。此外,量度值根本不應該視為等待時間。例如,如果您將一個元組保持在內部狀態在一段時間內,直到元組從狀態中刪除之前,不要確認它,Storm的“等待時間”值會增加對延遲測量沒有意義的值。延遲的通常定義是獲取結果元組的輸出時間戳並減去源元組的發射時間戳(如果存在多個源元組,則在所有源元組上使用最小的時間戳,即最大時間戳)。棘手的部分是找出每個輸出對應的源元組元組...作為替代方案,有些人將帶有其發射時間戳記的偽元組作為數據注入,每個操作員都會立即轉發此偽元組,而接收器操作員可以輕松訪問延遲值,因為它可以訪問發射時間戳記。引起 nd。 如前所述,這是實際延遲的一個很好的近似值。

希望這可以幫助。 如果您還有其他問題和/或信息,我可以稍后再完善我的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM