本發(fā)明涉及數(shù)據(jù)處理技術(shù),具體的講是一日志采集方法及系統(tǒng)。
背景技術(shù):
目前,電子商務和互聯(lián)網(wǎng)金融得到了快速發(fā)展。在線交易給用戶帶來便利性的同時,也面臨著潛在風險,如用戶賬戶盜用、金融詐騙和洗錢等。因此,企業(yè)對交易風險的監(jiān)控需求日益強烈。傳統(tǒng)企業(yè)對交易風險進行監(jiān)測時,通常在企業(yè)內(nèi)部設立風控部門,對用戶交易進行線下分析,發(fā)現(xiàn)可疑數(shù)據(jù)后進行干預處理。隨著大數(shù)據(jù)技術(shù)的發(fā)展,交易風險控制逐步進入數(shù)字化和智能化。借助大數(shù)據(jù)的手段,交易風險監(jiān)控不僅節(jié)省人力物力,提高工作效率,同時能夠有效減少經(jīng)濟犯罪導致的損失。日志數(shù)據(jù)是交易風險監(jiān)控利用大數(shù)據(jù)技術(shù)挖掘分析時其所需信息一項重要的來源,因此,各類日志采集系統(tǒng)在企業(yè)內(nèi)部得到了廣泛使用。
現(xiàn)有技術(shù)的眾多日志采集相關(guān)的產(chǎn)品中,flume是其中一款具有較高知名度的高性能分布式開源產(chǎn)品,它提供了可簡單配置的多層采集架構(gòu),可支持從多種數(shù)據(jù)源高效收集日志數(shù)據(jù)并保存到中央數(shù)據(jù)倉庫。但是,現(xiàn)有技術(shù)的日志采集方式為按文件粒度采集數(shù)據(jù),即等待文件生成后再進行采集。由于其采集速度受限,對于一些時效性需求較高的業(yè)務,如在電子商務企業(yè)通過在線推薦用戶商品進行實時營銷、金融系統(tǒng)跟蹤客戶交易數(shù)據(jù)監(jiān)控交易風險等應用中,已無法滿足實時性的需求。
為了加快日志采集,現(xiàn)有技術(shù)中,flume提出了以tail-f方式逐行采集的方法,實現(xiàn)了日志的持續(xù)采集。但該方式存在以下不足,即,一旦應用服務發(fā)生重啟、日志內(nèi)容覆蓋或刪除等非常態(tài)事件,它會造成數(shù)據(jù)丟失或者采集到錯誤的半行數(shù)據(jù),導致后續(xù)的日志分析發(fā)生錯誤。
技術(shù)實現(xiàn)要素:
為了克服傳統(tǒng)日志采集中應對非常態(tài)事件的不足,導致數(shù)據(jù)丟失、日志分析錯誤等問題,本發(fā)明實施例提供了一種日志數(shù)據(jù)采集方法,方法包括:
預先將待采集日志數(shù)據(jù)的目標區(qū)域劃分為至少兩個采集區(qū)域,各采集區(qū)域均包括:數(shù)據(jù)中心和至少一個分支機構(gòu),日志存儲系統(tǒng)位于所述至少兩個采集區(qū)域其中之一的第一采集區(qū)域的數(shù)據(jù)中心;
采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心;
各采集區(qū)域的日志數(shù)據(jù)通過第一采集區(qū)域的數(shù)據(jù)中心的flume一級接收端存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,所述的采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心包括:
采集的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過位于分支機構(gòu)的flume接收端傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心的flume接收端。
本發(fā)明實施例中,所述的各采集區(qū)域的日志數(shù)據(jù)通過第一采集區(qū)域的數(shù)據(jù)中心的flume一級接收端存儲至日志存儲系統(tǒng)包括:
采集的數(shù)據(jù)中心的web服務器的日志數(shù)據(jù),通過數(shù)據(jù)中心的flume二級接收端傳輸至第一采集區(qū)域的數(shù)據(jù)中心的flume一級接收端存儲至日志存儲系統(tǒng);
采集的第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng);
采集的非第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過對應的數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,非第一采集區(qū)域的數(shù)據(jù)中心的flume二級接收端通過高速網(wǎng)絡專線連接至flume一級接收端。
本發(fā)明實施例中,所述的采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心包括:
以數(shù)據(jù)塊為單位讀取web服務器的日志數(shù)據(jù)并寫入中轉(zhuǎn)隊列;
將中轉(zhuǎn)隊列中的日志數(shù)據(jù)發(fā)送至flume接收端;
根據(jù)所述flume接收端所在地類型確定日志數(shù)據(jù)的下游發(fā)送地。
本發(fā)明實施例中,所述的方法包括:
預先設定web服務器的日志數(shù)據(jù)的切分原則,所述的切分原則包括:以大小或時間對日志數(shù)據(jù)進行切分;
根據(jù)設定的web服務器的日志數(shù)據(jù)的切分原則生成存儲日志數(shù)據(jù)的日志文件。
本發(fā)明實施例中,所述的以數(shù)據(jù)塊為單位讀取web服務器的日志數(shù)據(jù)并寫入中轉(zhuǎn)隊列包括:
步驟1,將文件指針指向待采集的日志;
步驟2,從指定偏移量以數(shù)據(jù)塊為單位讀取當前日志文件中的日志數(shù)據(jù);
步驟3,從數(shù)據(jù)塊中逐一讀取字符放入緩存;
步驟4,按行提取緩存中的字符寫入中轉(zhuǎn)隊列。
本發(fā)明實施例中,所述的從數(shù)據(jù)塊中逐一讀取字符放入緩存包括:
判斷是否讀取到新的字符以確定是否為數(shù)據(jù)塊尾;
確定讀取到的為數(shù)據(jù)塊尾,則執(zhí)行步驟2。
本發(fā)明實施例中,所述的按行提取緩存中的字符寫入中轉(zhuǎn)隊列包括:
判斷讀取到新的字符是否為換行符;
確定讀取到的字符為換行符,提取緩存中的字符寫入中轉(zhuǎn)隊列;
確定讀取到的字符不是換行符,則執(zhí)行步驟3。
本發(fā)明實施例中,確定讀取到的為數(shù)據(jù)塊尾執(zhí)行步驟2之前,進一步執(zhí)行日志異常檢測,
確定日志異常,則重置指針偏移量后執(zhí)行步驟2。
本發(fā)明實施例中,在執(zhí)行步驟2之前進一步包括:判斷是否有新增的日志文件;其中,
確定沒有新增日志文件,執(zhí)行步驟2;
確定有新增日志文件,則在讀取完當前日志文件后指定新增的日志文件為下一個待讀取的日志文件。
本發(fā)明實施例中,在執(zhí)行步驟3之前包括:
判斷是否讀取到數(shù)據(jù)塊;
確定讀取到數(shù)據(jù)塊,則執(zhí)行步驟3;
確定未讀取到數(shù)據(jù)塊,則進行等待預設的指定時間。
本發(fā)明實施例中,確定未讀取到數(shù)據(jù)塊,等待預設的指定時間之后,執(zhí)行日志異常檢測,日志異常則重置指針偏移量后執(zhí)行步驟判斷是否有新增的日志文件。
同時,本發(fā)明還提供一種日志數(shù)據(jù)采集系統(tǒng),包括:
區(qū)域劃分裝置,用于將待采集日志數(shù)據(jù)的目標區(qū)域劃分為至少兩個采集區(qū)域,各采集區(qū)域均包括:數(shù)據(jù)中心和至少一個分支機構(gòu),日志存儲系統(tǒng)位于所述至少兩個采集區(qū)域其中之一的第一采集區(qū)域的數(shù)據(jù)中心;
日志數(shù)據(jù)采集裝置,用于采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心;
flume一級接收端,設置于所述第一采集區(qū)域的數(shù)據(jù)中心,用于將各采集區(qū)域的日志數(shù)據(jù)存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,所述的日志數(shù)據(jù)采集裝置包括:
采集客戶端,設置于所述各分支機構(gòu)和數(shù)據(jù)中心,采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù);
flume接收端,設置于所述各分支結(jié)構(gòu)和數(shù)據(jù)中心;其中,
采集的數(shù)據(jù)中心的web服務器的日志數(shù)據(jù),通過數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng);
采集的第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至flume一級接收端存儲至日志存儲系統(tǒng);
采集的非第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至對應的數(shù)據(jù)中心的二級接收端,并通過數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,非第一采集區(qū)域的數(shù)據(jù)中心的flume二級接收端通過高速網(wǎng)絡專線連接至flume一級接收端。
本發(fā)明實施例中,所述的采集裝置包括:
讀取模塊,以數(shù)據(jù)塊為單位讀取web服務器的日志數(shù)據(jù)并寫入中轉(zhuǎn)隊列;
中轉(zhuǎn)模塊,用于將中轉(zhuǎn)隊列中的日志數(shù)據(jù)發(fā)送至flume接收端;
所述flume接收端根據(jù)所在地類型確定日志數(shù)據(jù)的下游發(fā)送地。
本發(fā)明實施例中,所述讀取模塊包括:
原則預設單元,用于預先設定web服務器的日志數(shù)據(jù)的切分原則,所述的切分原則包括:以大小或時間對日志數(shù)據(jù)進行切分;
切分單元,用于根據(jù)設定的web服務器的日志數(shù)據(jù)的切分原則生成存儲日志數(shù)據(jù)的日志文件。
本發(fā)明實施例中,所述的讀取模塊以數(shù)據(jù)塊為單位讀取web服務器的日志數(shù)據(jù)并寫入中轉(zhuǎn)隊列包括:
步驟1,將文件指針指向待采集的日志;
步驟2,從指定偏移量以數(shù)據(jù)塊為單位讀取當前日志文件中的日志數(shù)據(jù);
步驟3,從數(shù)據(jù)塊中逐一讀取字符放入緩存;
步驟4,按行提取緩存中的字符寫入中轉(zhuǎn)隊列。
本發(fā)明實施例中,所述的讀取模塊還包括:日志異常檢測模塊,用于執(zhí)行日志異常檢測。
本發(fā)明實施例中,所述的讀取模塊還包括:
塊尾判斷單元,用于判斷是否讀取到新的字符以確定是否為數(shù)據(jù)塊尾;
確定讀取到的為數(shù)據(jù)塊尾,則執(zhí)行步驟2。
本發(fā)明實施例中,所述讀取模塊還包括:
換行符判斷單元,用于判斷讀取到新的字符是否為換行符;
確定讀取到的字符為換行符,提取緩存中的字符寫入中轉(zhuǎn)隊列;
確定讀取到的字符不是換行符,則執(zhí)行步驟3。
本發(fā)明實施例中,確定讀取到的為數(shù)據(jù)塊尾執(zhí)行步驟2之前,日志異常檢測模塊執(zhí)行日志異常檢測,確定日志異常,則重置指針偏移量后執(zhí)行步驟2。
本發(fā)明實施例中,在讀取模塊還包括:
新增日志判斷單元,用于判斷是否有新增的日志文件;其中,
確定沒有新增日志文件,執(zhí)行步驟2;
確定有新增日志文件,則在讀取完當前日志文件后指定新增的日志文件為下一個待讀取的日志文件。
本發(fā)明實施例中,在讀取模塊還包括:
數(shù)據(jù)塊判斷單元,用于判斷是否讀取到數(shù)據(jù)塊;
確定讀取到數(shù)據(jù)塊,則執(zhí)行步驟3;
確定未讀取到數(shù)據(jù)塊,則進行等待預設的指定時間。
確定未讀取到數(shù)據(jù)塊,等待預設的指定時間之后,利用所述日志異常檢測模塊執(zhí)行日志異常檢測,日志異常則重置指針偏移量后執(zhí)行步驟判斷是否有新增的日志文件。
本發(fā)明提出改進的日志采集方案,結(jié)合高可用性、高可靠性、高時效等特性為一體,提高工作效率。采用本技術(shù)可以提高日志數(shù)據(jù)采集效率和可靠性,保證生產(chǎn)系統(tǒng)正常運行。
為讓本發(fā)明的上述和其他目的、特征和優(yōu)點能更明顯易懂,下文特舉較佳實施例,并配合所附圖式,作詳細說明如下。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明公開的日志數(shù)據(jù)采集方法的流程圖;
圖2為本發(fā)明一實施方式的日志實時采集系統(tǒng)的示意圖;
圖3為本發(fā)明實施例中日志實時采集的流程圖;
圖4為本發(fā)明實施例中日志實時采集系統(tǒng)的采集算法流程圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
本發(fā)明提供一種日志數(shù)據(jù)采集方法,如圖1所示,該方法包括:
步驟s101,預先將待采集日志數(shù)據(jù)的目標區(qū)域劃分為至少兩個采集區(qū)域,各采集區(qū)域均包括:數(shù)據(jù)中心和至少一個分支機構(gòu),日志存儲系統(tǒng)位于所述至少兩個采集區(qū)域其中之一的第一采集區(qū)域的數(shù)據(jù)中心;
步驟s102,采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心;
步驟s103,各采集區(qū)域的日志數(shù)據(jù)通過第一采集區(qū)域的數(shù)據(jù)中心的flume一級接收端存儲至日志存儲系統(tǒng)。
其中,上述的采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心包括:
采集的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過位于分支機構(gòu)的flume接收端傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心的flume接收端。
采集的數(shù)據(jù)中心的web服務器的日志數(shù)據(jù),通過數(shù)據(jù)中心的flume二級接收端傳輸至第一采集區(qū)域的數(shù)據(jù)中心的flume一級接收端存儲至日志存儲系統(tǒng);
采集的第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng);
采集的非第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過對應的數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,非第一采集區(qū)域的數(shù)據(jù)中心的flume二級接收端通過高速網(wǎng)絡專線連接至flume一級接收端。
如圖2所示為本發(fā)明一實施方式的日志實時采集系統(tǒng)的示意圖,本實施例中預先根據(jù)采集地理位置劃分出多個區(qū)域,首先將日志待采集的目標區(qū)域初步劃分為區(qū)域1和區(qū)域2,在區(qū)域1和區(qū)域2分別設立一個數(shù)據(jù)中心,數(shù)據(jù)中心1負責收集區(qū)域1的日志數(shù)據(jù),數(shù)據(jù)中心2則負責收集存儲包括區(qū)域1和區(qū)域2的日志數(shù)據(jù)。
本實施例中數(shù)據(jù)中心1和數(shù)據(jù)中心2之間架設一條網(wǎng)絡專線,數(shù)據(jù)中心1的日志數(shù)據(jù)可通過該通道高速傳輸至數(shù)據(jù)中心2。進一步地,在具體部署采集作業(yè)時,細分出數(shù)據(jù)中心1、數(shù)據(jù)中心2、分支機構(gòu)1和分支機構(gòu)2這四類日志采集區(qū)域。本發(fā)明實施例中,分支機構(gòu)1和分支機構(gòu)2同數(shù)據(jù)中心1和數(shù)據(jù)中心2的區(qū)別在于,分支機構(gòu)僅用于收集機構(gòu)內(nèi)部的日志數(shù)據(jù),數(shù)據(jù)中心則收集、匯總包括本數(shù)據(jù)中心和所屬區(qū)域內(nèi)全部分支機構(gòu)(若部署有多個分支機構(gòu))的日志數(shù)據(jù)。
本實施例中數(shù)據(jù)中心2為日志存儲系統(tǒng)所在地,數(shù)據(jù)中心2在處理本區(qū)域內(nèi)日志數(shù)據(jù)的基礎(chǔ)上會進一步收集其他數(shù)據(jù)中心的日志數(shù)據(jù)。需要說明的是,本發(fā)明實施例中上述劃分方法不具有絕對性,可根據(jù)每個采集案例的實際情況基于“分而治之”的思想進行最佳劃分。
在采集區(qū)內(nèi)部,設有一個小型采集系統(tǒng),采集系統(tǒng)由多個采集客戶端和多個flume接收端組成,運行于一個局域網(wǎng)內(nèi)網(wǎng)環(huán)境中。采集客戶端以無侵入的方式運行在web應用服務器上,負責實時采集本地服務器上的日志,由于其占用web應用服務器的計算資源較小,不會對服務器的業(yè)務應用產(chǎn)生壓力。
本發(fā)明對客戶端日志采集進行了高可用性、高可靠性、高實效性的創(chuàng)新設計。為了追求遠程傳輸數(shù)據(jù)的低耗時,本發(fā)明引入了一條高速網(wǎng)絡通道,距離較遠的采集區(qū)域的日志數(shù)據(jù)則可通過該高速通道傳輸至日志存儲系統(tǒng)所在地;為了減輕日志存儲系統(tǒng)hdfs的文件寫入壓力和系統(tǒng)開銷,本發(fā)明設計了多層級flume模式,數(shù)據(jù)只能通過flume端逐級寫入hdfs。采用本技術(shù)可以提高日志數(shù)據(jù)采集效率和可靠性,保證生產(chǎn)系統(tǒng)正常運行。
本實施例中flume接收端運行在flume服務器中,負責實時收集匯總數(shù)據(jù)發(fā)送至下游節(jié)點,其采用的技術(shù)為成熟的flume采集技術(shù)。在這里,所述下游節(jié)點為flume接收端的日志數(shù)據(jù)發(fā)送終端,下游節(jié)點既可能是flume接收端,也可能是日志存儲系統(tǒng)。各個小型采集系統(tǒng)的數(shù)據(jù)最后歸總到某個采集系統(tǒng)的日志存儲系統(tǒng)中進行后續(xù)挖掘處理,在本發(fā)明案例該系統(tǒng)為數(shù)據(jù)中心2的hdfs文件系統(tǒng)。為了合理利用服務器資源,上述部署策略遵循簡單、靈活的原則,不管是數(shù)據(jù)中心還是分支機構(gòu)內(nèi)部,采集客戶端和flume接收端的數(shù)目根據(jù)采集任務量的大小靈活調(diào)整。
根據(jù)flume接收端相對hdfs文件系統(tǒng)的位置屬性,對flume進行了多層級設置。其中,一級flume接收端負責接收來自二級flume端的日志數(shù)據(jù)并匯總寫入hdfs系統(tǒng),二級flume接收端負責接收三級flume接收端的日志數(shù)據(jù)并轉(zhuǎn)發(fā)至一級flume接收端中,依次類推。在這里,級別的設置僅用于區(qū)分本級別flume接收端將日志數(shù)據(jù)最終傳輸?shù)絟dfs文件系統(tǒng)需要經(jīng)過的flume接收端個數(shù),其功能并無區(qū)別。例如,三級flume接收端需要經(jīng)過三個flume接收端(包括本端)最終才能存儲到hdfs文件系統(tǒng)。flume接收端直接的數(shù)據(jù)傳輸采用avro協(xié)議。以圖1中數(shù)據(jù)中心2為例,中心內(nèi)設有二個層級的flume采集端,二級flume端將采集客戶端采集的日志后轉(zhuǎn)發(fā)給一級flume端,一級flume端負責接收來自中心內(nèi)部、數(shù)據(jù)中心1和分支機構(gòu)2二級flume端的數(shù)據(jù)并寫入hdfs。而在數(shù)據(jù)中心1和分支機構(gòu)2內(nèi)部,僅設有單層的二級flume接收端,負責將日志數(shù)據(jù)傳輸至數(shù)據(jù)中心2的一級接收端中轉(zhuǎn)后再存入hdfs。不同的是,由于分支機構(gòu)2在地理位置上距離數(shù)據(jù)中心2較近,數(shù)據(jù)傳輸走普通網(wǎng)絡線路,數(shù)據(jù)中心1的數(shù)據(jù)可借助數(shù)據(jù)中心1和2的網(wǎng)絡專線獲得更高傳輸性能。對于分支機構(gòu)1,采集客戶端的數(shù)據(jù)先經(jīng)由flume三級接收端轉(zhuǎn)發(fā)至數(shù)據(jù)中心1的flume二級接收端,最后同數(shù)據(jù)中心2的數(shù)據(jù)一起經(jīng)由高速網(wǎng)絡通道存入hdfs。
需要說明的是,以上實施例中采集客戶端、flume接收端的數(shù)目、形態(tài)設計未按實際實施情況繪制,在實際實施時采集客戶端、flume接收端的具體數(shù)目、形態(tài)可能隨意變化,布局形態(tài)也更為復雜。
在本發(fā)明日志實時采集系統(tǒng)中,日志數(shù)據(jù)流先后經(jīng)過采集客戶端和flume的三級、二級和一級接收端,最后流入hdfs的日志存儲系統(tǒng)。本實施例中無論是采集客戶端還是flume接收端,其內(nèi)部構(gòu)造具有相同的特征,即,內(nèi)部構(gòu)造分為讀數(shù)模塊和發(fā)數(shù)模塊。其特征還在于,兩者共同管理維護一個日志數(shù)據(jù)中轉(zhuǎn)隊列,該中轉(zhuǎn)隊列用于緩存日志數(shù)據(jù),讀數(shù)模塊和發(fā)數(shù)模塊異步地對該隊列進行讀/寫操作,互不干涉對方模塊的運行。如圖3所示為本發(fā)明實施例中日志實時采集的流程圖。
步驟101:日志采集客戶端的讀數(shù)模塊將指針指向待采集的文件,動態(tài)地以數(shù)據(jù)塊為單位讀數(shù)并解析放入隊列
本實施例中,web服務器端的應用程序?qū)⑾到y(tǒng)應用的日志數(shù)據(jù)以日志文件為基本單位,存放于日志采集目錄中進行管理。為了避免單個日志文件過大而難以查看,可通過指定大小和時間控制每個日志文件的容量,因此在日志采集目錄含有多個日志文件,其中一個為當前日志文件,其余為日志歸檔文件。應用程序預先設定日志切分原則,目前支持以大小和時間兩種切分方式。若以日志大小切分,則確保每個日志文件為既定大?。蝗粢詴r間切分,則確保每分鐘生成一個日志文件。當前日志文件數(shù)據(jù)生成量一旦達到切分要求,則停止在當前文件進行寫入,同時生成新的用于寫入數(shù)據(jù)的日志文件。應用程序?qū)斍叭罩疚募砑訑?shù)字后綴變成歷史歸檔文件,而新生成的文件沿用當前日志文件的名字。
讀數(shù)模塊在采集日志數(shù)據(jù)時,逐一對新生成的日志文件進行逐塊讀取。具體地,所述模塊將讀數(shù)指針指向當前日志文件,每次以數(shù)據(jù)塊為基本單位一次讀取一段日志內(nèi)容,從讀取的內(nèi)容解析出一行行日志。若在某次讀數(shù)時發(fā)現(xiàn)日志無新數(shù)據(jù)生成,所述模塊會將指針指向下一次日志讀取位置,停止指定的時間,等待新的日志內(nèi)容生成。等待時間結(jié)束后,所述模塊先去判斷等待的時間段內(nèi)是否生成新的日志文件。若是,則說明先前讀取日志文件不再有新數(shù)據(jù)生成,所述模塊先從上一次指針指向位置起讀完先前文件的剩余內(nèi)容,然后將指針指向新生成的文件開始讀取新的數(shù)據(jù)。若無,則說明先前讀取的日志文件還未到切換指定容量,所述模塊繼續(xù)以數(shù)據(jù)塊的方式讀取內(nèi)容并解析。進一步的,在日志采集過程中,添加日志異常檢測的步驟,對于日志被刪除或內(nèi)容覆蓋等問題及時修正采集策略,保證所采集數(shù)據(jù)的正確性完整性。上述采集算法步驟的詳細描述見圖3。
步驟102:日志采集客戶端的發(fā)數(shù)模塊負責從客戶端的中轉(zhuǎn)隊列中讀取數(shù)據(jù)行發(fā)送到下游flume服務器。
每個客戶端內(nèi)部配置有下游可發(fā)送數(shù)據(jù)的flume接收端地址列表,所述發(fā)數(shù)模塊與flume接收端之間的連接采用負載均衡機制。當采集客戶端啟動后,所述發(fā)數(shù)模塊從這個列表中隨機選擇一個地址,向該地址所對應的flume接收端建立長連接。為提高發(fā)送效率,所述發(fā)數(shù)模塊每次可從中轉(zhuǎn)隊列中讀取若干條數(shù)據(jù)行,數(shù)據(jù)行數(shù)目為預設值,若中轉(zhuǎn)隊列剩余數(shù)據(jù)行數(shù)小于該預設值,則讀取剩余行數(shù)。所述模塊將讀取的數(shù)據(jù)行打包成一個數(shù)據(jù)包,通過tcp協(xié)議發(fā)送到相應的flume接收端。
步驟103:根據(jù)flume接收端服務器的所在地的類型選擇下游發(fā)送地。
根據(jù)flume接收端服務器的所在區(qū)域的不同特性,不同區(qū)域的flume接收端在進行數(shù)據(jù)傳輸時相對應的采用不同的處理方式。
如圖3中所示,判斷flume服務器所在區(qū)域為分支機構(gòu)1,則將數(shù)據(jù)發(fā)送至數(shù)據(jù)中心1,轉(zhuǎn)向步驟104;判斷flume服務器所在區(qū)域為數(shù)據(jù)中心1或者分支機構(gòu)2,則將數(shù)據(jù)發(fā)送至數(shù)據(jù)中心2,轉(zhuǎn)向步驟105;判斷flume服務器所在區(qū)域為數(shù)據(jù)中心2,則無需將數(shù)據(jù)發(fā)送至外部區(qū)域,轉(zhuǎn)向步驟106。
步驟104:數(shù)據(jù)中心1的flume三級接收端將數(shù)據(jù)傳輸至位于數(shù)據(jù)中心1flume二級接收端。
位于分支機構(gòu)1的flume接收端在系統(tǒng)級別層面稱為三級接收端。flume接收端級別越高,數(shù)據(jù)傳輸需要通過的flume接收端越多,耗費的傳輸時間也隨之越多。若通過普通線路直接將數(shù)據(jù)傳輸至數(shù)據(jù)中心2,不利于保證數(shù)據(jù)傳輸?shù)臅r效性。為了避免高延遲,分支機構(gòu)1的flume接收端將數(shù)據(jù)轉(zhuǎn)發(fā)至數(shù)據(jù)中心1,由數(shù)據(jù)中心1的flume接收端進行下一步高速網(wǎng)絡通道的數(shù)據(jù)傳輸。經(jīng)過實驗測試驗證,這樣的二次傳輸方式在傳輸時間上遠小于直接的遠程傳輸。
步驟105:數(shù)據(jù)中心1、分支機構(gòu)2將數(shù)據(jù)分別以高速通道、普通網(wǎng)絡的不同方式傳輸至數(shù)據(jù)中心2的一級flume端。
位于數(shù)據(jù)中心1和分支機構(gòu)2的flume接收端在系統(tǒng)級別層面稱為二級接收端。flume二級接收端可將其接收的數(shù)據(jù)直接傳輸至數(shù)據(jù)中心2的flume一級接收端。本實施例中由于數(shù)據(jù)中心1和數(shù)據(jù)中心2直接架設有一條高速網(wǎng)絡通路,因此,數(shù)據(jù)中心1的flume接收端可通過該高速通道將數(shù)據(jù)傳輸至數(shù)據(jù)中心2。分支機構(gòu)2則通過普通網(wǎng)絡線路將數(shù)據(jù)傳輸至數(shù)據(jù)中心2。
步驟106:數(shù)據(jù)中心2的flume一級接收端接收來自本中心內(nèi)外的數(shù)據(jù),最終上傳至hdfs。
數(shù)據(jù)中心2的flume一級接收端不僅接收來自本地二級接收端的日志數(shù)據(jù),同樣接收來自分支機構(gòu)2和數(shù)據(jù)中心1的二級接收端的日志數(shù)據(jù)。本發(fā)明系統(tǒng)采用將各區(qū)域的日志數(shù)據(jù)經(jīng)由flume一級接收端匯總整合的方式,而不是各區(qū)域的日志數(shù)據(jù)各自獨立上傳至hdfs日志存儲系統(tǒng)。這樣設計的原因之一在于,flume一級接收端在匯總數(shù)據(jù)過程中可合并同一服務應用相關(guān)的日志數(shù)據(jù),減少最終日志文件的數(shù)目,從而緩解hdfs文件系統(tǒng)對大量小文件存儲的壓力。原因之二,本系統(tǒng)設置只有flume一級接收端可訪問hdfs系統(tǒng),不僅便于hdfs的訪問管理,而且從網(wǎng)絡安全層面減少外部服務端破壞hdfs系統(tǒng)的可能性。
如圖4所示,為本發(fā)明實施例中日志實時采集系統(tǒng)的采集算法流程圖。本實施例中已知采集客戶端啟動后,若無外界強制中斷則可不停地進行日志采集工作。其讀數(shù)模塊反復使用同一套采集算法進行操作,具體算法流程如下:
步驟10101:文件指針指向待采集的日志,設置指針初始偏移量為0。
正常情況下,日志數(shù)據(jù)從文件首部開始進行收集,因此,讀文件指針首先指向日志文件數(shù)據(jù)的首行首字符。
步驟10102:判斷是否有新增的其他日志文件。
讀數(shù)模塊在每次從頭讀新日志文件的數(shù)據(jù)或者未讀到數(shù)據(jù)等待一段時間繼續(xù)讀數(shù)之前,必須進行上述判斷,若當前只有一個待采集的日志,則轉(zhuǎn)向步驟10103,若除指針指向的待采集日志之外又生成了新的日志文件,則轉(zhuǎn)向步驟10112。
步驟10103:文件指針從指定偏移量起以塊為單位讀取當前日志文件數(shù)據(jù)。
本發(fā)明以數(shù)據(jù)塊為基本單位進行數(shù)據(jù)讀取,數(shù)據(jù)塊是一段具有固定字節(jié)長度的日志數(shù)據(jù),只有在文件末尾讀到的最后一塊數(shù)據(jù)塊可能不足指定的字節(jié)長度。數(shù)據(jù)塊中含有若干數(shù)據(jù)行,數(shù)據(jù)塊的首部和尾部可能是不完整的半行數(shù)據(jù),數(shù)據(jù)行的提取步驟見步驟10105-步驟10108。
步驟10104:判斷是否讀到數(shù)據(jù)塊。
由于客戶端web服務器應用程序?qū)懭罩疚募莿討B(tài)的過程,讀數(shù)模塊無法確保每次都可讀到日志數(shù)據(jù)塊。因此每次完成一次讀取操作后,進行一次判斷,看是否真正讀到數(shù)據(jù)。若讀到數(shù)據(jù)則轉(zhuǎn)向步驟10105,若沒有讀到數(shù)據(jù)則轉(zhuǎn)向步驟10110。
步驟10105:從數(shù)據(jù)塊中逐一讀取字符并加入到動態(tài)字符數(shù)組末尾。
讀到一塊數(shù)據(jù)后,將該數(shù)據(jù)塊其放入采集客戶端的緩存中,緩存中負責存放待解析的數(shù)據(jù)。設一個指針專門負責掃描讀取緩存中的字符,緩存讀數(shù)指針從緩存第一個字符位置起讀取字符,將該字符加入一個動態(tài)字符數(shù)組末尾,然后掃描下一個字符。動態(tài)字符數(shù)組負責暫存數(shù)據(jù)行的中間數(shù)據(jù)狀態(tài),其長度隨存儲的字符的增加而增長。
如果上一次數(shù)據(jù)塊讀取完畢后動態(tài)字符數(shù)組中可能仍留存有部分數(shù)據(jù),本次數(shù)據(jù)塊解析時,動態(tài)字符數(shù)組會保留上次尚未提取的剩余數(shù)據(jù),將掃描到的新字符仍追加寫入動態(tài)字符數(shù)據(jù)尾部,直到解析出一整行數(shù)據(jù)再次進行提取操作。
步驟10106:判斷是否讀到數(shù)據(jù)塊結(jié)尾。
由于指針掃描讀取數(shù)據(jù)塊緩存的數(shù)據(jù)字符是一種循環(huán)讀取操作,因此每次讀取后判斷是否讀到新的字符,若讀到說明該數(shù)據(jù)塊尚未讀取完畢,則轉(zhuǎn)向步驟10107;若發(fā)現(xiàn)無法讀到新的字符,即數(shù)據(jù)塊結(jié)尾,則說明當前數(shù)據(jù)塊已經(jīng)完成讀取,需提取新數(shù)據(jù)塊讀取,轉(zhuǎn)向步驟10109。
步驟10107:判斷新讀取的字符是否滿足數(shù)據(jù)行提取要求。
若最新讀取的字符為換行符’\n’,則說明動態(tài)字符數(shù)組滿足數(shù)據(jù)行提取要求,轉(zhuǎn)向步驟10108;若該字符為非換行符的普通字符,則繼續(xù)下一字符的讀取,轉(zhuǎn)向步驟10105。
步驟10108:解析提取一條數(shù)據(jù)行,將該數(shù)據(jù)行寫入客戶端的中轉(zhuǎn)隊列。
動態(tài)字符數(shù)組存儲的數(shù)據(jù)已滿足數(shù)據(jù)行的提取要求,將其數(shù)據(jù)行拷貝至中轉(zhuǎn)隊列后清空動態(tài)字符數(shù)組的內(nèi)容。
步驟10109:日志異常檢測,若異常則重置指針偏移量。
在讀取下一個的數(shù)據(jù)塊之前,需要進行日志異常檢測。這是由于客戶端web服務器應用程序在運行過程中可能發(fā)生重啟或停機等異常,則對應的日志文件內(nèi)容發(fā)生變化,例如,原有日志文件被新的日志數(shù)據(jù)從頭覆蓋。日志異常檢測的流程如下,首先,讀數(shù)模塊更新下一次讀日志的偏移量,新的偏移量即本次讀日志的偏移量加上所讀數(shù)據(jù)塊字節(jié)長度。其次,將當前日志文件大小與該偏移量值進行比較,為后續(xù)表達清楚,設新的偏移量值為a值,當前日志文件大小為b值。若a值大于b值,則斷定日志文件發(fā)生覆寫異常。這時,日志數(shù)據(jù)需從頭讀起,重置下一次讀日志文件的指針偏移量為0。若a值小于b值,則需進一步獲取動態(tài)字符數(shù)組存儲的字符數(shù)(設為c值),從日志文件的讀指針移動至(a-c,即指針原位置處)偏移量處,掃到的第一個字符應為新行首字符,于是再向前挪動一個字符位置,掃描該字符內(nèi)容并判斷。若該內(nèi)容不是換行符’\n’,則說明發(fā)生覆寫異常,應重置下一次讀日志文件的指針偏移量為0。若該內(nèi)容應為換行符’\n’,說明未發(fā)生異常情況。下一次讀文件的指針偏移量為a值。
步驟10110:讀不到數(shù)據(jù),等待指定時間。
若在一段時間內(nèi)web服務器端沒有日志數(shù)據(jù)寫入文件,指針定為到文件尾部則讀不到數(shù)據(jù)內(nèi)容。采集客戶端無法預測何時可讀取新數(shù)據(jù),等待一段時間再嘗試讀取。
步驟10111:日志異常檢測,若異常則重置指針偏移量。
步驟10111與步驟10109類似,不再贅述。有所區(qū)別的是,若未檢測到日志異常,步驟10109中下一次讀日志的偏移量是本次偏移量的基礎(chǔ)上增加所讀數(shù)據(jù)塊字節(jié)長度(設為d值),即a+d。步驟10111中下一次讀日志的偏移量依舊是本次讀日志的偏移量,即a。
進一步的,對于部署在linux操作系統(tǒng)的客戶端,步驟10111比步驟10109多了一項關(guān)于是日志否有被刪除的監(jiān)測。具體的,當采集模塊在讀取預設次數(shù)后仍沒有取到數(shù)據(jù)塊,則觸發(fā)文件刪除的檢測。檢測時,會先判斷指定文件名的文件是否存在:若不存在指定文件名的文件,則直接判定當前文件已被刪除、新文件又未生成,此時則等待新文件生成;若存在指定文件名的文件,則通過現(xiàn)有的stat命令獲取指定文件名對應文件的“設備id+inode號(索引節(jié)點號)”字符串,和已打開文件的該字符串進行對比,若不同則判定原文件已被刪除、新文件又已生成,此時,將文件讀指針指向新文件,并且設置下一次讀日志的偏移量設為0。
步驟10112:從指定偏移量起以塊為單位循環(huán)讀完當前日志的剩余數(shù)據(jù),指定新增日志為下個處理文件。
需要說明的是,本實施例中,在進入步驟10112時,系統(tǒng)會先將當前指針指向的日志的數(shù)據(jù)讀取完畢,反復逐數(shù)據(jù)塊讀取并解析數(shù)據(jù)行,其過程與上述步驟10103-步驟10108類似,區(qū)別在于,由于新日志生成說明當前日志已經(jīng)寫滿,因此無需執(zhí)行步驟10104,即不再判斷每次讀取是否可讀到數(shù)據(jù)塊。隨后指針指向新增日志文件進行數(shù)據(jù)讀取。
為了提高日志采集的時效性,本發(fā)明采取在日志文件生成過程中動態(tài)采集日志數(shù)據(jù),每次按數(shù)據(jù)塊讀取并逐行解析,可持續(xù)傳輸日志數(shù)據(jù);為了保證數(shù)據(jù)采集的完整性,本發(fā)明在采集過程中實時監(jiān)測異常,一旦發(fā)現(xiàn)日志被刪除或覆蓋內(nèi)容則及時調(diào)整采集策略,避免讀取錯誤的日志數(shù)據(jù)。
同時,本發(fā)明還公開一種日志數(shù)據(jù)采集系統(tǒng),包括:
區(qū)域劃分裝置,預先將待采集日志數(shù)據(jù)的目標區(qū)域劃分為至少兩個采集區(qū)域,各采集區(qū)域均包括:數(shù)據(jù)中心和至少一個分支機構(gòu),日志存儲系統(tǒng)位于所述至少兩個采集區(qū)域其中之一的第一采集區(qū)域的數(shù)據(jù)中心;
日志數(shù)據(jù)采集裝置,設置于各分支機構(gòu)、數(shù)據(jù)中心,用于采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù),并將采集的各分支機構(gòu)的日志數(shù)據(jù)傳輸?shù)皆摲种C構(gòu)所在采集區(qū)域的數(shù)據(jù)中心;
flume一級接收端,設置于所述第一采集區(qū)域的數(shù)據(jù)中心,用于將采集的各采集區(qū)域的日志數(shù)據(jù)存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,所述的日志數(shù)據(jù)采集裝置包括:
采集客戶端,設置于所述各分支機構(gòu)和數(shù)據(jù)中心,采集各分支機構(gòu)和數(shù)據(jù)中心中的web服務器的日志數(shù)據(jù);
flume接收端,設置于各分支結(jié)構(gòu)和數(shù)據(jù)中心;其中,
采集的數(shù)據(jù)中心的web服務器的日志數(shù)據(jù),通過數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng);
采集的第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至flume一級接收端存儲至日志存儲系統(tǒng);
采集的非第一采集區(qū)域的分支機構(gòu)的web服務器的日志數(shù)據(jù),通過該分支機構(gòu)的flume接收端傳輸至對應的數(shù)據(jù)中心的二級接收端,并通過數(shù)據(jù)中心的flume二級接收端傳輸至所述flume一級接收端存儲至日志存儲系統(tǒng)。
本發(fā)明實施例中,非第一采集區(qū)域的數(shù)據(jù)中心的flume二級接收端通過高速網(wǎng)絡專線連接至flume二級接收端。
本發(fā)明的日志實時采集系統(tǒng)在全局部署策略上采用多層級flume服務器模式,即在每個采集區(qū)域內(nèi)部設置若干flume服務器將日志采集中轉(zhuǎn),最后由hdfs所在采集區(qū)的若干flume服務器匯總各個采集區(qū)的日志并寫入hdfs。這種設計模式,第一,避免了大量flume服務器對hdfs直接讀寫造成的系統(tǒng)壓力,同時避免了hdfs因存儲大量小文件而導致的namenode性能降低問題;第二,將遠程傳輸數(shù)據(jù)、將數(shù)據(jù)寫至hdfs這兩個開銷較大的io操作解耦和設計,避免了數(shù)據(jù)中心1將數(shù)據(jù)直接發(fā)送至數(shù)據(jù)中心2hdfs的巨大通訊延時;第三,便于hdfs訪問的統(tǒng)一管理,同時從網(wǎng)絡安全層面減少了防火墻白名單的地址。
而在采集客戶端內(nèi)部日志采集算法設計上,本發(fā)明采集方法不僅能夠以行為單位采集收集日志,提高了日志采集的時效性,而且屏蔽了web服務器應用重啟、停機等異常對本發(fā)明采集系統(tǒng)的影響。采集系統(tǒng)在異常情況發(fā)生后依舊正常運行,精準地采集到日志內(nèi)容,同flume自帶的采集方法相比有效避免了讀半行數(shù)據(jù)的現(xiàn)象。
本領(lǐng)域內(nèi)的技術(shù)人員應明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
本發(fā)明中應用了具體實施例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式及應用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應理解為對本發(fā)明的限制。