Storm程序的并发机制原理总结
文章目錄
- 目錄
- 前言:
- 1、概念
- 2、配置并行度
- 總結(jié):
目錄
前言:
為了在以后的實(shí)踐中提高Storm程序執(zhí)行的效率,我們還是有必要了解下對(duì)應(yīng)的Storm程序的并發(fā)機(jī)制。(哈哈,雖然以博主小菜鳥的水平還沒有接觸到這種提升程序效率層面的東西(這里只是空談理論),但是Storm的并行機(jī)制還是有必要了解下,畢竟技多不壓身嘛!)
1、概念
- 并發(fā)度:用戶指定的一個(gè)任務(wù),可以被多個(gè)線程執(zhí)行,**并發(fā)度的數(shù)量等于線程的數(shù)量。**一個(gè)任務(wù)的多個(gè)線程,會(huì)被運(yùn)行在多個(gè)Worker(JVM)上,有一種類似于平均算法的負(fù)載均衡策略。盡可能減少網(wǎng)絡(luò)IO,和Hadoop中的MapReduce中的本地計(jì)算的道理一樣。
- Workers (JVMs): 在一個(gè)物理節(jié)點(diǎn)上可以運(yùn)行一個(gè)或多個(gè)獨(dú)立的JVM
進(jìn)程。一個(gè)Topology可以包含一個(gè)或多個(gè)worker(并行的跑在不同的物理機(jī)上), 所以worker process就是執(zhí)行一個(gè)topology的子集, 并且worker只能對(duì)應(yīng)于一個(gè)topology。 - Executors (threads): 在一個(gè)worker JVM進(jìn)程中運(yùn)行著多個(gè)Java線程。一個(gè)executor線程可以執(zhí)行一個(gè)或多個(gè)tasks。但一般默認(rèn)每個(gè)executor只執(zhí)行一個(gè)task。一個(gè)worker可以包含一個(gè)或多個(gè)executor,每個(gè)component (spout或bolt)至少對(duì)應(yīng)于一個(gè)executor, 所以可以說executor執(zhí)行一個(gè)compenent的子集, 同時(shí)一個(gè)executor只能對(duì)應(yīng)于一個(gè)component。
- Tasks(bolt/spout instances):Task就是具體的處理邏輯對(duì)象,**每一個(gè)Spout和Bolt會(huì)被當(dāng)作很多task在整個(gè)集群里面執(zhí)行。**每一個(gè)task對(duì)應(yīng)到一個(gè)線程,而stream grouping則是定義怎么從一堆task發(fā)射tuple到另外一堆task。你可以調(diào)用TopologyBuilder.setSpout和TopBuilder.setBolt來設(shè)置并行度 — 也就是有多少個(gè)task。
2、配置并行度
- 對(duì)于并發(fā)度的配置, 在storm里面可以在多個(gè)地方進(jìn)行配置, 優(yōu)先級(jí)為: defaults.yaml < storm.yaml < topology-specific configuration< internal component-specific configuration < external component-specific configuration
- worker processes的數(shù)目, 可以通過配置文件和代碼中配置, worker就是執(zhí)行進(jìn)程, 所以考慮并發(fā)的效果,數(shù)目至少應(yīng)該大亍machines的數(shù)目
- executor的數(shù)目, component的并發(fā)線程數(shù),只能在代碼中配置(通過setBolt和setSpout的參數(shù)), 例如,setBolt(“green-bolt”, new GreenBolt(), 2)
- tasks的數(shù)目, 可以不配置, 默認(rèn)和executor1:1, 也可以通過setNumTasks()配置 。Topology的worker數(shù)通過config設(shè)置,即執(zhí)行該topology的worker(java)進(jìn)程數(shù)。它可以通過 storm rebalance 命令任意調(diào)整。
- 動(dòng)態(tài)的改變并行度
Storm支持在不 restart topology 的情況下, 動(dòng)態(tài)的改變(增減) worker processes 的數(shù)目和 executors 的數(shù)目, 稱為rebalancing. 通過Storm web UI,或者通過storm rebalance命令實(shí)現(xiàn):
storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
并發(fā)度描述如下圖所示:
配置實(shí)例
Config conf = newConfig(); conf.setNumWorkers(2); //用2個(gè)worker topologyBuilder.setSpout("blue-spout", newBlueSpout(), 2); //設(shè)置2個(gè)并發(fā)度 topologyBuilder.setBolt("green-bolt", newGreenBolt(), 2).setNumTasks(4).shuffleGrouping("blue-spout"); //設(shè)置2個(gè)并發(fā)度,4個(gè)任務(wù) topologyBuilder.setBolt("yellow-bolt", newYellowBolt(), 6).shuffleGrouping("green-bolt"); //設(shè)置6個(gè)并發(fā)度 StormSubmitter.submitTopology("mytopology", conf, topologyBuilder.createTopology());3個(gè)組件的并發(fā)度加起來是10,就是說拓?fù)湟还灿?0個(gè)executor,一共有2個(gè)worker,每個(gè)worker產(chǎn)生10 / 2 = 5條線程。
綠色的bolt配置成2個(gè)executor和4個(gè)task。為此每個(gè)executor為這個(gè)bolt運(yùn)行2個(gè)task。
總結(jié):
知道了并發(fā)機(jī)制后,那么在實(shí)際生產(chǎn)中如何指定驅(qū)動(dòng)類中每個(gè)組件的并發(fā)度數(shù)量?如何設(shè)置worker的數(shù)量?有以下幾個(gè)參考點(diǎn):
1,根據(jù)上游的數(shù)據(jù)量來設(shè)置Spout的并發(fā)度。
2,根據(jù)業(yè)務(wù)復(fù)雜度和execute方法執(zhí)行時(shí)間來設(shè)置Bolt并發(fā)度。
3,根據(jù)集群的可用資源來配置,一般情況下70%的資源使用率。
4,Worker的數(shù)量理論上根據(jù)程序并發(fā)度總的Task數(shù)量來均分,在實(shí)際的業(yè)務(wù)場(chǎng)景中,需要反復(fù)調(diào)整。
總結(jié)
以上是生活随笔為你收集整理的Storm程序的并发机制原理总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是肌电信号?
- 下一篇: 关于django的模板