日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、任務(wù)就是要完成一個(gè)日志分析應(yīng)用。需求沒有很明確,只是要有這么一個(gè)東西能夠滿足分析收集后的日志,將分析后的原始數(shù)據(jù)入庫(kù),作為后期分析和統(tǒng)計(jì)使用。在動(dòng)手做之前,我還是給這個(gè)應(yīng)用作了最基本的需求定義:靈活配置(輸入源,輸出目標(biāo),分析器的實(shí)現(xiàn)等),高效(并行任務(wù)分解)。就這兩點(diǎn)能夠做到,那么將來(lái)需求如何變化都可以適應(yīng)。Tiger的Concurrent包是滿足后面那項(xiàng)最好的實(shí)現(xiàn),里面的線程池,異步服務(wù)調(diào)用,并發(fā)控制都能夠極好的完成并行任務(wù)分解的工作。J2SE7的Concurrent包中將會(huì)增加fork-join風(fēng)格的并行分解庫(kù),其實(shí)這個(gè)是更細(xì)粒度的任務(wù)分解,同時(shí)能夠在當(dāng)前多CPU的情況下提高執(zhí)行效率,充

2、分利用CPU的一種實(shí)現(xiàn)。背景:由于服務(wù)路由應(yīng)用訪問量十分大,即時(shí)的將訪問記錄入庫(kù)對(duì)于路由應(yīng)用本身以及數(shù)據(jù)庫(kù)來(lái)說無(wú)疑都會(huì)產(chǎn)生很大的壓力和影響。因此考慮首先將訪問信息通過10g4j記錄在本地(當(dāng)然自己需要定制一下Log4j的Appender和Filter),然后通過服務(wù)器的定時(shí)任務(wù)腳本來(lái)將日志集中到日志分析應(yīng)用所在的機(jī)器上(這里通過配置可以決定日志是根據(jù)什么時(shí)間間隔來(lái)產(chǎn)生新文件)。日志分析應(yīng)用就比較單純的讀取日志,分析日志,輸出分析結(jié)果(包括寫入數(shù)據(jù)庫(kù)或者是將即時(shí)統(tǒng)計(jì)信息存入到集中式緩存Memcached中)。網(wǎng)絡(luò)結(jié)構(gòu)圖如下:00Concurrent概述:看Java的Doc很容易就理解了Concu

3、rrent,這里我只是大致的說一下幾個(gè)自己在應(yīng)用中使用的接口:BlockingQueue:看看名字就知道了,阻塞式隊(duì)列,可以設(shè)置大小。適合于生產(chǎn)者和消費(fèi)者模式,生產(chǎn)者在隊(duì)列滿時(shí)阻塞,消費(fèi)者在隊(duì)列空時(shí)阻塞。在日志分析應(yīng)用開發(fā)中被用于分析任務(wù)(生產(chǎn)者)和輸出任務(wù)(消費(fèi)者)之間的分析結(jié)果存儲(chǔ)通道。Callable:任何需要執(zhí)行的任務(wù)都可以定義成Callable,類似于線程的Runnable接口,可以被ServiceExecutor指派給內(nèi)部的線程異步執(zhí)行,并且返回對(duì)象或者拋出異常。在日志分析應(yīng)用開發(fā)中,非定時(shí)性的任務(wù)都定義成為此類型。ConcurrentMap:這個(gè)以前常常使用,因?yàn)樾室h(yuǎn)遠(yuǎn)高于C

4、ollections.synchronizedCollection和synchronized。后面還會(huì)提到實(shí)踐中的幾個(gè)實(shí)用的技巧來(lái)防止在高并發(fā)的情況下出現(xiàn)問題。在日志分析應(yīng)用中,此類型的Map作為保存日志文件分析狀態(tài)的緩存(日志文件分為兩種狀態(tài):分析中,分析結(jié)束。如果不存在于Map中就認(rèn)為尚未分析,那么將其納入Map然后啟動(dòng)分析處理線程工作,如果存在于Map中標(biāo)示為分析中,那么將不會(huì)再分析此文件,如果分析結(jié)束并且被輸出,將會(huì)標(biāo)示此文件分析結(jié)束,異步清理線程將會(huì)定時(shí)根據(jù)策略刪除或移動(dòng)文件)ExecutorService:內(nèi)置線程池,異步執(zhí)行指派任務(wù),并可以根據(jù)返回的Future來(lái)跟蹤執(zhí)行情況。在

