前言
Storm框架在實際項目中已經平穩運行快一年了,也很好的支撐了海量讀寫器的數據處理需求,不過和RabbitMQ一樣,為了項目進度,實際工作中只能盡快的調研,關注一些關鍵點,其他的細節就只能放一放。這次面試題總結也希望自己能夠在關於提升我項目亮點的框架上多下一些功夫,被問到一些技術細節時,能夠做到心中有數。
Storm實時流計算框架
-
Storm與hadoop對比?
- 應用場景:Storm專注於分布式實時流處理;Hadoop關注的是離線批處理
-
Storm集群架構是什么樣的,簡單介紹一下
Storm是master/slave架構,在傳統的master/slave架構中,主節點一般負責任務的接受分配和監控,從節點負責具體任務的執行,Storn框架也類似,但是在其中有一些不同:
- nimbus主節點依然負責集群中分發任務以及監控
- supervisor從節點會啟動一個worker來執行具體的任務,一個worker就是一個JVM進程
實際項目中,有四個服務器節點,選擇了兩台機器部署supervisor,防止單點問題;把nimbus和zookeeper部署在另外一台服務器上,只部署了一個實例,這個是根據Storm官方文檔推薦部署的。因為對我們的業務系統來說,nimbus和zookeeper本身負載不算高。
-
Storm集群中的任務是什么樣子的?簡單介紹一下
Storm集群中的任務叫做拓撲,拓撲中包含兩種類型的組件:
- Spoult:負責對接外部數據源,獲取數據
- bolt:負責處理數據
我們實際項目中,有一個spoult對接RabbitMQ獲取讀寫器實時數據,一個bolt組件進行去重分組以及相關統計信息的計算。處理完畢的數據,會繼續傳遞到RabbitMQ中等待下層服務處理。
-
Topology在Storm集群中是如何分發的?
- storm jar命令上傳jar包到storm的nimbus節點
- nimbus節點根據配置的信息查詢空閑的worker
- 分配任務到具體的worker中,worker從nimbus下載待處理的jar包
-
具體的線程模型是怎樣的?並發度如何設置?
Storm中多線程的設置叫做並發度,一個bolt或者spoult如果並發度設置大於1的話,就會實例多個,每一個對應一個線程去處理。
我們實際項目中,從RabbitMQ中獲取數據使用了並發度為2的設置,一可以提高處理速度,二可以防止單點問題。bolt實際處理線程設置為10,分別對應了epc尾數0-9,可以並發的處理
-
消息是如何分發的?如何進行grouping分組設置?
storm中可以通過設置grouping分組,來自定義消息的分發細節。比如隨機分組,按字段分組
我們實際項目中,使用的是按字段分組,分組字段是epc的后一位,相同epc尾數的可以被分到同一個線程處理,保證了線程安全問題。
-
Storm中是如何保證消息可靠性的?
Storm中消息鏈中的處理過消息的鏈條都會產生一個以數據源為tuple頭的處理鏈,鏈上的每一個節點都需要顯式的說明處理成功或者失敗,如果有一個沒有顯式處理,那么這個消息就沒有正確處理完畢。如果超時時間范圍內沒有處理完畢,就算處理失敗。
如果成功處理或者處理失敗,Storm框架會回調Spoult中的ack方法或者fail方法,可以在里面做可靠性的后續業務處理。