使用storm可以方便的構(gòu)建一種集群式的數(shù)據(jù)框架,并通過定義topo來實現(xiàn)業(yè)務(wù)邏輯。
但使用topo存在一個缺點, topo的處理能力來自于其啟動時設(shè)置的worker數(shù)目,在很多情況下,我們需要能夠根據(jù)業(yè)務(wù)壓力來調(diào)整集群的處理能力,這時候單一的topo就無法解決這個問題了。
為了能夠更加靈活的定義處理能力,可以考慮將原有的topo根據(jù)業(yè)務(wù)域進行拆分,做到互不干擾,靈活控制,而且為了能夠更加經(jīng)濟的利用處理資源,可以考慮引入worker資源池的概念,達到對資源的充分利用。
但使用這種多topo架構(gòu)存在一個致命問題,storm中的topo是各自獨立,無法直接通信的,因此在獲取某些關(guān)鍵資源時,可能會出現(xiàn)資源爭搶的情況的。面對此種場景,有兩種處理思路:
其一:使用zookeeper等提供的分布式鎖,來實現(xiàn)對關(guān)鍵資源的控制,缺點是可靠性及效率存在問題,使用與對處理效率要求不高的場景。
其二:由第三方對關(guān)鍵資源進行分配,規(guī)避由topo本身對資源的爭搶,這種方案引入了新的構(gòu)建,提高了系統(tǒng)的復(fù)雜度。
處理架構(gòu)集群的優(yōu)點是處理能力可擴展,但會帶來數(shù)據(jù)同步、開發(fā)維護復(fù)雜度以及數(shù)據(jù)一致性等問題。
我們現(xiàn)在雖然已經(jīng)有了很多集群處理框架及相應(yīng)組件用來簡化相應(yīng)的開發(fā)及維護工作量,但從項目開發(fā)的實際來看,我們還是需要處理一些沒有被成熟組件包含但又非常棘手的問題。
storm定義的集群可以提供方便的可擴展處理能力,在整個集群中,topo都是等價的,在storm運行環(huán)境內(nèi)部,topo之間也無法交流。
回到上面的問題,通過storm,我們獲得了即時的集群處理能力;通過topo,我們可以自定義業(yè)務(wù),并方便的在節(jié)點中分發(fā);通過worker數(shù)目的變化,可以調(diào)整其處理能力。
如果輔以Hadoop等大數(shù)據(jù)存儲平臺及Redis緩存,加以使用zookeeper構(gòu)成的分布式鎖,已經(jīng)基本可以構(gòu)建一套即時的可擴展的大數(shù)據(jù)處理平臺。
組件圖多top的初始化
下面是一個基于storm的多拓?fù)涑跏蓟念愐晥D:
關(guān)鍵點與思考緩存策略因為是即時的數(shù)據(jù)處理平臺,其存在對效率的要求,而數(shù)據(jù)庫存儲的訪問通常稱為瓶頸,因此在此設(shè)計了緩存,選型Redis是引起使用已經(jīng)較為廣泛和穩(wěn)定,業(yè)界也存在較為成熟的緩存構(gòu)建策略。
分布式鎖分布式鎖至關(guān)重要,尤其是如果storm集群中存在多個topo的情況下,非常可能存在對關(guān)鍵資源的爭奪。
使用zookeeper構(gòu)建分布式鎖已經(jīng)存在較為成為的應(yīng)用,但使用zookeeper構(gòu)建的分布式鎖必定也存在健壯性不足和鎖的效率問題,需要在設(shè)計時加以考慮。
Hadoop和Oracle的協(xié)作從使用成本和使用場景上,這兩個組件就存在很大不同。
在應(yīng)用時,Hadoop可以用以存儲非結(jié)構(gòu)化的數(shù)據(jù),例如原始結(jié)果。由于Oracle在存儲結(jié)構(gòu)化數(shù)、可靠性以及易用性上的巨大優(yōu)勢,可以選擇將最終處理結(jié)果存放于Oracle之中,利于維護和展示。