5、日志分析應(yīng)用開發(fā)中,被用于非定時(shí)性任務(wù)執(zhí)行。ScheduledExecutorService:內(nèi)置線程池,定時(shí)異步執(zhí)行指派任務(wù),并可以根據(jù)返回的Future來(lái)跟蹤執(zhí)行情況。在日志分析應(yīng)用開發(fā)中,被用于定時(shí)性任務(wù)執(zhí)行。以上就是被使用到的接口,具體實(shí)現(xiàn)策略配置就不在此贅述了。整體結(jié)構(gòu)設(shè)計(jì):整體設(shè)計(jì)還是基于開始設(shè)定的兩個(gè)原則靈活配置,高效性(任務(wù)分解,并行流水線執(zhí)行)。說到任務(wù)分解又會(huì)想起讀書時(shí)候的離散數(shù)學(xué)中關(guān)鍵路徑等等。任務(wù)分解還是要根據(jù)具體情況來(lái)分析和設(shè)計(jì),不然并行不但不會(huì)提高效率,反而還降低了處理效率。就日志分析來(lái)看,主要的處理過程可以分成這么幾個(gè)任務(wù):1. 檢查日志來(lái)源目錄,鎖定需要分析的文

6、件。(執(zhí)行需要時(shí)間很短,可通過定時(shí)間隔執(zhí)行)。2. 分析已經(jīng)被鎖定的日志文件,產(chǎn)生分析結(jié)果。(執(zhí)行需要時(shí)間根據(jù)日志文件大小來(lái)決定,因此需要線程異步執(zhí)行,結(jié)果根據(jù)設(shè)定拆分成細(xì)粒度包,降低輸出線程等待時(shí)間)。3. 檢查分析結(jié)果隊(duì)列。(執(zhí)行需要時(shí)間很短,當(dāng)前是配置了SingleThreadExecutor來(lái)執(zhí)行檢查阻塞隊(duì)列的工作,同時(shí)獲取到分析結(jié)果包以后立刻創(chuàng)建線程來(lái)執(zhí)行輸出任務(wù))4. 輸出分析結(jié)果,如果輸出成功,將分析過的日志文件在日志文件狀態(tài)緩存中的狀態(tài)更新為已分析。(執(zhí)行時(shí)間根據(jù)輸出情況來(lái)定,當(dāng)前實(shí)現(xiàn)的是批量輸出到數(shù)據(jù)庫(kù)中,根據(jù)配置來(lái)批量提交入庫(kù),后續(xù)還會(huì)考慮實(shí)時(shí)統(tǒng)計(jì)到集中式Cache作為監(jiān)控

7、使用)。5. 清理分析日志文件。(執(zhí)行時(shí)間較短,根據(jù)策略并且清除設(shè)定了定時(shí)線程池執(zhí)行清理任務(wù),配置來(lái)執(zhí)行清理和移動(dòng)文件任務(wù),在日志文件狀態(tài)緩存中的信息)根據(jù)上面的分解可以看到,其實(shí)在單線程工作的過程中,容易造成阻塞而影響性能的主要是讀取,分析和寫出這三個(gè)過程的協(xié)調(diào),一個(gè)一個(gè)讀取分析和寫出,性能一定低于讀取和分析并行工作,而分析完畢才寫出,性能一定低于分析部分,寫出部分。同時(shí)由于細(xì)分各個(gè)任務(wù),因此任務(wù)與任務(wù)之間的耦合度降低,可以運(yùn)行期獲取具體的任務(wù)實(shí)現(xiàn)配置,達(dá)到靈活配置的目的。卜面就具體的看看整個(gè)流程,以及其中的一些細(xì)節(jié)的說明,這里根據(jù)下圖中的序號(hào)來(lái)逐描述:1. 配置了ScheduleExecu

8、tor來(lái)檢查日志所屬目錄中的日志文件,Executor的線程池大小以及檢查時(shí)間間隔都根據(jù)配置來(lái)設(shè)Tip:定時(shí)任務(wù)可以設(shè)置delay時(shí)間,那么可以根據(jù)你的任務(wù)數(shù)量以及時(shí)間間隔來(lái)設(shè)定每一個(gè)任務(wù)的delay時(shí)間,均勻的將這些任務(wù)分布,提高效率。2. 當(dāng)ReadSchedule被執(zhí)行時(shí),將會(huì)去檢查AnalysisLogFileStateConcurrentCache(也就是上面提到的ConcurrentMap)中是否存在此文件,如果不存在證明尚未分析,需要將其置入Cache,如果已經(jīng)存在就去查詢其他文件。Tip:這里用了一點(diǎn)小技巧,通常我們對(duì)于此類操作應(yīng)該做兩部分工作,get然后再put,但是這樣可能

