storm為什麼總是和消息隊列一起用呢?
01-31
storm為什麼總是和消息隊列一起用呢?
storm的一個 spout讀取資料庫時,如果spout是多個線程的話,那麼 線程並發讀取數據,數據都是一樣的。應該怎麼處理,讓spout是單線程的嗎?
謝邀
storm的解決問題的scope主要在於流計算,說流計算之前我們先簡單的說下一般數據處理系統的過程。一般數據處理簡單說要有幾個環節:數據採集,數據計算,結果輸出。題主的問題主要是在數據採集和計算之間的對接。
一般來說計算系統(storm)不會自己產生業務數據,業務數據一般來自頁面的埋點,或者對資料庫log的解析,對於storm來說採集系統是個外部系統。 採集系統是數據的生產者,流計算(storm)是數據的消費者。二者的速度並不是時時刻刻匹配的,中間就需要需要一個緩衝,這個模型下消息隊列在適合不過了。當然為什麼一般用kafka,這個超出了這個問題,我們暫不討論。如果題主要處理的數據不是實時產生的而是靜態數據那就沒必要使用消息隊列了,當然也沒必要使用storm,使用hadoop MR更合適。關於spout會不會重複讀取數據的問題,簡單來說消息隊列中數據會分partition支持多並發。 題主可以看看kafka的文檔,一般消息隊列,對一份數據(一個topic,對應離線系統的表)會分不同的parition,不同的spout並發可以讀取不同的parition,當然一個並發可以讀取多個parition,但是多個並發讀取一個parition會引起混亂這就是題主的問題。也就是實際應用中一個parition只會有一個並發讀取。首先,storm 並不一定需要用到消息隊列。只是在大多數應用場景下,不同的處理過程間的速率並不是對等的,比如日誌的瞬時產生速度比 storm 處理速度和入庫的速度要快。速率差當然可以通過付出更大的代價來做到一致,這樣就可以扔掉消息隊列了,但絕大多數情況下並不值得這麼做。
其次,消息隊列只是解決處理速度差異的一種方式,你還可以使用緩存,資料庫,以及一切你可以想到的用來暫時存儲一下的東西。消息隊列出現的頻率高是因為它的特性適合這一場景。
spout 一定是一個多線程的,即使只有一個 executor。如果你不希望並發讀取數據帶來的資源消耗,更好的做法是通過緩存以及外部全局鎖來實現,是否值得就得根據實際情況來確定啦。順便打個小廣告,布爾財經 是昊讀數據基於十數年的 非結構化大數據NLP數據、演算法積累,基於主題投資及事件驅動的金融大數據模型研發的一款專業投資決策工具,是理性投資者研判市場、選股、擇時、倉位控制的專業投資系統。下載布爾財經APP,獲取更多炒股工具布爾財經官方網站
Q1:storm為什麼總是和消息隊列一起用呢?
A:消息隊列提供了這樣一些功能,對於流式計算來說都是很有價值的:1)可靠緩存。誠如樓上@楊曉青 所言,流式計算所處理的數據一般來源於其他正在執行中的應用,而數據產生速度與storm應用數據消費速度並不一定是匹配的,況且應用的使用在不同的時間點上壓力是波動的,所以也有可能出現數據產生速度大於消費速度的情景。此時消息隊列提供一個可靠的緩存,可以防止數據丟失,也避免了數據堆積在storm端的內存中。2)流式模型。storm應用模式中,數據以流的方式在不同的邏輯、物理節點上流轉,消息隊列和storm這類流式計算進行搭配是極為符合的。在流式模型中,與離線模型不同的是對實時性有所要求,而消息隊列的性能及producer/consumer模型也完全符合這種模式。
3)消息匯流排。很多時候在整個大的系統中我們把「事件」作為業務的驅動,而大系統中通常存在大量模塊分布在不同設備和環境中,兩兩連接會形成一張巨大且複雜的網,這是不優雅且沒必要的。而消息隊列可以以一種匯流排的方式出現,負責消息的傳遞和分發,直接減少了模塊間的耦合程度。在這樣一種背景下,storm應用作為系統的數據處理模塊,對接消息隊列也是很顯而易見的。Q2:storm對接資料庫時如何避免重複消費?A:首先,當然不會是單線程,這會使spout本身成為一個性能瓶頸,並且存在單點問題。如果你所說的資料庫是Hbase這樣的非關係型資料庫,那麼Hbase有分區,根據不同spout task id每個spout task負責不同的分區即可避免消息重複;如果是關係型資料庫,可以根據不同的spout task id確定select 結果的範圍,每個task負責不同的數據範圍即可避免消息重複。謝邀。
storm總是和消息隊列一起用,但是並不是說是必須這樣用,只不過是流處理作為一個長期存在的任務,需要從某一個地方源源不斷的,能夠很快速的獲取數據,正因為有這樣的業務需求,隊列才成為了一個最常用,也是最簡單的數據推送客戶端。如果spout是多線程運行,必然會有多個客戶端從消息隊列中讀取數據,一般消息隊列都會保證多個客戶端同事讀取不讀取重複數據且不會有數據丟失,這個稍微了解下隊列機制就可以明白。因為需要源源不斷的數據來分析, 流只是一種方式
推薦閱讀:
※Kafka入門簡介
※基於AMQP實現的golang消息隊列MaxQ
※目前linux進程間通信的常用方法是什麼(pipe?信號量?消息隊列?)?
※LocalMQ:從零構建類 RocketMQ 高性能消息隊列
TAG:ApacheStorm | 消息隊列 |