日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Storm架构和编程模型总结

發布時間:2024/1/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Storm架构和编程模型总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 編程模型
  DataSource:外部數據源
  Spout:接受外部數據源的組件,將外部數據源轉化成Storm內部的數據,以Tuple為基本的傳輸單元下發給Bolt
  Bolt:接受Spout發送的數據,或上游的bolt的發送的數據。根據業務邏輯進行處理。發送給下一個Bolt或者是存儲到某種介質上。介質可以是Redis可以是mysql,或者其他。
  Tuple:Storm內部中數據傳輸的基本單元,里面封裝了一個List對象,用來保存數據。
  StreamGrouping:數據分組策略
7種:shuffleGrouping(Random函數),Non Grouping(Random函數),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或隨機,優先本地。
2. 并發度
  用戶指定的一個任務,可以被多個線程執行,并發度的數量等于線程的數量。一個任務的多個線程,會被運行在多個Worker(JVM)上,有一種類似于平均算法的負載均衡策略。盡可能減少網絡IO,和Hadoop中的MapReduce中的本地計算的道理一樣。
3. 架構
  Nimbus:任務分配
  Supervisor:接受任務,并啟動worker。worker的數量根據端口號來的。
  Worker:執行任務的具體組件(其實就是一個JVM),可以執行兩種類型的任務,Spout任務或者bolt任務
  Task:Task=線程=executor。 一個Task屬于一個Spout或者Bolt并發任務。
  Zookeeper:保存任務分配的信息、心跳信息、元數據信息。
4. Worker與topology
  一個worker只屬于一個topology,每個worker中運行的task只能屬于這個topology。 反之,一個topology包含多個worker,其實就是這個topology運行在多個worker上。
  一個topology要求的worker數量如果不被滿足,集群在任務分配時,根據現有的worker先運行topology。如果當前集群中worker數量為0,那么最新提交的topology將只會被標識active,不會運行,只有當集群有了空閑資源之后,才會被運行。

5. 如何指定驅動類中每個組件的并發度數量?如何設置worker的數量?
  (1)?根據上游的數據量來設置Spout的并發度。
  (2)?根據業務復雜度和execute方法執行時間來設置Bolt并發度。
  (3) 根據集群的可用資源來配置,一般情況下70%的資源使用率。
? ? (4) Worker的數量理論上根據程序并發度總的Task數量來均分,在實際的業務場景中,需要反復調整

6.?Ack-fail機制

  (1) 需要ack-fail時,請為每個tuple生成一個messageID,這個messagetId是用來標識你關心的tuple。當這個tuple被完全處理時,storm框架會調用Spout的ack方法,否則調用fail。至于你的消息是否重發,完全由自己處理。

MySpout{private Map buffer = new HashMap();spout.open()spout.nextTuple(){collector.emit()buffer.put(msgId,messValue)}spout.outputFields()spout.ack(msgId){//消息移除 buffer.remove(msgId);}spout.fail(msgId){//消息重發String messValue = buffer.get(msgId)collector.emit();}}MyBolt{bolt.execute(){//先判斷消息是否被處理過// 在redis或mysql中保存一個處理過的消息列表 //需要手動的調用ack方法 collector.ack(tuple)}}

?

  (2)?在Spout有并發度的情況下,storm會根據tuple最開始的所屬的spout taskId,通知相應的spoutTask

  ?(3) 在流式計算中topology的bolt組件是可以配置多個的,在每個環節中,都需要bolt組件顯式告訴storm框架,自己對當前接受的這個tuple處理完成。
<spoutTaskId,<RootID,ackaValue=0>>

spout1----->tuple1(msgId,rootId)-----bolt1-----collector.ack(tuple)bolt1-----tuple1-1----->bolt2------ack(tuple1-1)bolt1-----tuple1-2----->bolt2------ack(tuple1-2)bolt1-----tuple1-3----->bolt2------ack(tuple1-3)bolt1-----tuple1-4----->bolt2------ack(tuple1-4)bolt2-----tuple2-1----->bolt3------ack(tuple2-1)bolt2-----tuple2-2----->bolt3------ack(tuple2-2)bolt2-----tuple2-3----->bolt3------ack(tuple2-3)bolt2-----tuple2-4----->bolt3------ack(tuple2-4)

  (4)?ack機制里面,發送兩種類型的tuple。一種是原始消息(DataTuple),另外一種是ackTuple<RootID,tupleID>,DataTuple中會包含一個MessageId的對象,

spout.emit(DataTuple(MessageId(ackTuple)))------->bolt1.execute(dataTuple)---->collector.ack(dataTuple) ackTuple--------------------->Acker.execute(tuple) dataTuple--->MessageId--->ackTuple Acker.execute(tuple)

?


?

?

轉載于:https://www.cnblogs.com/sunfie/p/7268199.html

總結

以上是生活随笔為你收集整理的Storm架构和编程模型总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。