9、就會(huì)在高并發(fā)的情況下出現(xiàn)問題,因?yàn)檫@兩個(gè)操作不是一個(gè)原子操作。ConcurrentMap提供了putIfAbsent操作,這個(gè)操作意思就是說如果需要put的key沒有存在于Map中,那么將會(huì)把key,value存入,并且返回null,如果已經(jīng)存在了key那么就返回key在map已經(jīng)對(duì)應(yīng)的值。通過if(resources.putIfAbsent(filename,Constants.FILE_STATUS_ANALYSISING)=null)就可以把兩個(gè)操作合并成為一個(gè)操作。3. 日志讀取的工作線程完成鎖定文件以后,就將后續(xù)的工作交給LogAnalysisServiceExecutor來(lái)創(chuàng)建分析

10、任務(wù)異步執(zhí)行分析操作,日志讀取工作線程任務(wù)就此完成。4. LogAnalysisSchedule是運(yùn)行期裝載具體的接口實(shí)現(xiàn)類(采用的就是類似于JAXP等框架使用的META-INF/services來(lái)讀取工廠類,載入接口實(shí)現(xiàn))。AnalysisSchedule執(zhí)行的主要任務(wù)就是分析文件,并且根據(jù)配置將分析結(jié)果拆分并串行的置入到BlockQueue中,提供給輸出線程使用。Write5. Receiver主要工作就是守候著BlockQueue,當(dāng)有數(shù)據(jù)結(jié)果產(chǎn)生就創(chuàng)建Schedule來(lái)異步執(zhí)行輸出。6. LogWriterServiceExecutor根據(jù)配置來(lái)決定內(nèi)置線程池大小,同時(shí)在Receive

11、r獲取到數(shù)據(jù)包時(shí)產(chǎn)生WriteSchedule來(lái)異步執(zhí)行輸出工作。7. WriteSchedule和AnalysisSchedule一樣可以運(yùn)行期裝載接口實(shí)現(xiàn)類,這樣提供了靈活的輸出策略配置。Tips:在數(shù)據(jù)庫(kù)輸出的時(shí)候需要配置批量提交記錄最大數(shù),分批提交提高性能,也防止過大結(jié)果集批量提交問題。8. 寫出完成以后需要更新鎖定文件的狀態(tài),標(biāo)示成為已經(jīng)分析成功。這里還遺留一點(diǎn)問題,在一個(gè)日志文件分包的過程中每一個(gè)包都回記錄隸屬于哪一個(gè)分析文件,文件的最后一個(gè)數(shù)據(jù)包將會(huì)被標(biāo)示。在輸出成功以后會(huì)去檢查哪些包是文件最后數(shù)據(jù)包,更新此文件為已分析成功,如果出現(xiàn)異常,那么將會(huì)把這些文件狀態(tài)清除,接受下一次的

12、重新分析。這里一個(gè)文件部分包提交暫時(shí)沒有做到事務(wù)一致,如果出現(xiàn)部分成功可能會(huì)重復(fù)分析和記錄。9. 最后就是CleanSchedule被定時(shí)執(zhí)行,根據(jù)策略來(lái)刪除或者移動(dòng)已經(jīng)被分析過的文件。Tips:ScheduledExecutorService內(nèi)部可以配置線程池,當(dāng)執(zhí)行定時(shí)任務(wù)比較耗時(shí),線程池中的線程都被占用的情況下,定時(shí)任務(wù)將不會(huì)準(zhǔn)確的按時(shí)執(zhí)行,因此設(shè)計(jì)過程中需要注意的是,定時(shí)任務(wù)一般是簡(jiǎn)短的工作任務(wù),如果比較耗時(shí),那么應(yīng)該結(jié)合ScheduledExecutorService和ExecutorService,定時(shí)任務(wù)完成必要工作以后將耗時(shí)工作轉(zhuǎn)交給ExecutorService創(chuàng)建的即時(shí)執(zhí)行

13、異步線程去處理,保證ScheduleExecutor正常工作。IdLOQ用NmuAj:hrVecsloo:Cc4tdUdite:LeuAnsl/zctocngnHtu1020004221D.3C19330942215:5:16SarvieaAccxtLo?4T1:radL。:LeacVockerF”1Q3LogXatdFv,Et”2re2rdscslQficgfile彘icnndatruntime3:zem1,乎L0sAmxLysistferkerTooliceluVc.rLXicol5ic9?iL)3ATialyzizScrv:cIxecuUi4:jdd叫力。3t=uftp,ordVIacc

