在线实时大数据平台Storm并行和通信机制理解
1、storm系統角色和應用組件基本理解:
? ? ? ?
? ? ? ?和Hadoop一起理解,清晰點。
? ? ? 1)物理節點Nimubus,負責資源分配和任務調度;
? ? ? 2)物理節點Supervisor負責接受nimbus分配的任務,啟動和停止屬于自己管理的worker進程;
? ? ? 3)系統角色Worker運行具體處理組件邏輯的進程;
? ? ? 4)系統爵色Task是worker中每一個spout/bolt的線程稱為一個task,storm0.8之后的版本,task不再與物理線程對應,同一個spout/bolt的task可能會共享一個物理線程,該線程稱為executor。
? ? ? 節點(supervisor)-進程(worker)-線程(executor)-任務(task)和應用組件的關系呢?
2、Storm應用組件關鍵的基本理解
? ? ??
? ? ? ?這個圖對這個關系梳理的還是比較清楚。通俗地理解下:
? ? ? ?1)提交有一個topology(就是一個程序)給集群,集群分配到不同worker執行(可能分布在不同節點),就是有多少個進程在同時進行這個topology,而進程可能在同一個節點上也可能在不同節點上;
? ? ? ?2)每個topology運行在多個worker上,每個worker又分出多個executor,就是進程內有多個線程來執行;
? ? ? 3)每個executor又可以有多個具體任務來執行。
? ? ? ?一個topology可以在多個supervisor上執行,一個supervisor也可以執行多個topology;一個worker只執行某個topology,一個topology由多個worker來執行。
? ? ? ?一個executor可以執行一個component中的多個task。?一個executor默認對應一個task,一個worker中包含多個executor。
? ? ? 現在問題是:不同topolopy之間如何通信?同一topology的不同進程(worker)之間如何通信?同一worker的不同線程(executor)之間如何通信?這三層分別涉及到應用間、進程間、線程間的通信?
3、Storm通信機制
? ? ? ?有這么一個場景:從一個實時生產的文件列表中取出文件,然后統計具體id的次數,這如果應用storm平臺,涉及到文件資源讀取會不會重復?具體id的統計如何匯聚?在分布式情況下,storm是如何控制topology不會重復讀取文件內容,同時又能匯聚id的次數。先看看storm的通信機制。
? ? ? ?1)同一worker間消息的發送使用的是LMAX Disruptor,它負責同一節點(同一進程內)上線程間的通信;
? ? ? ? ? ? ? Disruptor使用了一個RingBuffer替代隊列,用生產者消費者指針替代鎖。
? ? ? ? ? ? ?生產者消費者指針使用CPU支持的整數自增,無需加鎖并且速度很快。Java的實現在Unsafe package中。
? ? ? ?2)?不同worker間通信使用ZeroMQ(0.8)或Netty(0.9.0);
? ? ? ?3)?不同topologey之間的通信,Storm不負責,需要自己實現,例如使用kafka等;
? ? ? ?先不考慮不同topologey之間的通信(除了kafa,我想還可以用nosql的redis來保存一些需要共享的數據資源),同一topology的worker之間用netty通信和同一worker之間用LMAX Disruptor通信,這進程和線程的通信工具能否實現對數據資源讀取的排斥性,這個storm平臺應該是能實現,但個人理解上需要通過代碼來加深。
4、Storm并行機制
? ? ? 基于storm的通信機制,我想storm是可以實現并行分布來實現任務。
? ? ? ? ?
? ? ? ?這張storm官方的圖,很清晰地給出了各組件之間的并行度。代碼如下:
? ? ? ?
Config conf = new Config(); conf.setNumWorkers(2); // use two worker processestopologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout");topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6).shuffleGrouping("green-bolt");StormSubmitter.submitTopology("mytopology",conf,topologyBuilder.createTopology());? ? 該topology:1)包含3個component,1個spout,2個bolt;2)包含2個worker process,10個executor thread,12個task。PS:同顏色屬于同一個component。
5、Storm的worker并行配置
? ? ?
? ? Storm官網給出的Worker進程內部的結構圖。每一個worker進程都有一個單獨的線程來監聽該worker的端口號,并接收發送到該端口的數據,它將通過網絡發送過來的數據放到worker的接收隊列里面。監聽的端口號是通過supervisor.slots.ports定義(conf/storm.yaml中配置),每個節點配置幾個端口就可以有幾個worker。
6、storm的executor并行配置
? ? ?除在代碼中配置外,還可以通過storm rebalance來調整。
storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10? ??
總結:如何理解storm進程間和線程間的通信,是通過storm平臺高性能解決實時數據處理的關鍵,還需要通過實際例子來理解netty和LMAX Disruptor,有了這兩個才有并行分布的意義。這個道理很清晰,就是你要實現分布、并行,首要就是要解決不同任務之間的通信問題,才能確保并行分布的任務對數據的共享不會產生沖突。
總結
以上是生活随笔為你收集整理的在线实时大数据平台Storm并行和通信机制理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive查询结果输出文件
- 下一篇: centos磁盘空间满查询和移动命令小记