<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    放翁(文初)的一畝三分地

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      210 隨筆 :: 1 文章 :: 320 評(píng)論 :: 0 Trackbacks
     

    基于MapReduce的配置型日志分析組件

    Author:放翁(文初)

    Email:fangweng@taobao.com

    Blog: http://blog.csdn.net/cenwenchu79/

    目錄

    需求場(chǎng)景

    組件功能設(shè)計(jì)關(guān)鍵點(diǎn)

    設(shè)計(jì)點(diǎn)分析

    分析模型抽象

    分析實(shí)體抽象:

    分析流程抽象:

    關(guān)鍵路徑任務(wù)分割

    分析過(guò)程生命周期定義:

    基于命令行方式執(zhí)行階段性任務(wù)

    單任務(wù)并行處理化

    低耦合多機(jī)協(xié)作


    需求場(chǎng)景

    從海量的訪問(wèn)日志中分析得到系統(tǒng)健康情況,業(yè)務(wù)增長(zhǎng)趨勢(shì)。

    組件功能設(shè)計(jì)關(guān)鍵點(diǎn)


    1 組件功能設(shè)計(jì)點(diǎn)描述圖

             這個(gè)組件與傳統(tǒng)的MapReduce框架(例如Hadoop)的不同之處在于:

    1. 解決問(wèn)題域側(cè)重于日志分析統(tǒng)計(jì)及趨勢(shì)對(duì)比。通過(guò)抽象分析對(duì)象,分析流程,分析結(jié)果定制了配置模型和規(guī)則解析處理引擎,實(shí)現(xiàn)配置替代編碼實(shí)現(xiàn)自定義分析。

    2. 對(duì)于多機(jī)協(xié)作采用松散方式,簡(jiǎn)化多機(jī)協(xié)作控制流程。

    設(shè)計(jì)點(diǎn)分析

    分析模型抽象

             分析模型抽象主要分為兩部分:分析模型抽象和分析流程抽象。分析模型抽象就是將MapReduceKey-Value統(tǒng)計(jì),轉(zhuǎn)化成為傳統(tǒng)意義上的報(bào)表結(jié)構(gòu)。

             分析的輸入:

             c1,c2,c3,c4,c5,c6…(通常情況下就是用一定的分割符與內(nèi)容組合起來(lái)的字符串)

             MapReduce可以處理的:

        

             如下圖,傳統(tǒng)報(bào)表的一行可以看作是多個(gè)相同key但不同統(tǒng)計(jì)字段組合的結(jié)果。
         
        

             例如:輸入的數(shù)據(jù)結(jié)構(gòu)如下:

             服務(wù)名稱,服務(wù)類型,服務(wù)上行數(shù)據(jù)流量,服務(wù)處理結(jié)果(錯(cuò)誤碼),服務(wù)耗時(shí)

             那么定制如下MapReduce組合:

             Key:服務(wù)名稱,Value:服務(wù)上行數(shù)據(jù)流量總和。

             Key:服務(wù)名稱,Value:服務(wù)耗時(shí)總和。

             Key:服務(wù)名稱,Value:服務(wù)平均耗時(shí)。

        Key:服務(wù)名稱,Value:服務(wù)最大耗時(shí)。

             Key:服務(wù)名稱,Value:服務(wù)最小耗時(shí)。

             那么將這些MapReduce處理后的Key-value在組合一次就可以得到:

             Key:服務(wù)名稱,Value:服務(wù)上行數(shù)據(jù)流量總和,服務(wù)耗時(shí)總和,服務(wù)平均耗時(shí),服務(wù)最大耗時(shí),服務(wù)最小耗時(shí)。

             可以看出,現(xiàn)在就已經(jīng)成為了我們傳統(tǒng)意義上的報(bào)表結(jié)構(gòu)。

          分析實(shí)體抽象:


    2 實(shí)體抽象類圖

    Alias對(duì)象

    對(duì)KeyValue生成時(shí)需要指定是對(duì)那一列或者幾列作分析,因此需要直接指定列號(hào),但是當(dāng)日志數(shù)據(jù)結(jié)構(gòu)改變以后,那么就會(huì)影響所有的配置,為了便于使用和維護(hù),設(shè)定了Alias來(lái)規(guī)避直接使用列號(hào),具體的使用可以參看最后的配置說(shuō)明。

    ReportEntry對(duì)象

    MapReduceKey-Value處理列和規(guī)則的定義。

    keys表示生成key的列(可以直接使用行號(hào)或者使用Alias)Map就是通過(guò)對(duì)keys的定義將key的列用特定的分割符串聯(lián)起來(lái)形成新的key串,然后根據(jù)后面valueExpression的表達(dá)式獲得value(表達(dá)式支持通過(guò)對(duì)列的簡(jiǎn)單(+-*/)的計(jì)算,也支持對(duì)于其他Reportentry的計(jì)算獲得value)。

    valueExpressionRecude的簡(jiǎn)單定義。當(dāng)前抽象ReportEntryValueType定義的那些類型:min(取最小)max(取最大)sum(總和),average(平均),count(總次數(shù))plain(無(wú)需處理,這主要用于顯示key那些列)。具體使用參看后面的配置說(shuō)明。

    conditions可以過(guò)濾不符合規(guī)則的輸入。(支持簡(jiǎn)單的條件表達(dá)式組合)

    valueFilter可以過(guò)濾計(jì)算后不符合定義的結(jié)果。(支持簡(jiǎn)單的條件表達(dá)式組合)

    MapClass,MapParams,ReduceClass,ReduceParams是用于如果滿足不了現(xiàn)有規(guī)則的情況下自定義Map,Reduce,需要實(shí)現(xiàn)對(duì)應(yīng)的接口IReportMap或者IReportReduce

    Format可以對(duì)最后的結(jié)果在輸出的時(shí)候格式化一下,當(dāng)前只支持小數(shù)點(diǎn)round

    Report對(duì)象

                      包含了一個(gè)和多個(gè)ReportEntry對(duì)象,同時(shí)也支持在Report中定義ReportEntry對(duì)象(區(qū)別在于是否需要將這個(gè)ReportEntry共享給其他Report)。file指定了將會(huì)輸出的文件名稱。

    Report Alert對(duì)象

                      報(bào)表的結(jié)果是一天的數(shù)據(jù),只能做一些縱向比較,如果需要對(duì)多天的數(shù)據(jù)作橫向比較以及趨勢(shì)分析,就需要將多天的報(bào)表結(jié)合起來(lái)分析。具體配置也參見(jiàn)后面的數(shù)據(jù)定義。

    分析流程抽象:

    分析流程如下:


    3 分析流程抽象

    流程中可以擴(kuò)展的在第三步和第四步,第三步影響了Key的生成(當(dāng)簡(jiǎn)單的列組合成字符串無(wú)法滿足生成key的情況下可擴(kuò)展),第四步影響value的生成。(當(dāng)mapvalue生成以及Reduce無(wú)法滿足需求的情況下可擴(kuò)展),要使用minmax…以外的reduce,可以直接在ReduceClass中作處理,然后使用plain輸出實(shí)現(xiàn)。

    這種流程比傳統(tǒng)的MapReduce的寫(xiě)法好處在于可以對(duì)輸入只讀取一次(海量的日志文件為了多種條件分析,反復(fù)讀取本身就是最大的損耗)。可以看到在文件IO操作上,不會(huì)隨著分析模型配置的增多而增長(zhǎng),中間數(shù)據(jù)也不會(huì)隨著報(bào)表組合的不同而過(guò)快膨脹(只要報(bào)表復(fù)用Entry足夠多)。

    關(guān)鍵路徑任務(wù)分割

    分析過(guò)程生命周期定義:


    4 分析過(guò)程生命周期定義

    各階段設(shè)計(jì)描述:(這些階段都是接口的方法定義)

    配置解析:運(yùn)行期載入,支持在線配置更新,提高系統(tǒng)靈活性。(本地或者URL資源)

    獲取分析列表:獲取要分析的文件列表,并根據(jù)本地已有數(shù)據(jù)現(xiàn)狀,選擇性的生成需要獲取的文件數(shù)據(jù)。

    獲取任務(wù)數(shù)據(jù):從外部文件系統(tǒng)或者數(shù)據(jù)庫(kù)獲得數(shù)據(jù)。

    切割任務(wù)數(shù)據(jù)文件:根據(jù)配置的文件塊大小,將任務(wù)文件切割到合適的塊。當(dāng)前實(shí)現(xiàn)了實(shí)際切割和虛擬切割。TIPS:切割工作可以是并行多線程實(shí)現(xiàn),實(shí)際切割是消耗CPU和內(nèi)存的,特別是使用管道的方式,因此需要評(píng)估資源情況來(lái)開(kāi)線程。虛擬切割,只是建立虛擬文件,定義好對(duì)應(yīng)到實(shí)體文件的塊起始。前者切割時(shí)候消耗較大,執(zhí)行分析時(shí)分析線程干擾較小效率高,后者切割時(shí)無(wú)太大消耗,執(zhí)行分析時(shí)會(huì)有干擾效率不是很高。(這個(gè)原因還沒(méi)有細(xì)查,測(cè)試效果是這樣)

    分派任務(wù)并執(zhí)行:?jiǎn)螜C(jī)多線程或者多機(jī)并行執(zhí)行分析流程。由于單機(jī)會(huì)受到CPUIO的限制,當(dāng)?shù)竭_(dá)一定數(shù)量線程以后,分析效率反而降低,因此才會(huì)有分布式的需求。

    增量合并處理結(jié)果:分派好任務(wù)以后,多線程或者多機(jī)并性分析時(shí),可以根據(jù)執(zhí)行的情況部分增量式合并處理結(jié)果,當(dāng)所有任務(wù)完成以后,結(jié)果合并結(jié)束。

    輸出分析結(jié)果:可以根據(jù)需求來(lái)創(chuàng)建報(bào)表格式。當(dāng)前采用了csv的文件格式來(lái)創(chuàng)建報(bào)表,易于閱讀和使用。同時(shí)也作了入庫(kù)處理,也可以直接用Google Chart API創(chuàng)建圖形化的Html

    輸出對(duì)比告警:支持當(dāng)日閥值預(yù)警,當(dāng)日與昨日,當(dāng)日與上周同期,當(dāng)日與上月同期數(shù)據(jù)橫向?qū)Ρ龋竭_(dá)閥值生成預(yù)警頁(yè)面。

    基于命令行方式執(zhí)行階段性任務(wù)

             由于整個(gè)分析流程已經(jīng)是任務(wù)化了,因此應(yīng)用只需要具備命令接收功能就可以從任何一步開(kāi)始執(zhí)行分析流程,也可以選擇執(zhí)行到任何步驟直接返回或者輸出中間結(jié)果。

             當(dāng)前應(yīng)用啟動(dòng)通過(guò)監(jiān)聽(tīng)端口數(shù)據(jù)包,接收命令并執(zhí)行。

    單任務(wù)并行處理化

             希望通過(guò)并行化處理來(lái)提高效率,就必須要分析場(chǎng)景。

             以下情況不適于用并行化執(zhí)行來(lái)提高效率:

    1. 串行化任務(wù)。(上一個(gè)任務(wù)的輸出成為下一個(gè)任務(wù)的輸入,或者是有任務(wù)順序的限制)

    2. 執(zhí)行任務(wù)時(shí)有共享資源競(jìng)爭(zhēng)。例如CPU,IO,網(wǎng)絡(luò)等等,不是并行數(shù)越大越好,關(guān)鍵還是要看資源分配狀況以及競(jìng)爭(zhēng)狀況。

    3. 并行化開(kāi)銷大于帶來(lái)的收益。應(yīng)用復(fù)雜度(并發(fā)控制),并行本身需要的資源消耗(計(jì)算能力,空間存儲(chǔ),帶寬消耗等)較大。(在MapReduce中涉及到一點(diǎn)就是計(jì)算代價(jià)總是小于數(shù)據(jù)傳輸,因此讓數(shù)據(jù)靠近計(jì)算,也就能極大提高效率,反過(guò)來(lái)看,如果為了分布式而將數(shù)據(jù)遠(yuǎn)離于計(jì)算,就得不償失了)

    4. 流程瓶頸不在于當(dāng)前并行處理的任務(wù)。也就是關(guān)鍵路徑的問(wèn)題。

    在分析流程上,對(duì)于文件獲取,文件切割,任務(wù)分析都是可以做并行化處理,但是還是要根據(jù)以上不適合的情況來(lái)考慮并行的規(guī)模和單機(jī)多線程或者多機(jī)多線程的方式來(lái)做,提升效率。

    低耦合多機(jī)協(xié)作


    5 兩種Master-Slave模式

             上圖畫(huà)了兩種Master-Slave模式,看起來(lái)沒(méi)什么區(qū)別,但是箭頭的方向不同帶來(lái)的協(xié)作模式也有很大的區(qū)別。Hadoop Master負(fù)責(zé)維護(hù)任務(wù)的分派,任務(wù)執(zhí)行監(jiān)控,任務(wù)合并指派和監(jiān)控的工作,而松散的M-S模式,Master處于被動(dòng)狀態(tài),Master的設(shè)計(jì)更加簡(jiǎn)單化同時(shí)也增加了處理的靈活度。

             用一種形象的描述來(lái)說(shuō)明松散方式下的Master-Slave的協(xié)作模式。(就拿年底買火車票來(lái)說(shuō)事)

    1. Master要買去成都,武漢,長(zhǎng)沙,北京,西安,廣州的火車票各10張。(get Jobs

    2. SlaveA聯(lián)系上Master要求領(lǐng)取任務(wù),Master將買成都的火車票任務(wù)交給SlaveA,將任務(wù)標(biāo)示為正在執(zhí)行。(require job)

    3. SlaveA自己托關(guān)系去開(kāi)始買票。(do job)

    4. SlaveB聯(lián)系上Master要求領(lǐng)取任務(wù),Master將買武漢的火車票任務(wù)交給SlaveB,將任務(wù)標(biāo)示為正在執(zhí)行。

    5. SlaveB自己托關(guān)系開(kāi)始買票。

    6. ……

    7. Master發(fā)現(xiàn)SlaveA在預(yù)期時(shí)間內(nèi)還沒(méi)有返回,將任務(wù)重置為未分配,允許其他Slave來(lái)獲取任務(wù)。

    8. SlaveB將買到的票給MasterMaster將任務(wù)標(biāo)示為完成,并且與其它已經(jīng)完成的任務(wù)統(tǒng)計(jì)合并。

    9. SlaveA返回,但是發(fā)現(xiàn)任務(wù)已經(jīng)被別人完成,則無(wú)功而回。(計(jì)算資源被浪費(fèi))

    10.              Master發(fā)現(xiàn)所有任務(wù)已經(jīng)完成,則向上級(jí)匯報(bào),本次任務(wù)已經(jīng)全部完成,輸出結(jié)果。

    其實(shí)從上面的描述可以看到Master設(shè)計(jì)十分簡(jiǎn)單,Slave功能也十分單一,帶來(lái)的優(yōu)勢(shì)就是處理簡(jiǎn)單,易與管理,同時(shí)任何時(shí)候都允許新的Slave加入,充分利用資源。缺點(diǎn)就是可能在某些Slave不正常的時(shí)候不知情(浪費(fèi)了部分時(shí)間),不過(guò)由于Master會(huì)有預(yù)期結(jié)果返回時(shí)間,因此這個(gè)時(shí)間設(shè)置小一些會(huì)減少浪費(fèi)時(shí)間的場(chǎng)景,但也可能帶來(lái)重復(fù)勞動(dòng)的代價(jià),這里可以通過(guò)算法來(lái)最大程度降低異常節(jié)點(diǎn)時(shí)間消耗,增加Slave有效工作。

    Master職責(zé):獲取任務(wù)列表,分派任務(wù),維護(hù)任務(wù)列表,合并分析結(jié)果,出最終結(jié)果報(bào)表。

    Slave職責(zé):請(qǐng)求任務(wù),執(zhí)行任務(wù),返回分析結(jié)果。

    下面兩個(gè)圖描述了具體的多機(jī)協(xié)作流程和任務(wù)狀態(tài)轉(zhuǎn)換情況。


    6 多機(jī)協(xié)作基本流程圖


    7 任務(wù)狀態(tài)轉(zhuǎn)換圖

    附錄

    項(xiàng)目結(jié)構(gòu)說(shuō)明:


    8 項(xiàng)目包圖

    com.taobao.top.analysis:?jiǎn)螜C(jī)版和多機(jī)版的運(yùn)行實(shí)例類在此包內(nèi)。

    com.taobao.top.analysis.data:抽象配置對(duì)象定義。

    com.taobao.top.analysis.jobmanager:流程抽象接口和實(shí)現(xiàn)。

    com.taobao.top.analysis.transportNIO的底層通信實(shí)現(xiàn)。

    com.taobao.top.analysis.mapMap接口定義和范例實(shí)現(xiàn)。

    com.taobao.top.analysis.reduceReduce接口定義和范例實(shí)現(xiàn)。

    com.taobao.top.analysis.util:工具類包。

    com.taobao.top.analysis.worker:并行處理的工作者線程實(shí)現(xiàn)。

    具體配置及說(shuō)明:
    top-report.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <top_reports>
     <!-- 全局條件自動(dòng)會(huì)應(yīng)用到所有的entity中,
      具體condition的定義和使用方式參看后面entity中condition的定義 -->
     <global-condition value="$logflag$!=session"/>
        <global-condition value="$RECORD_LENGTH$&gt;16&amp;$RECORD_LENGTH$&lt;26"/>
       
        <!-- 全局條件自動(dòng)會(huì)應(yīng)用到所有的entity中,
      具體valuefilter的定義和使用方式參看后面entity中valuefilter的定義
        <global-valuefilter value=""/>
       
        -->

     <!-- 別名,用于定義分析文件中的列,
      防止因?yàn)榱械囊莆粚?dǎo)致整個(gè)報(bào)表都需要修改,多個(gè)別名可以對(duì)應(yīng)一個(gè)列,key代表列數(shù)值 -->
        <aliases>
         <alias name="logflag" key="1"/>
       
         <alias name="remoteIp" key="1"/>
         <alias name="partnerId" key="2"/>
         <alias name="format" key="3"/>
         <alias name="appKey" key="4"/>
         <alias name="apiName" key="5"/>
         <alias name="readBytes" key="6"/>
         <alias name="errorCode" key="7"/>
         <alias name="subErrorCode" key="8"/>
         <alias name="localIp" key="9"/>
         <alias name="nick" key="10"/>
         <alias name="version" key="11"/>
         <alias name="signMethod" key="12"/>
         
         <alias name="timestamp1" key="13"/>
         <alias name="timestamp2" key="14"/>
         <alias name="timestamp3" key="15"/>
         <alias name="timestamp4" key="16"/>
         <alias name="timestamp5" key="17"/>
         <alias name="timestamp6" key="18"/>
         
         <alias name="timestamp7" key="19"/>
         <alias name="timestamp8" key="20"/>
         <alias name="timestamp9" key="21"/>
         <alias name="timestamp10" key="22"/>
         <alias name="timestamp11" key="23"/>
         <alias name="timestamp12" key="24"/>
         <alias name="timestamp13" key="25"/>
        </aliases>
       
        <!-- 統(tǒng)計(jì)列的定義:
         id是唯一索引,
         name表示在報(bào)表中顯示的名稱,
         key可以是alias也可以直接定義列號(hào)(不推薦)主要表示對(duì)那一列或者幾列作為主鍵進(jìn)行統(tǒng)計(jì)例如key=apiname表示對(duì)apiName作分類統(tǒng)計(jì),
          相同的apiname的紀(jì)錄作為一組作后面value的運(yùn)算,key有保留字GLOBAL_KEY代表對(duì)所有記錄作總計(jì)統(tǒng)計(jì)
         value表示計(jì)算方式當(dāng)前支持:min,max,average,count,sum,plain。分別代表統(tǒng)計(jì)最小值,最大值,平均值,計(jì)數(shù),總和。plain表示直接顯示,一般用于主鍵列的顯示
          同時(shí)min,max,average,sum,plain支持表達(dá)式,用$$圍起來(lái)的代表列,entry()表示對(duì)統(tǒng)計(jì)后的entry作再次計(jì)算得到新的entry的結(jié)果。
         condition表示key的過(guò)濾條件,支持對(duì)列的過(guò)濾條件,支持大于,小于,不等于,大于等于,小于等于的表達(dá)式(大于小于需要轉(zhuǎn)義),
          同時(shí)可以多個(gè)條件串聯(lián)用&amp;串聯(lián)。注意,表達(dá)式中不支持有空格。
         valuefilter表示value的過(guò)濾條件,支持計(jì)算出來(lái)的結(jié)果過(guò)濾,有大于,小于,不等于,大于等于,小于等于,是否是數(shù)字(isnumber),大于小于需要轉(zhuǎn)義,
          同時(shí)可以多個(gè)條件串聯(lián)用&amp;串聯(lián)。注意,表達(dá)式中不支持有空格。
         支持自定義map和reduce函數(shù):范例如下:
          mapClass="com.taobao.top.analysis.map.TimeMap" mapParams="xxx=xxx"
       reduceClass="com.taobao.top.analysis.reduce.TimeReduce" reduceParams="xxx=xxx"
          -->
     <entrys>
      <ReportEntry id="1" name="服務(wù)請(qǐng)求總次數(shù)" key="apiName" value="count()"/>
      <ReportEntry id="2" name="訪問(wèn)成功次數(shù)" key="apiName" value="count()" condition="$errorCode$=0" />
      <ReportEntry id="3" name="訪問(wèn)失敗次數(shù)" key="apiName" value="count()" condition="$errorCode$!=0" />
      <ReportEntry id="4" name="業(yè)務(wù)平均處理時(shí)間" key="apiName" value="average($timestamp4$ - $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="5" name="TOP平均處理時(shí)間" key="apiName" value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="6" name="業(yè)務(wù)處理最小時(shí)間" key="apiName" value="min($timestamp4$ - $timestamp3$)" valuefilter="&gt;=0&amp;isnumber"/>
      <ReportEntry id="7" name="業(yè)務(wù)處理最大時(shí)間" key="apiName" value="max($timestamp4$ - $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber"/>
      <ReportEntry id="8" name="TIP服務(wù)調(diào)用前處理時(shí)間" key="apiName" value="average($timestamp3$ - $timestamp1$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="9" name="TIP服務(wù)調(diào)用后處理時(shí)間" key="apiName" value="average($timestamp5$ - $timestamp4$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>  
      <ReportEntry id="10" name="日志及輸出消耗時(shí)間" key="apiName" value="average($timestamp6$ - $timestamp5$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="api_AverageSuccessTIPTimeConsume" name="成功請(qǐng)求TOP處理平均時(shí)間" key="apiName" condition="$errorCode$=0"
        value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
      <ReportEntry id="api_AverageFailTIPTimeConsume" name="失敗請(qǐng)求TOP處理平均時(shí)間" key="apiName" condition="$errorCode$!=0"
       value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/> 
      
      
      <ReportEntry id="11" name="訪問(wèn)總數(shù)" key="GLOBAL_KEY" value="count()" />
      <ReportEntry id="12" name="成功總數(shù)" key="GLOBAL_KEY" value="count()" condition="$errorCode$=0" />
      <ReportEntry id="13" name="失敗總數(shù)" key="GLOBAL_KEY" value="count()" condition="$errorCode$!=0" />
      <ReportEntry id="14" name="業(yè)務(wù)平均消耗時(shí)間(ms)" key="GLOBAL_KEY" value="average($timestamp4$ - $timestamp3$)"  valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="15" name="TOP平均消耗時(shí)間(ms)" key="GLOBAL_KEY" value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)"  valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
        
      
      <ReportEntry id="16" name="錯(cuò)誤次數(shù)" key="errorCode" value="count()" condition="$errorCode$!=0" />
      
      
      <ReportEntry id="17" name="單機(jī)訪問(wèn)總量" key="localIp" value="count()" />
      <ReportEntry id="18" name="單機(jī)訪問(wèn)成功量" key="localIp" value="count()" condition="$errorCode$=0" />
      <ReportEntry id="19" name="單機(jī)訪問(wèn)失敗量" key="localIp" value="count()" condition="$errorCode$!=0" />
      <ReportEntry id="20" name="單機(jī)業(yè)務(wù)平均消耗時(shí)間(ms)" key="localIp" value="average($timestamp4$ - $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="21" name="單機(jī)TOP平均消耗時(shí)間(ms)" key="localIp" value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      
      
      <ReportEntry id="22" name="應(yīng)用訪問(wèn)總量" key="appKey" value="count()" />
      <ReportEntry id="23" name="應(yīng)用成功訪問(wèn)總量" key="appKey" value="count()" condition="$errorCode$=0" />
      <ReportEntry id="24" name="應(yīng)用失敗訪問(wèn)總量" key="appKey" value="count()" condition="$errorCode$!=0"/>
      <ReportEntry id="25" name="應(yīng)用訪問(wèn)業(yè)務(wù)平均耗時(shí)(ms)" key="appKey" value="average($timestamp4$ - $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      <ReportEntry id="26" name="應(yīng)用訪問(wèn)TOP平均耗時(shí)(ms)" key="appKey" value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" valuefilter="&gt;=0&amp;&lt;10000&amp;isnumber&amp;round:3"/>
      
      <ReportEntry id="27" name="時(shí)間段內(nèi)訪問(wèn)總量" key="timestamp1" value="count()"
       mapClass="com.taobao.top.analysis.map.TimeMap"/>
      <ReportEntry id="28" name="時(shí)間段內(nèi)訪問(wèn)成功總量" key="timestamp1" value="count()" condition="$errorCode$=0"
       mapClass="com.taobao.top.analysis.map.TimeMap"/>
      <ReportEntry id="29" name="時(shí)間段內(nèi)訪問(wèn)失敗總量" key="timestamp1" value="count()" condition="$errorCode$!=0"
       mapClass="com.taobao.top.analysis.map.TimeMap" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
      <ReportEntry id="30" name="時(shí)間段內(nèi)訪問(wèn)業(yè)務(wù)平均耗時(shí)(ms)" key="timestamp1" value="average($timestamp4$ - $timestamp3$)"
       mapClass="com.taobao.top.analysis.map.TimeMap" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
      <ReportEntry id="31" name="時(shí)間段內(nèi)訪問(wèn)TOP平均耗時(shí)(ms)" key="timestamp1" value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)"
       mapClass="com.taobao.top.analysis.map.TimeMap" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
       
      
      <ReportEntry id="api_sysFailCount" name="TOP平臺(tái)級(jí)錯(cuò)誤量" key="apiName" value="count()"
         condition="$errorCode$&lt;100&amp;$errorCode$&gt;0" />
      <ReportEntry id="api_serviceSysFailCount" name="服務(wù)系統(tǒng)級(jí)錯(cuò)誤量(900到901)" key="apiName" value="count()"
         condition="$errorCode$&lt;902&amp;$errorCode$&gt;899" />
      <ReportEntry id="api_serviceSysFailCount1" name="服務(wù)系統(tǒng)級(jí)錯(cuò)誤量(大于901)" key="apiName" value="count()"
         condition="$errorCode$&gt;901"/>
      <ReportEntry id="api_serviceAPIFailCount" name="服務(wù)業(yè)務(wù)級(jí)錯(cuò)誤量" key="apiName" value="count()"
         condition="$errorCode$&gt;100&amp;$errorCode$&lt;900"/>
      <ReportEntry id="api_serviceSysFailTotalCount" name="服務(wù)系統(tǒng)級(jí)總錯(cuò)誤量" key="apiName" value="count()"
         condition="$errorCode$&gt;899" />
        
      
     </entrys>
     
     
     <!--
      報(bào)表定義:
      id為報(bào)表主鍵,除了數(shù)字也可以用英文字符串
      file為報(bào)表保存的名稱,不建議使用中文
      entryList描述了報(bào)表包含的所有的entry,可以引用上面定義的全局性的entry,也可以內(nèi)部定義私有的entry。
      
      -->
     <reports>
         <report id="0" file="totalTIPConsumeReport">
          <entryList>
        <entry name="TOP獲取參數(shù)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp7$)" condition="$errorCode$=0"/>
        <entry name="TOP獲取參數(shù)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp7$)" condition="$errorCode$=0"/>
        <entry name="TOP獲取參數(shù)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp7$)" condition="$errorCode$=0"/>
          
        <entry name="獲取API信息耗時(shí)" key="GLOBAL_KEY" value="average($timestamp8$)" condition="$errorCode$=0"/>
        <entry name="獲取API信息最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp8$)" condition="$errorCode$=0"/>
        <entry name="獲取API信息最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp8$)" condition="$errorCode$=0"/>
          
        <entry name="處理協(xié)議必選參數(shù)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp9$)" condition="$errorCode$=0"/>
        <entry name="處理協(xié)議必選參數(shù)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp9$)" condition="$errorCode$=0"/>
        <entry name="處理協(xié)議必選參數(shù)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp9$)" condition="$errorCode$=0"/>
          
          
        <entry name="頻率黑名單校驗(yàn)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp10$)" condition="$errorCode$=0"/>
        <entry name="頻率黑名單校驗(yàn)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp10$)" condition="$errorCode$=0"/>
        <entry name="頻率黑名單校驗(yàn)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp10$)" condition="$errorCode$=0"/>
          
        <entry name="協(xié)議可選參數(shù)校驗(yàn)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp11$)" condition="$errorCode$=0"/>
        <entry name="協(xié)議可選參數(shù)校驗(yàn)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp11$)" condition="$errorCode$=0"/>
        <entry name="協(xié)議可選參數(shù)校驗(yàn)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp11$)" condition="$errorCode$=0"/>
          
        <entry name="業(yè)務(wù)必選參數(shù)校驗(yàn)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp12$)" condition="$errorCode$=0"/>
        <entry name="業(yè)務(wù)必選參數(shù)校驗(yàn)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp12$)" condition="$errorCode$=0"/>
        <entry name="業(yè)務(wù)必選參數(shù)校驗(yàn)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp12$)" condition="$errorCode$=0"/>
          
        <entry name="業(yè)務(wù)可選參數(shù)校驗(yàn)耗時(shí)" key="GLOBAL_KEY" value="average($timestamp13$)" condition="$errorCode$=0"/>
        <entry name="業(yè)務(wù)可選參數(shù)校驗(yàn)最小耗時(shí)" key="GLOBAL_KEY" value="min($timestamp13$)" condition="$errorCode$=0"/>
        <entry name="業(yè)務(wù)可選參數(shù)校驗(yàn)最大耗時(shí)" key="GLOBAL_KEY" value="max($timestamp13$)" condition="$errorCode$=0"/>

        </entryList>
         </report>
     
      <report id="1" file="totalReport">
       <entryList>
        <entry id="11"/>
        <entry name="訪問(wèn)總流量(M)" key="GLOBAL_KEY" value="sum($readBytes$/#1000000#)"  valuefilter="&gt;=0&amp;isnumber&amp;round:4"/>
        <entry id="12"/>
        <entry name="訪問(wèn)成功率" key="GLOBAL_KEY" value="plain(entry(12)/entry(11))" valuefilter="&gt;=0&amp;isnumber&amp;round:4"/>
        <entry id="13"/>
        <entry name="平臺(tái)系統(tǒng)錯(cuò)誤率(占總錯(cuò)誤百分比)" key="GLOBAL_KEY" value="plain(entry(sysFailCount)/entry(13))" valuefilter="&gt;=0&amp;isnumber&amp;round:4"/>
        <entry name="服務(wù)系統(tǒng)錯(cuò)誤率(占總錯(cuò)誤百分比)" key="GLOBAL_KEY" value="plain(entry(serviceSysFailCount)/entry(13))" valuefilter="&gt;=0&amp;isnumber&amp;round:4"/>
        <entry name="服務(wù)業(yè)務(wù)錯(cuò)誤率(占總錯(cuò)誤百分比)" key="GLOBAL_KEY" value="plain(entry(serviceAPIFailCount)/entry(13))" valuefilter="&gt;=0&amp;isnumber&amp;round:4"/>
        <entry id="14"/>
        <entry id="15"/>
        <entry name="TOP成功處理平均耗時(shí)" key="GLOBAL_KEY"
         value="average($timestamp6$ - $timestamp1$ - $timestamp4$ + $timestamp3$)" condition="$errorCode$=0" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="sysFailCount" name="平臺(tái)系統(tǒng)錯(cuò)誤數(shù)" key="GLOBAL_KEY" value="count()" condition="$errorCode$&lt;100&amp;$errorCode$&gt;0"/>
        <entry id="serviceSysFailCount" name="服務(wù)系統(tǒng)錯(cuò)誤數(shù)" key="GLOBAL_KEY" value="count()" condition="$errorCode$&gt;899"/>
        <entry id="serviceAPIFailCount" name="服務(wù)業(yè)務(wù)錯(cuò)誤數(shù)" key="GLOBAL_KEY" value="count()" condition="$errorCode$&gt;100&amp;$errorCode$&lt;900"/>
       </entryList>
      </report>
     
      <report id="2" file="apiReport">
       <entryList>
           <entry name="服務(wù)名稱" key="apiName" value="plain($apiName$)" />
        <entry id="1"/>
        <entry name="占總量比例" key="apiName" value="plain(entry(1)/entry(sum:1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="2"/>
        <entry name="服務(wù)請(qǐng)求成功率" key="apiName" value="plain(entry(2)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="3"/>
        <entry id="4"/>
        <entry id="5"/>
        <entry name="TOP占總處理時(shí)間百分比" key="apiName" value="plain(entry(5)/entry(5+4))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="api_AverageSuccessTIPTimeConsume"/>
        <entry id="api_AverageFailTIPTimeConsume"/>
        <entry id="6"/>
        <entry id="7"/>
        <entry id="8"/>
        <entry id="9"/>
        <entry id="10"/>
        <entry id="api_sysFailCount"/>
        <entry id="api_serviceSysFailTotalCount"/>
        <entry id="api_serviceAPIFailCount"/>
       </entryList>
      </report>
      
      <report id="3" file="errorCodeReport">
       <entryList>
           <entry id="33" name="錯(cuò)誤碼" key="errorCode" value="plain($errorCode$)" condition="$errorCode$!=0"/>
        <entry id="16"/>
        <entry name="錯(cuò)誤比例" key="errorCode" value="plain(entry(16)/entry(sum:16))" condition="$errorCode$!=0" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
       </entryList>
      </report>
      
      <report id="4" file="machineReport">
       <entryList>
           <entry name="服務(wù)器IP" key="localIp" value="plain($localIp$)" />
        <entry id="17"/>
        <entry name="占總量比例" key="localIp" value="plain(entry(17)/entry(sum:17))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="18"/>
        <entry name="成功率" key="localIp" value="plain(entry(18)/entry(17))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="19"/>
        <entry id="20"/>
        <entry id="21"/>
        <entry name="TOP占總處理時(shí)間比值" key="localIp" value="plain(entry(21)/entry(20+21))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
       </entryList>
      </report>
      
      <report id="5" file="appReport">
       <entryList>
           <entry name="應(yīng)用ID" key="appKey" value="plain($appKey$)" />
        <entry id="22"/>
        <entry name="占總訪問(wèn)比例" key="appKey" value="plain(entry(22)/entry(sum:22))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="23"/>
        <entry name="應(yīng)用訪問(wèn)成功率" key="appKey" value="plain(entry(23)/entry(22))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="24"/>
        <entry id="25"/>
        <entry id="26"/>
       </entryList>
      </report>
      
      <report id="6" file="periodReport">
       <entryList>
           <entry name="時(shí)間段" key="timestamp1" value="plain($timestamp1$)"
            mapClass="com.taobao.top.analysis.map.TimeMap"
            reduceClass="com.taobao.top.analysis.reduce.TimeReduce"/>
        <entry id="27"/>
        <entry name="占請(qǐng)求總量比例" key="timestamp1" value="plain(entry(27)/entry(sum:27))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="28"/>
        <entry name="請(qǐng)求成功率" key="timestamp1" value="plain(entry(28)/entry(27))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="29"/>
        <entry id="30"/>
        <entry id="31"/>
       </entryList>
      </report>
      
      <report id="7" file="appAPIReport">
       <entryList>
           <entry name="應(yīng)用ID" key="appKey,apiName" value="plain($appKey$)" condition="$errorCode$=0"/>
           <entry name="服務(wù)名稱" key="appKey,apiName" value="plain($apiName$)" condition="$errorCode$=0"/>
        <entry id="app_api_successCount" name="訪問(wèn)成功總量" key="appKey,apiName" value="count()" condition="$errorCode$=0"/>
       </entryList>
      </report>
      
      <report id="8" file="errorCodeAndSubErrorCodeReport">
       <entryList>
           <entry name="錯(cuò)誤碼" key="errorCode,subErrorCode" value="plain($errorCode$)" condition="$errorCode$!=0"/> 
           <entry name="子錯(cuò)誤碼" key="errorCode,subErrorCode" value="plain($subErrorCode$)"  condition="$errorCode$!=0"/>
        <entry name="錯(cuò)誤總數(shù)" key="errorCode,subErrorCode" value="count()" condition="$errorCode$!=0"/>
       </entryList>
      </report>
      
        
      <report id="9" file="apiFailDetailReport">
       <entryList>
           <entry name="服務(wù)名稱" key="apiName" value="plain($apiName$)" />
        <entry id="1"/>
        <entry id="3"/>
        <entry name="失敗數(shù)占服務(wù)請(qǐng)求量比例" key="apiName" value="plain(entry(3)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry name="失敗數(shù)占失敗總量比例" key="apiName" value="plain(entry(3)/entry(sum:3))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="api_sysFailCount"/>
        <entry name="平臺(tái)級(jí)錯(cuò)誤占總服務(wù)請(qǐng)求比例" key="apiName" value="plain(entry(api_sysFailCount)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="api_serviceSysFailCount"/>
        <entry name="服務(wù)系統(tǒng)級(jí)錯(cuò)誤量(900到901)占總服務(wù)請(qǐng)求比例" key="apiName" value="plain(entry(api_serviceSysFailCount)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="api_serviceSysFailCount1"/>
        <entry name="服務(wù)系統(tǒng)級(jí)錯(cuò)誤量(大于901)占總服務(wù)請(qǐng)求比例" key="apiName" value="plain(entry(api_serviceSysFailCount1)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
        <entry id="api_serviceAPIFailCount"/>
        <entry name="服務(wù)業(yè)務(wù)級(jí)錯(cuò)誤占總服務(wù)請(qǐng)求比例" key="apiName" value="plain(entry(api_serviceAPIFailCount)/entry(1))" valuefilter="&gt;=0&amp;isnumber&amp;round:3"/>
       </entryList>
      </report>
      
      <report id="10" file="appApiErrorReport">
       <entryList>
           <entry name="應(yīng)用ID" key="appKey,apiName,errorCode" value="plain($appKey$)" condition="$errorCode$!=0"/>
           <entry name="服務(wù)名稱" key="appKey,apiName,errorCode" value="plain($apiName$)" condition="$errorCode$!=0"/>
           <entry name="錯(cuò)誤碼" key="appKey,apiName,errorCode" value="plain($errorCode$)" condition="$errorCode$!=0"/>
        <entry name="錯(cuò)誤次數(shù)" key="appKey,apiName,errorCode" value="count()" condition="$errorCode$!=0"/>
       </entryList>
      </report>
      
      <report id="11" file="verionAndSignTypeReport">
       <entryList>
           <entry name="版本號(hào)" key="version,signMethod" value="plain($version$)" condition="$errorCode$=0"/>
           <entry name="簽名類型" key="version,signMethod" value="plain($signMethod$)" condition="$errorCode$=0"/>
           <entry name="訪問(wèn)成功總數(shù)" key="version,signMethod" value="count()" condition="$errorCode$=0"/>
       </entryList>
      </report>
      
      <report id="12" file="appErrorCodeReport">
       <entryList>
           <entry name="應(yīng)用ID" key="appKey,errorCode" value="plain($appKey$)" condition="$errorCode$!=0"/>
           <entry name="錯(cuò)誤碼" key="appKey,errorCode" value="plain($errorCode$)" condition="$errorCode$!=0"/>
           <entry name="錯(cuò)誤總數(shù)" key="appKey,errorCode" value="count()" condition="$errorCode$!=0"/>
       </entryList>
      </report>
     
     </reports>
     
     <alerts>
      <!-- 對(duì)比告警 alerttype:now,day,week,month。
       valve代表閥值:&lt;(now類型代表小于告警,如果是同期比較代表下降超過(guò)),
       &gt;(now類型代表大于告警,如果是同期比較代表上升),沒(méi)有符號(hào)代表絕對(duì)值超過(guò)告警-->
      <alert reportId="1" entryname="訪問(wèn)成功率" alerttype="now" valve="&lt;0.9" />
      <alert reportId="1" entryname="訪問(wèn)總數(shù)" alerttype="day" valve="5000000" />
      <alert reportId="1" entryname="訪問(wèn)成功率" alerttype="day" valve="&lt;0.01" />
      <alert reportId="1" entryname="平臺(tái)系統(tǒng)錯(cuò)誤率" alerttype="day" valve="&gt;0.05" />
      <alert reportId="1" entryname="服務(wù)系統(tǒng)錯(cuò)誤率" alerttype="day" valve="&gt;0.05" />
      <alert reportId="1" entryname="服務(wù)業(yè)務(wù)錯(cuò)誤率" alerttype="day" valve="&gt;0.05" />
      <alert reportId="1" entryname="TOP平均消耗時(shí)間(ms)" alerttype="day" valve="&gt;10" />
      <alert reportId="1" entryname="業(yè)務(wù)平均消耗時(shí)間(ms)" alerttype="day" valve="&gt;10" />
      
      <alert reportId="2" keyentry="服務(wù)名稱" entryname="占總量比例" alerttype="day" valve="&gt;0.01" />
      <alert reportId="2" keyentry="服務(wù)名稱" entryname="服務(wù)請(qǐng)求成功率" alerttype="day" valve="&lt;0.01" />
      <alert reportId="2" keyentry="服務(wù)名稱" entryname="業(yè)務(wù)平均處理時(shí)間" alerttype="day" valve="&gt;20" />
      <alert reportId="2" keyentry="服務(wù)名稱" entryname="TOP平均處理時(shí)間" alerttype="day" valve="&gt;20" />
      
      <alert reportId="3" keyentry="錯(cuò)誤碼" entryname="錯(cuò)誤比例" alerttype="day" valve="&gt;0.01" />
      
      <alert reportId="4" keyentry="服務(wù)器IP" entryname="成功率" alerttype="day" valve="&lt;0.01" />
      
      <alert reportId="5" keyentry="應(yīng)用ID" entryname="占總訪問(wèn)比例" alerttype="day" valve="0.01" />
      <alert reportId="5" keyentry="應(yīng)用ID" entryname="應(yīng)用訪問(wèn)成功率" alerttype="day" valve="&lt;0.05" />
      
      <alert reportId="7" keyentry="應(yīng)用ID,服務(wù)名稱" entryname="訪問(wèn)成功總量" alerttype="day" valve="&gt;10000000" />
      
      <alert reportId="9" keyentry="服務(wù)名稱" entryname="失敗數(shù)占總量比例" alerttype="day" valve="&gt;0.01" />
      
      <alert reportId="10" keyentry="應(yīng)用ID,服務(wù)名稱,錯(cuò)誤碼" entryname="錯(cuò)誤次數(shù)" alerttype="day" valve="&gt;10000" />
      
      <alert reportId="11" keyentry="版本號(hào),簽名類型" entryname="訪問(wèn)成功總數(shù)" alerttype="day" valve="&lt;1000000" />
      
      <alert reportId="12" keyentry="應(yīng)用ID,錯(cuò)誤碼" entryname="錯(cuò)誤總數(shù)" alerttype="day" valve="&gt;100000" />
      
     </alerts>
     
    </top_reports>


    posted on 2010-01-12 21:58 岑文初 閱讀(3860) 評(píng)論(5)  編輯  收藏

    評(píng)論

    # re: 基于MapReduce的配置型日志分析組件 2010-01-17 01:31 ethan
    目前的功能范圍還比較窄(也許是我沒(méi)看到):
    1.沒(méi)有看到數(shù)據(jù)清洗(轉(zhuǎn)換)處理流程,日志處理有時(shí)候需要對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換和容錯(cuò);
    2.對(duì)于TOP排名之類的應(yīng)用還是有一定的問(wèn)題;[如時(shí)間窗口隨意的情況]
    3.不太適合Distinct之類的應(yīng)用;[這個(gè)目前你的需求里確實(shí)也沒(méi)有]
    4.沒(méi)有看到權(quán)重設(shè)置(也就是資源占用)之類的內(nèi)容,如max肯定比count計(jì)數(shù)之類的跑的慢;
    5.沒(méi)有看到com.taobao.top.analysis.worker中關(guān)于master節(jié)點(diǎn)對(duì)于并行隊(duì)列的處理和涉及。很多時(shí)候容易碰到slave并行提交給master的場(chǎng)景(當(dāng)你的任務(wù)設(shè)置過(guò)小的話);
    6.沒(méi)有看到slave監(jiān)控的涉及[尤其是多服務(wù)器的情況]。


    TIPS1:日志拆分和slave的拆分是一個(gè)需要多次調(diào)優(yōu)的過(guò)程

    TIPS2:拆分工作我們做過(guò)測(cè)試,分別用shell(結(jié)合awk)、perl(crc32 hash)、java做過(guò)長(zhǎng)時(shí)間的測(cè)試和代碼優(yōu)化(因?yàn)闇y(cè)試環(huán)境差別,不說(shuō)詳細(xì)的數(shù)據(jù),拆分一個(gè)12GB的話單文件[60列,每行200個(gè)字節(jié),拆分成50個(gè)小文件],t(java)=3*t(shell),t(shell)=4*t(perl),t(*)代表時(shí)間消耗,但是perl拆分文件的占用cpu最高,一直在85%以上,perl的時(shí)間在4分鐘左右)。  回復(fù)  更多評(píng)論
      

    # re: 基于MapReduce的配置型日志分析組件 2010-01-17 12:14 岑文初
    @ethan
    1.condition和valuefilter就是數(shù)據(jù)清洗的環(huán)節(jié),當(dāng)然也支持,map和reduce的自定義。
    2.對(duì)于top排名只需要定義order即可,當(dāng)前流出了字段,不了解什么叫做時(shí)間窗隨意。
    3.沒(méi)有這個(gè)需求,我不是做DB。
    4.對(duì)于與處理來(lái)說(shuō)由于對(duì)于記錄輸入只是一次遍歷,因此沒(méi)有必要再去細(xì)分什么類型的reduce,一條記錄閱讀完成以后這些分析必須全部做,這是一個(gè)串行的過(guò)程,因此無(wú)所謂前后之分。
    5.松散的設(shè)計(jì)就是讓master足夠輕,同時(shí)任務(wù)slave就是資源廉價(jià),通過(guò)用算法來(lái)分配任務(wù),在失效時(shí)間和分配之間找到平衡點(diǎn),master和slave的關(guān)系。
    6.還是那個(gè)設(shè)計(jì),如果master要監(jiān)控slave,那么就不是我說(shuō)的松散設(shè)計(jì),而是傳統(tǒng)的分布式mapreduce的思想。選擇松散就是在控制度和復(fù)雜度之間找到平衡點(diǎn)。

    對(duì)于處理來(lái)說(shuō)就是需要找到關(guān)鍵路徑,然后在關(guān)鍵路徑上找各個(gè)環(huán)節(jié)可以優(yōu)化并行處理的工作,至于如何優(yōu)化,的卻需要去驗(yàn)證,就好比文件切割和任務(wù)塊執(zhí)行,最簡(jiǎn)單的設(shè)計(jì)就是根據(jù)多核來(lái)設(shè)定單機(jī)的工作線程,因?yàn)檫@是消耗cpu的工作。

    對(duì)于文件切割會(huì)根據(jù)采用的方式不同而不同,我只是關(guān)心java方式,呵呵,其他我不關(guān)心了,對(duì)于java我就用map file的方式來(lái)切割,管道輸入輸出效率還是很高的,我不了解你的測(cè)試用的是什么方式。

    不過(guò)很感謝你的留言,起碼看到有人還是看了,呵呵。  回復(fù)  更多評(píng)論
      

    # re: 基于MapReduce的配置型日志分析組件 2010-01-17 15:18 ethan
    @岑文初
    1.時(shí)間窗口隨意指的是如1/1日的top 10,1/2的top 10,1/1-1/3的top 10.可以隨意做時(shí)間窗口設(shè)計(jì)。
    2.Distinct 之類的應(yīng)用并不只是數(shù)據(jù)庫(kù)專屬應(yīng)用。如使用用戶數(shù)就是一個(gè)distinct的典型應(yīng)用,一個(gè)用戶本月使用三次,在本月使用用戶數(shù)指標(biāo)中只能有算一個(gè)。延展開(kāi)來(lái)就是網(wǎng)站中常用的獨(dú)立訪問(wèn)用戶數(shù)的概念。
    3.關(guān)于master端隊(duì)列的設(shè)計(jì)是可以保證slave在并行提交數(shù)據(jù)給master的時(shí)候能保證正常處理。[因?yàn)槟愕脑O(shè)計(jì)中是slave主動(dòng)將合并結(jié)果給master,不是master去取,hadoop沒(méi)有這樣的問(wèn)題]
    ------------

    我很想了解一下你所說(shuō)的map file方式文件拆分的性能測(cè)試數(shù)據(jù)和實(shí)現(xiàn)方式。
    在大數(shù)據(jù)量話單和日志分析系統(tǒng)中,拆分是保證時(shí)效性和性能中最重要的一環(huán)。  回復(fù)  更多評(píng)論
      

    # re: 基于MapReduce的配置型日志分析組件 2010-01-18 13:39 岑文初
    @ethan
    1.對(duì)于趨勢(shì)統(tǒng)計(jì)我們現(xiàn)在是將每日數(shù)據(jù)入庫(kù)來(lái)做更加個(gè)性化的統(tǒng)計(jì),因?yàn)榉治龊蟮臄?shù)據(jù)已經(jīng)是比較粗粒度,但是同時(shí)有能夠滿足個(gè)性化需求的,因此就不再這個(gè)系統(tǒng)中設(shè)計(jì)了。當(dāng)然趨勢(shì)告警這邊有做
    2.先不說(shuō)月,我在系統(tǒng)中有max,min,average,其實(shí)就有一定的這個(gè)意思,當(dāng)著些邏輯滿足不了,可以自動(dòng)擴(kuò)展reduce的方法來(lái)實(shí)現(xiàn)。
    3.對(duì)于結(jié)果的merge是master單線程做的,多線程提交只是放在合并隊(duì)列,因此不存在并發(fā)問(wèn)題。而且合并結(jié)果本來(lái)就有資源競(jìng)爭(zhēng),對(duì)于此類過(guò)程,多線程和單線程效率沒(méi)什么區(qū)別,多線程反而增加復(fù)雜度。

    mapping file其實(shí)就是用java的管道和內(nèi)存文件來(lái)做的,效率應(yīng)該說(shuō)在java中比較好了,實(shí)際的測(cè)試我到?jīng)]有準(zhǔn)確的做過(guò),也不好給出結(jié)果。

    當(dāng)前正在做即時(shí)分析,數(shù)據(jù)源也可以切換到DB上去了,時(shí)間可以縮短,省掉了對(duì)大文件切割和拖拉的時(shí)間。(這塊時(shí)間的卻是在分析中最耗時(shí)的),這樣我除了每天的日?qǐng)?bào)表,也有了段時(shí)間的報(bào)表(每15分鐘,自己可以定義時(shí)間段),增量合并后就是一天的報(bào)表。  回復(fù)  更多評(píng)論
      

    # re: 基于MapReduce的配置型日志分析組件 2010-01-19 18:19 Ethan
    @岑文初
    我們目前的系統(tǒng)分為兩個(gè)部分
    1.下載文件 -->切割-->邏輯處理(比較復(fù)雜的邏輯)-->合并(很簡(jiǎn)單的合并,電信行業(yè)有歷史記錄查詢需求)-->加載入庫(kù)
    2.數(shù)據(jù)庫(kù)-->切割(hash)-->統(tǒng)計(jì)報(bào)表預(yù)處理-->報(bào)表

    有兩次切割。  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品免费观看| 久久免费精彩视频| 久青草视频97国内免费影视| 永久免费av无码网站yy| 日韩免费人妻AV无码专区蜜桃 | 精品久久洲久久久久护士免费| 国产小视频在线免费| 久久精品国产亚洲网站| 亚洲欧洲尹人香蕉综合| 欧美日韩亚洲精品| 久久久久免费视频| 亚洲成人免费电影| 又粗又硬免费毛片| 久久亚洲伊人中字综合精品| 在线观看亚洲AV日韩A∨| 一级毛片免费全部播放| 57pao国产成永久免费视频| 免费看少妇作爱视频| 亚洲精品国偷自产在线| 中文字幕亚洲码在线| 国产成人1024精品免费| 免费看成人AA片无码视频羞羞网| 四虎永久在线精品免费观看地址| 亚洲AV无码国产精品色午友在线| 亚洲精品乱码久久久久蜜桃| 99在线视频免费观看| 最近中文字幕mv免费高清电影| 亚洲午夜无码片在线观看影院猛| 亚洲无成人网77777| 成人免费夜片在线观看| 国产91免费在线观看| 中文字幕亚洲一区| 国产亚洲国产bv网站在线| 久久精品无码专区免费| 成年人性生活免费视频| 久久精品亚洲视频| 黄色网址免费在线| 在线观看成人免费视频不卡| 国产亚洲情侣一区二区无码AV | 亚洲精品免费视频| 一区二区三区免费视频网站|