14、ount:lnt10D- redC“cMntarvjIintB60- residerihirtidCount;mt=10wuritarTIhroadC口uni:iE:=方- cleanErThreadCount:int=2- chanErChedcInterval:int=1O.5cM如、Txag/uMuGxE,3,Mq);vld*X5CQC1sL”弋Jgicw;V.I4*iurO:i,4,HJ4D:vM=true-dbconrmitWaxCount:int=20IT1IrLoaAnsivzerL-宦目aLeg-LggFn城giotL1helpsrLogAnalyzsrHeIper*un0iu

15、oid+:爐&d+郵0:i/加id+EHnlSbincm竄jidL一IT1LLoOnal/zeirHelper,L-wi電工Lg-L、F目七:oryg屯1tL.- SohidulelExtcutoc號(hào)ervice- jdjilyaHtrezExaut4r4vi4- QrsuniinExscytsrSiwvice- wui艇際Ex?utorS與rvi依- clejnes:ScheduIedElxecutorServoc-e- writerRssourceQuee:LinkedBlocking3ueuaAiTialiysisResult- res*urc4S:Concur悟nt卜astiMpSbi

16、ng.Inleg生a-contig:L4gAnHyzerCcinfis-rjJhdlcir:chodijIcdFMtuPfl*?()-corsumtuHindler;Futjr-cleanHandl&rSGhedniedFuture(Q*gelJRei-ci,dMaC-ii7lini0L.I111+sdReerdM覺ountdrB:iraid+gatRajdChtcklntinrilQ:int+7eiRecdCiigekintevdl(iint):vqideEP4jdairThr&aduiritQiint+seiRecderThreadCciuriHinit):void+gelWrrierTh

17、readlCount):initWriterTlireddlCuunbin0.valcl*elCI&dnrThiejdCoun10:ini+sttC11inaiThutidCounlOirt):void+getcIejnerChecfclnterraIQ:iniIajnaiCh4delntara:voiid+geERerouirceQueubSizeiQiint+寶ER電的uttiSiQu蟲u電君:voidglAiiTln-ddCuikiibCv-Im+iiO:Shin.。+5eiL。gFileDiSiring口J:vQid*tsDeIAftocin3lysisQn+seiDeNteAfteA

18、nalysiboclean):i/oid+gefcSackupDiii:SliingT:Bd1MUp&ItillIIj).J0|iC3+goiDbeemrnitMu10iMf可。b8mmitMurHj府);void上面的類圖中主要描述的就是日志分析應(yīng)用的三個(gè)主類:類似于控制臺(tái)的LogAnalyzer具體內(nèi)部資源管理類,配置類。(T表示采用泛型)了I-Io.LopFcto?qe?L thesouiueORij*Ler如oGcgQue.93Mlmf,gT, 31g-configLogAn*,orCor ifaiftaMUrcQuulinbdBiado*gCMeueAn4loroMalt)vad B

19、*ITY9#“uIT” 信*,vid wnO:ui,Awn、e、&anjIBiOTd alSNQ”須)g,Cg.uoMr3RN,3R皿一心.觸:.a3,/F,uitC0)9c。曲.Loa句QlC-cC。9ewviiM.Cxo8sXMWSMgsRs/AdvlTpO.8.liv):*0IOxtcn”dL*“vzeVac,g:rXtHHhMjp,ELOIMC8力:OR&enMzh3rKoivyc-toit-jg,ZD:vad0小田劃,1。*5226田3時(shí)”CMTMSGlPe”BgW”3d/aD.ScKfeuyl尸-0dW?A立sDDttAnatrflic-:BringraunxnteErejieLS

20、D4r3。士S:“0C3fV.cLNez。”,IIacui,9”,L”fdoiygKL.*4e,Ii,iikO.i,I*ftlla4iinfQua.An4aRaau*14 (utcaxRonarr.EHa,N,pd/mpMif*,* caM岬:Lo9AnfXCoM|:cewmurSoMRe“。3Ln=LoMjSx,.UTfUqiRcccgGu:Lnk4SBi3iMQu0rsur:匕:CorKjncithxhMjpamn;inHaa,witee:LxewfcGUMio:La川”MCovig:ddieduleTpe(il*a*ur0i3/,Me6MgMfd gATyrp。S5,duleTee 5HMrtatrP*u*Q.euQjrt*9(MA0Gues,田尸31,):wed ror慶 8田學(xué)eQ,uoX*jeiih*f5(E*eoS*M

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論