Storm LinearDrpc

以ReachTopology為例子,這個類在storm-starter里。

LinearDRPC顧名思義是線性的,bolt的處理流程是linear的。

重要的方法

1.StormTopologycreateTopology(DRPCSpout spout)

linearDRPC核心的防范就是創建createTopology,方法里首先會給DRPCSpout賦予一個spoutid,然后創建一個bolt,這個bolt接受spout的stream。


bolt的類型是PrepareRequest,PrepareRequest會發射三個stream,分別是參數(args),返回信息(returnInfo)和請求id(requestID)


接下來,會遍歷topo中的每一個組件(component),遍歷組件的過程主要做了幾個事情:

1. 對每一個組件用BoltDeclarer包裝一下

2. 遍歷每一個component的group(比如shuffle group, field group, direct etc)付給新創建的BoltDeclarer


在這之后,每個linearDrpcBuilder都會有一個JoinResult和ReturnResult的bolt,其中JoinResult接受Prepare發出的request stream和最后一個bolt發出的第一個fields。

并將二者做join生成json。ReturnResult獲得JoinResult的結果,并且通過drpc的result的方法放到result的隊列。


從數據流轉的角度,請求如下進行:

1. 首先,客戶端通過execute方法,將請求提交給drpc server(server有clojure實現,請見drpc.clj)


2. 從server的角度來說,topo提交后,就會自動開始計算(參見上面的linearDrpcBuilder中的實現方式)。

3. DrpcSpout從server中獲取request(詳見drpc.clj的fetchRequest方法)

4. 計算結果最終放到另一個隊列,并由execute返回

注意這里用信號量來控制時序, execute用信號量的許可為0來做初始化,這樣會導致execute阻塞


而result方法會對相應的信號量做釋放


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容