并使 數(shù)據(jù)挖掘等迭代算法的性能大幅提升。除了提供更好的性能,本發(fā)明以面向接口和可配置 化為設(shè)計(jì)原則,基于消息協(xié)議與外部系統(tǒng)進(jìn)行通信,各系統(tǒng)的實(shí)現(xiàn)可以隨時(shí)根據(jù)需要進(jìn)行 更改,而不必?fù)?dān)心會破壞對方,從而實(shí)現(xiàn)了松耦合系統(tǒng)的靈活性和可靠性,并且其基于有向 無環(huán)圖結(jié)構(gòu)和能力對等原則設(shè)計(jì)構(gòu)建的日志傳輸子系統(tǒng)可以使系統(tǒng)內(nèi)部組網(wǎng)更加靈活,以 適應(yīng)業(yè)務(wù)長期發(fā)展變化的需要。同時(shí)本發(fā)明還考慮了保證日志數(shù)據(jù)傳輸處理過程中的冪等 性及緩存算法等若干細(xì)節(jié),從而使系統(tǒng)更加健壯。
【附圖說明】
[0050] 圖1為本發(fā)明所述構(gòu)建大數(shù)據(jù)分布式日志的方法的流程圖;
[0051] 圖2為本發(fā)明所述所述構(gòu)建大數(shù)據(jù)分布式日志的系統(tǒng)整體結(jié)構(gòu)圖;
[0052] 圖3為本發(fā)明所述日志傳輸子系統(tǒng)結(jié)構(gòu)圖;
[0053] 圖4為本發(fā)明所述日志存儲子系統(tǒng)結(jié)構(gòu)圖;
[0054] 圖5為本發(fā)明所述批量日志處理子系統(tǒng)結(jié)構(gòu)圖;
[0055] 圖6為本發(fā)明所述內(nèi)存數(shù)據(jù)庫結(jié)構(gòu)圖;
[0056] 圖7為本發(fā)明所述實(shí)時(shí)數(shù)據(jù)處理子系統(tǒng)結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0057] 以下結(jié)合附圖對本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并 非用于限定本發(fā)明的范圍。
[0058] 圖1為本發(fā)明所述構(gòu)建大數(shù)據(jù)分布式日志的方法的流程圖。
[0059] 如圖1所示,一種構(gòu)建大數(shù)據(jù)分布式日志的方法,包括以下步驟:
[0060] 步驟S1,日志傳輸子系統(tǒng)從業(yè)務(wù)系統(tǒng)接收到日志數(shù)據(jù),并為每條接收到的所述日 志數(shù)據(jù)生成一個(gè)UUID標(biāo)識,并將附帶UUID標(biāo)識的所述日志數(shù)據(jù)經(jīng)過負(fù)載均衡后經(jīng)過多個(gè) 節(jié)點(diǎn)發(fā)送給日志存儲子系統(tǒng);
[0061] 步驟S2,日志存儲子系統(tǒng)接收所述日志數(shù)據(jù),通過水平擴(kuò)展的方式存儲所述日志 數(shù)據(jù)后,將所述日志數(shù)據(jù)發(fā)送給批量日志處理子系統(tǒng);
[0062] 步驟S3,所述批量日志處理子系統(tǒng)接收所述日志數(shù)據(jù),并采用MapReduce算法定 時(shí)對所述日志數(shù)據(jù)進(jìn)行批量預(yù)處理,生成按小時(shí)報(bào)表和按天報(bào)表供外部業(yè)務(wù)報(bào)表系統(tǒng)進(jìn)行 查詢。
[0063] 圖2為本發(fā)明所述所述構(gòu)建大數(shù)據(jù)分布式日志的系統(tǒng)整體結(jié)構(gòu)圖。
[0064] 如圖2所不,一種構(gòu)建大數(shù)據(jù)分布式日志的系統(tǒng),包括日志傳輸子系統(tǒng)、日志存儲 子系統(tǒng)、批量日志處理子系統(tǒng)、內(nèi)存數(shù)據(jù)庫和實(shí)時(shí)數(shù)據(jù)處理子系統(tǒng)。
[0065] 圖3為本發(fā)明所述日志傳輸子系統(tǒng)結(jié)構(gòu)圖。
[0066] 如圖3所示,日志傳輸子系統(tǒng)包括日志傳輸客戶端、日志接收服務(wù)器以及連接日 志傳輸客戶端和日志接收服務(wù)器的負(fù)載均衡器。日志數(shù)據(jù)由業(yè)務(wù)系統(tǒng)產(chǎn)生,并通過調(diào)用日 志數(shù)據(jù)發(fā)送給日志傳輸客戶端進(jìn)而發(fā)送給日志接收服務(wù)器。為了保證日志傳輸處理過程中 的冪等性,日志傳輸客戶端為每條日志數(shù)據(jù)生成一個(gè)UUID(通用唯一識別碼,Universally Unique Identifier)作為日志的唯一標(biāo)識,而批量日志處理子系統(tǒng)將根據(jù)這個(gè)UUID來保 證每條日志數(shù)據(jù)的唯一性,避免把多條相同重復(fù)的日志數(shù)據(jù)當(dāng)作是多條不同的日志數(shù)據(jù)來 處理。
[0067] 日志接收服務(wù)器包括多個(gè)節(jié)點(diǎn)(節(jié)點(diǎn)不一定是物理節(jié)點(diǎn),本發(fā)明中附圖3可看作 是日志接收服務(wù)器的一個(gè)實(shí)例),由多個(gè)節(jié)點(diǎn)構(gòu)成的的日志傳輸子系統(tǒng)的有向無環(huán)圖網(wǎng)絡(luò) 使用TCP數(shù)據(jù)流傳輸協(xié)議以實(shí)時(shí)高效分發(fā)日志數(shù)據(jù)(TCP是一種面向連接的、可靠的字節(jié)流 服務(wù),與HTTP協(xié)議相比更高效)。每個(gè)節(jié)點(diǎn)都同時(shí)具備接收和發(fā)送日志數(shù)據(jù)的對等能力,可 把同一份日志數(shù)據(jù)按不同需求分發(fā)給不同的系統(tǒng)進(jìn)行處理,這使得可方便的通過添加新節(jié) 點(diǎn)進(jìn)行負(fù)載均衡或數(shù)據(jù)轉(zhuǎn)發(fā),提升了系統(tǒng)的可靠性和可擴(kuò)展性。
[0068] 如圖3所示,日志數(shù)據(jù)被負(fù)載均衡器負(fù)載均衡到日志傳輸子系統(tǒng)的節(jié)點(diǎn)1和節(jié)點(diǎn) 2上,節(jié)點(diǎn)1和節(jié)點(diǎn)2又把各自接收到的日志數(shù)據(jù)分別發(fā)送給日志存儲子系統(tǒng)、內(nèi)存數(shù)據(jù)庫 及日志傳輸子系統(tǒng)的節(jié)點(diǎn)3上。而節(jié)點(diǎn)3實(shí)際上可以和營銷抽獎系統(tǒng)同在一臺服務(wù)器上, 節(jié)點(diǎn)3接收到日志數(shù)據(jù)后,直接調(diào)用營銷抽獎系統(tǒng)的判斷方法對該日志所對應(yīng)的業(yè)務(wù)是否 中獎進(jìn)行判斷。
[0069] 日志傳輸子系統(tǒng)中傳輸目的地都是可配置化的,新增或修改目的地配置可以即時(shí) 生效而無需重啟系統(tǒng),這樣可以避免了日志傳輸子系統(tǒng)在重啟過程中造成的日志丟失。
[0070] 圖4為本發(fā)明所述日志存儲子系統(tǒng)結(jié)構(gòu)圖。
[0071] 如圖4所示,日志存儲子系統(tǒng)包括第一數(shù)據(jù)分片路由器、主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié) 點(diǎn),主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)可以為服務(wù)器。
[0072] 日志數(shù)據(jù)經(jīng)由日志傳輸子系統(tǒng)傳輸給第一數(shù)據(jù)分片路由器,第一數(shù)據(jù)分片路由器 根據(jù)既定的數(shù)據(jù)分片規(guī)則將日志數(shù)據(jù)拆分到不同的主數(shù)據(jù)節(jié)點(diǎn)上,為了減少磁盤尋址的開 銷,系統(tǒng)以固定大小的塊為單位存儲數(shù)據(jù),同時(shí)主數(shù)據(jù)節(jié)點(diǎn)會將數(shù)據(jù)復(fù)制給從數(shù)據(jù)節(jié)點(diǎn)作 為數(shù)據(jù)的一個(gè)備份,這樣在主數(shù)據(jù)節(jié)點(diǎn)出現(xiàn)故障數(shù)據(jù)丟失時(shí),還能通過從數(shù)據(jù)節(jié)點(diǎn)恢復(fù)數(shù) 據(jù)。根據(jù)需要一個(gè)主數(shù)據(jù)節(jié)點(diǎn)可以同時(shí)擁有多個(gè)從數(shù)據(jù)節(jié)點(diǎn)。
[0073] 為了進(jìn)一步提高日志存儲子系統(tǒng)的讀寫性能(可用性),根據(jù)分布式系統(tǒng)的CAP原 則必須要在數(shù)據(jù)一致性和系統(tǒng)可用性之間進(jìn)行權(quán)衡,這需要犧牲數(shù)據(jù)的部分一致性來換取 系統(tǒng)的高可用性,因此上述的主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)間的數(shù)據(jù)復(fù)制過程實(shí)際是異步進(jìn)行 的,這導(dǎo)致從數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)在同一時(shí)間和主數(shù)據(jù)節(jié)點(diǎn)相比不是最新的,所以系統(tǒng)并不保 證數(shù)據(jù)的強(qiáng)一致性(即不保證當(dāng)數(shù)據(jù)更新完成,后續(xù)所有訪問都能獲得最新的值),但是系 統(tǒng)會保證數(shù)據(jù)的最終一致性,即在短暫的一段時(shí)間后最終所有的訪問都將獲得最后的更新 值。而這種主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)短暫不一致的情況對于后面要使用這些數(shù)據(jù)的 批量數(shù)據(jù)處理子系統(tǒng)來說是完全可以接受的。
[0074] 日志存儲子系統(tǒng)可以通過簡單的水平擴(kuò)展,即增加主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)來存 儲更多的數(shù)據(jù),并能由此極大的提高數(shù)據(jù)讀寫的性能。
[0075] 圖5為本發(fā)明所述批量日志處理子系統(tǒng)結(jié)構(gòu)圖。
[0076] 如圖5所示,批量日志處理子系統(tǒng)包括第一 MapReduce任務(wù)管理單元、定時(shí)任務(wù)管 理單元、按小時(shí)報(bào)表生成單元、按天報(bào)表生成單元、第一數(shù)據(jù)查詢結(jié)果緩存單元和批量數(shù)據(jù) 查詢接口。
[0077] 批量日志處理子系統(tǒng)主要使用MapReduce算法對存儲在日志存儲子系統(tǒng)中的海 量日志數(shù)據(jù)進(jìn)行并行處理:MapReduce算法由Map (映射)任務(wù)和Reduce (歸約)任務(wù)組成, 其中Map任務(wù)是可以高度并行的(可以為輸入文件中的每個(gè)數(shù)據(jù)塊創(chuàng)建一個(gè)Map任務(wù))。 批量日志處理子系統(tǒng)的第一 MapReduce任務(wù)管理單元負(fù)責(zé)MapReduce任務(wù)的調(diào)度,它把許 多Map任務(wù)分發(fā)給日志存儲子系統(tǒng)上的每個(gè)節(jié)點(diǎn)(包括主數(shù)據(jù)節(jié)點(diǎn)和從數(shù)據(jù)節(jié)點(diǎn)),Map任 務(wù)在日志存儲子系統(tǒng)的節(jié)點(diǎn)上處理保存在該節(jié)點(diǎn)上的那部分日志數(shù)據(jù),當(dāng)所有的Map任務(wù) 都成功完成之后,第一 MapReduce任務(wù)管理單元將每個(gè)Map任務(wù)輸出的結(jié)果按其鍵值進(jìn)行 合并,并根據(jù)鍵值分發(fā)給指定的Reduce任務(wù)進(jìn)行統(tǒng)計(jì)(每個(gè)鍵分且僅分給一個(gè)Reduce任 務(wù)),最后第一 MapReduce任務(wù)管理單元再把每個(gè)Reduce任務(wù)處理的結(jié)果進(jìn)行合并輸出。 通過MapReduce算法先讓日志存儲子系統(tǒng)的節(jié)點(diǎn)自己處理保存在自己節(jié)點(diǎn)上的那部分日 志數(shù)據(jù),然后再把各個(gè)局部處理結(jié)果進(jìn)行匯總。這樣原本在一個(gè)磁盤上的查詢壓力就被分 散到許多不同的節(jié)點(diǎn)上,這使得大規(guī)模數(shù)據(jù)處理的性能和服務(wù)器節(jié)點(diǎn)數(shù)目基本成正比,理 論上節(jié)點(diǎn)數(shù)目越多系統(tǒng)性能越好,系統(tǒng)每秒讀寫操作次數(shù)=單機(jī)每秒讀寫操作次數(shù)X服 務(wù)器數(shù)量。
[0078] 定時(shí)任務(wù)管理單元用于使所述MapReduce任務(wù)管理單元定時(shí)對所述批量日志處 理子系統(tǒng)接收到的所述日志數(shù)據(jù)進(jìn)行批量預(yù)處理。
[0079] 為了進(jìn)一步提高報(bào)表系統(tǒng)的查詢效率,批量日志處理子系統(tǒng)會通過按小時(shí)報(bào)表生 成單元和按天報(bào)表生成單元對日志數(shù)據(jù)進(jìn)行預(yù)處理。預(yù)處理是以每小時(shí)及每天為時(shí)間跨度 定時(shí)按基本的維度對日志數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)處理,預(yù)處理形成的基礎(chǔ)報(bào)表會被存儲起來, 每天的基礎(chǔ)報(bào)表是根據(jù)每小時(shí)的基礎(chǔ)報(bào)表匯總得到的,而外圍報(bào)表系統(tǒng)實(shí)際就是在這些預(yù) 處理報(bào)表數(shù)據(jù)的基礎(chǔ)上進(jìn)行二次加工來滿足各種不同形態(tài)的業(yè)務(wù)需求。
[0080] 外部的業(yè)務(wù)報(bào)表系統(tǒng)通過訪問批量日志處理子系統(tǒng)提供的批量數(shù)據(jù)查詢接口來 進(jìn)行批量數(shù)據(jù)查詢,這種面向接口的設(shè)計(jì)有助于降低日志系統(tǒng)與周邊系統(tǒng)間的耦合度,同 時(shí)提尚系統(tǒng)的內(nèi)聚性。
[0081] 另外為了避免大量重復(fù)的數(shù)據(jù)查詢請求造成過大的壓力,批量日志處理子系統(tǒng)中 專門設(shè)計(jì)了第一數(shù)據(jù)查詢結(jié)果緩存單元來緩存以往的查詢結(jié)果,如果請求的結(jié)果在緩存中 存在則直接返回緩存中保存的結(jié)果,如果不存在則再到分布式存儲系統(tǒng)中查詢。因?yàn)榫彺?空間是有限的,所以需要一種合理的緩存淘汰算法,在限制緩存大小的情況下盡可能的提 高緩存命中率。批量日志處理子系統(tǒng)所使用的緩存淘汰算法對LRU(Least Recently User, 近期最少使用算法)和LFU(Least Frequent lyUsed,最不經(jīng)常使用算法)兩種常用淘汰算 法進(jìn)行了整合優(yōu)化,本發(fā)明使用的淘汰算法如下所示:
[0082] 1.判斷是否大于緩存上限。
[0083] 2.如大于,則淘汰某日期之前的緩存數(shù)據(jù)。
[0084] 淘汰規(guī)則:
[0085] 1.如近期被使用,則暫不淘汰(LRU):通過緩存訪問時(shí)間判斷。
[0086] 2.淘汰使用最少的緩存數(shù)據(jù)(LFU):通過