這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)storm java的編程思路是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比桂陽(yáng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式桂陽(yáng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋桂陽(yáng)地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
總體思路
storm編程和hadoop的mapreduce的編程很類似,hadoop的mapreduce需要自己實(shí)現(xiàn)map函數(shù),reduce函數(shù),還有一個(gè)主類驅(qū)動(dòng);storm需要自己實(shí)現(xiàn)spout,bolt和一個(gè)主函數(shù)。storm編程為以下三步:
創(chuàng)建一個(gè)Spout讀取數(shù)據(jù)
創(chuàng)建bolt處理數(shù)據(jù)
創(chuàng)建一個(gè)主類,在主類中創(chuàng)建拓?fù)浜鸵粋€(gè)集群對(duì)象,將拓?fù)涮峤坏郊?/p>
Topology運(yùn)行方式
Topology的運(yùn)行可以分為本地模式和分布式模式,模式的設(shè)置可以在配置文件中設(shè)定,也可以在代碼中設(shè)置。本地模式其實(shí)什么都不需要安裝,有storm jar包就夠了
(1)本地運(yùn)行的提交方式:
LocalCluster cluster = new LocalCluster();
cluster.submitTopology(topologyName, conf, topology);
cluster.killTopology(topologyName);
cluster.shutdown();
(2)分布式提交方式:
StormSubmitter.submitTopology(topologyName, topologyConfig, builder.createTopology());
需要注意的是,在Storm代碼編寫完成之后,需要打包成jar包放到Nimbus中運(yùn)行,打包的時(shí)候,不需要把依賴的jar都打進(jìn)去,否則如果把依賴的storm.jar包打進(jìn)去的話,運(yùn)行時(shí)會(huì)出現(xiàn)重復(fù)的配置文件錯(cuò)誤導(dǎo)致Topology無(wú)法運(yùn)行。因?yàn)門opology運(yùn)行之前,會(huì)加載本地的storm.yaml配置文件。
在Nimbus運(yùn)行的命令如下:
storm jar StormTopology.jar maincalss args
Topology運(yùn)行流程
有幾點(diǎn)需要說(shuō)明的地方:
(1)Storm提交后,會(huì)把代碼首先存放到Nimbus節(jié)點(diǎn)的inbox目錄下,之后,會(huì)把當(dāng)前Storm運(yùn)行的配置生成一個(gè)stormconf.ser文件放到Nimbus節(jié)點(diǎn)的stormdist目錄中,在此目錄中同時(shí)還有序列化之后的Topology代碼文件;
(2)在設(shè)定Topology所關(guān)聯(lián)的Spouts和Bolts時(shí),可以同時(shí)設(shè)置當(dāng)前Spout和Bolt的executor數(shù)目和task數(shù)目,默認(rèn)情況下,一個(gè)Topology的task的總和是和executor的總和一致的。之后,系統(tǒng)根據(jù)worker的數(shù)目,盡量平均的分配這些task的執(zhí)行。worker在哪個(gè)supervisor節(jié)點(diǎn)上運(yùn)行是由storm本身決定的;
(3)任務(wù)分配好之后,Nimbes節(jié)點(diǎn)會(huì)將任務(wù)的信息提交到zookeeper集群,同時(shí)在zookeeper集群中會(huì)有workerbeats節(jié)點(diǎn),這里存儲(chǔ)了當(dāng)前Topology的所有worker進(jìn)程的心跳信息;
(4)Supervisor節(jié)點(diǎn)會(huì)不斷的輪詢zookeeper集群,在zookeeper的assignments節(jié)點(diǎn)中保存了所有Topology的任務(wù)分配信息、代碼存儲(chǔ)目錄、任務(wù)之間的關(guān)聯(lián)關(guān)系等,Supervisor通過(guò)輪詢此節(jié)點(diǎn)的內(nèi)容,來(lái)領(lǐng)取自己的任務(wù),啟動(dòng)worker進(jìn)程運(yùn)行;
(5)一個(gè)Topology運(yùn)行之后,就會(huì)不斷的通過(guò)Spouts來(lái)發(fā)送Stream流,通過(guò)Bolts來(lái)不斷的處理接收到的Stream流,Stream流是無(wú)界的。
最后一步會(huì)不間斷的執(zhí)行,除非手動(dòng)結(jié)束Topology。
Topology方法調(diào)用流程
Topology中的Stream處理時(shí)的方法調(diào)用過(guò)程如下:
有幾點(diǎn)需要說(shuō)明的地方:
(1)每個(gè)組件(Spout或者Bolt)的構(gòu)造方法和declareOutputFields方法都只被調(diào)用一次。
(2)open方法、prepare方法的調(diào)用是多次的。入口函數(shù)中設(shè)定的setSpout或者setBolt里的并行度參數(shù)指的是executor的數(shù)目,是負(fù)責(zé)運(yùn)行組件中的task的線程 的數(shù)目,此數(shù)目是多少,上述的兩個(gè)方法就會(huì)被調(diào)用多少次,在每個(gè)executor運(yùn)行的時(shí)候調(diào)用一次。相當(dāng)于一個(gè)線程的構(gòu)造方法。
(3)nextTuple方法、execute方法是一直被運(yùn)行的,nextTuple方法不斷的發(fā)射Tuple,Bolt的execute不斷的接收Tuple進(jìn)行處理。只有這樣不斷地運(yùn)行,才會(huì)產(chǎn)生無(wú)界的Tuple流,體現(xiàn)實(shí)時(shí)性。相當(dāng)于線程的run方法。
(4)在提交了一個(gè)topology之后,Storm就會(huì)創(chuàng)建spout/bolt實(shí)例并進(jìn)行序列化。之后,將序列化的component發(fā)送給所有的任務(wù)所在的機(jī)器(即Supervisor節(jié)點(diǎn)),在每一個(gè)任務(wù)上反序列化component。
(5)Spout和Bolt之間、Bolt和Bolt之間的通信,是通過(guò)zeroMQ的消息隊(duì)列實(shí)現(xiàn)的。
(6)上圖沒(méi)有列出ack方法和fail方法,在一個(gè)Tuple被成功處理之后,需要調(diào)用ack方法來(lái)標(biāo)記成功,否則調(diào)用fail方法標(biāo)記失敗,重新處理這個(gè)Tuple。
Topology并行度
在Topology的執(zhí)行單元里,有幾個(gè)和并行度相關(guān)的概念。
(1)worker:每個(gè)worker都屬于一個(gè)特定的Topology,每個(gè)Supervisor節(jié)點(diǎn)的worker可以有多個(gè),每個(gè)worker使用一個(gè)單獨(dú)的端口,它對(duì)Topology中的每個(gè)component運(yùn)行一個(gè)或者多個(gè)executor線程來(lái)提供task的運(yùn)行服務(wù)。
(2)executor:executor是產(chǎn)生于worker進(jìn)程內(nèi)部的線程,會(huì)執(zhí)行同一個(gè)component的一個(gè)或者多個(gè)task。
(3)task:實(shí)際的數(shù)據(jù)處理由task完成,在Topology的生命周期中,每個(gè)組件的task數(shù)目是不會(huì)發(fā)生變化的,而executor的數(shù)目卻不一定。executor數(shù)目小于等于task的數(shù)目,默認(rèn)情況下,二者是相等的。
在運(yùn)行一個(gè)Topology時(shí),可以根據(jù)具體的情況來(lái)設(shè)置不同數(shù)量的worker、task、executor,而設(shè)置的位置也可以在多個(gè)地方。
(1)worker設(shè)置:
(1.1)可以通過(guò)設(shè)置yaml中的topology.workers屬性
(1.2)在代碼中通過(guò)Config的setNumWorkers方法設(shè)定
(2)executor設(shè)置:
通過(guò)在Topology的入口類中setBolt、setSpout方法的最后一個(gè)參數(shù)指定,不指定的話,默認(rèn)為1;
(3)task設(shè)置:
(3.1) 默認(rèn)情況下,和executor數(shù)目一致;
(3.2)在代碼中通過(guò)TopologyBuilder的setNumTasks方法設(shè)定具體某個(gè)組件的task數(shù)目;
終止Topology
通過(guò)在Nimbus節(jié)點(diǎn)利用如下命令來(lái)終止一個(gè)Topology的運(yùn)行:
storm kill topologyName
kill之后,可以通過(guò)UI界面查看topology狀態(tài),會(huì)首先變成KILLED狀態(tài),在清理完本地目錄和zookeeper集群中的和當(dāng)前Topology相關(guān)的信息之后,此Topology就會(huì)徹底消失了。
Topology跟蹤
Topology提交后,可以在Nimbus節(jié)點(diǎn)的web界面查看,默認(rèn)的地址是http://NimbusIp:8080。
上述就是小編為大家分享的storm java的編程思路是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:stormjava的編程思路是什么
當(dāng)前網(wǎng)址:http://aaarwkj.com/article20/ihhjjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)