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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

12、重新分析。這里一個文件部分包提交暫時沒有做到事務(wù)一致,如果出現(xiàn)部分成功可能會重復(fù)分析和記錄。9. 最后就是CleanSchedule被定時執(zhí)行,根據(jù)策略來刪除或者移動已經(jīng)被分析過的文件。Tips:ScheduledExecutorService內(nèi)部可以配置線程池,當(dāng)執(zhí)行定時任務(wù)比較耗時,線程池中的線程都被占用的情況下,定時任務(wù)將不會準(zhǔn)確的按時執(zhí)行,因此設(shè)計過程中需要注意的是,定時任務(wù)一般是簡短的工作任務(wù),如果比較耗時,那么應(yīng)該結(jié)合ScheduledExecutorService和ExecutorService,定時任務(wù)完成必要工作以后將耗時工作轉(zhuǎn)交給ExecutorService創(chuàng)建的即時執(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號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)用的三個主類:類似于控制臺的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時”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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論