一種實時多維數(shù)據(jù)的分析及同步系統(tǒng)
多維分析技術(shù)是一種被廣泛應(yīng)用的數(shù)據(jù)分析技術(shù),本人在實際項目中使用開源OLAP框架Mondrian及關(guān)系型數(shù)據(jù)庫MySQL,嘗試設(shè)計并實現(xiàn)了一套多維數(shù)據(jù)的分析及同步系統(tǒng),以解決現(xiàn)有技術(shù)對于互聯(lián)網(wǎng)上實時流動變化數(shù)據(jù)無法進行快速有效的多維度分析的問題。這里是對該方案的詳細描述。
1. 系統(tǒng)內(nèi)部模塊
下圖所示為該系統(tǒng)的內(nèi)部模塊結(jié)構(gòu),分為:實時數(shù)據(jù)收集模塊,實時計算模塊,實時同步模塊,關(guān)系型數(shù)據(jù)庫,數(shù)據(jù)加載模塊,多維數(shù)據(jù)展現(xiàn)組件,多維數(shù)據(jù)分析引擎(Mondrian),緩存更新模塊。

1)實時數(shù)據(jù)收集模塊:該模塊是系統(tǒng)的數(shù)據(jù)源,通過實時地、不間斷地采集指定網(wǎng)站的用戶訪問日志數(shù)據(jù),為系統(tǒng)提供具有固定格式的日志數(shù)據(jù),這些數(shù)據(jù)的特點是具有各個維度的用戶訪問信息,如訪問時間、訪客唯一標識、訪問來源URL、訪問URL、訪客IP地址等。
2)實時計算模塊:根據(jù)實時數(shù)據(jù)收集模塊收集到的日志數(shù)據(jù),提取其中有用的字段,如訪問時間、訪客唯一標識、訪問來源URL、訪問URL、訪客IP地址等用于多維分析的字段,通過在內(nèi)存中進行實時計算,完成從原始日志數(shù)據(jù)到維度數(shù)據(jù)的轉(zhuǎn)換,得到對應(yīng)維度下的各項計算指標,如訪問PV量、訪問點擊量等。
3)實時同步模塊:周期性地將實時計算模塊實時計算的結(jié)果和關(guān)系型數(shù)據(jù)庫(MySQL)中的歷史數(shù)據(jù)進行同步與合并處理,具體分為兩步操作:
a)對于事實表,則直接將實時計算模塊中的計算結(jié)果插入到事實表中;
b)對于聚合表,則判斷關(guān)系型數(shù)據(jù)庫中是否存在對應(yīng)維度下的計算指標結(jié)果:
- 若不存在,則直接將計算結(jié)果作為一條新的記錄插入關(guān)系型數(shù)據(jù)庫的聚合表中;
- 否則存在,則首先查詢關(guān)系型數(shù)據(jù)庫得到對應(yīng)維度下的歷史結(jié)果,然后和實時計算模塊新累加的計算結(jié)果進行合并后得到最新的計算結(jié)果,并更新寫入關(guān)系型數(shù)據(jù)庫的聚合表中。
4)關(guān)系型數(shù)據(jù)庫:按照多維數(shù)據(jù)的格式,存儲實時計算模塊輸出的數(shù)據(jù);根據(jù)存儲數(shù)據(jù)類型的不同,分為事實表、維度表和聚合表。
結(jié)合實時同步模塊和關(guān)系型數(shù)據(jù)庫,下面是本系統(tǒng)中實現(xiàn)的多維數(shù)據(jù)同步算法的具體邏輯:
|
Step1:遍歷實時計算模塊中的每條計算結(jié)果記錄,對于其中的每條記錄: Step1.1:獲取各個維度信息及各項指標計算結(jié)果; Step1.2:將指標計算結(jié)果按照各個維度信息寫入關(guān)系型數(shù)據(jù)庫中的事實表中; Step1.3:對于關(guān)系型數(shù)據(jù)庫中的每張聚合表: Step1.3.1:從記錄中提取該聚合表中維度的值,查詢該聚合表中是否存在對應(yīng)維度下的歷史計算結(jié)果: Step1.3.2:若存在,則進行更新操作:根據(jù)維度信息,將關(guān)系型數(shù)據(jù)庫中的歷史結(jié)果和實時計算模塊中累加的計算結(jié)果進行合并后寫入關(guān)系型數(shù)據(jù)庫中; Step1.3.3:若不存在,則進行插入操作:直接根據(jù)維度信息,將實時計算模塊中累加的計算結(jié)果寫入到關(guān)系型數(shù)據(jù)庫中; Step2:清空實時計算模塊中累加的計算結(jié)果。周期性地重復(fù)步驟Step1~Step2。 |
5)數(shù)據(jù)加載模塊:由于關(guān)系型數(shù)據(jù)庫中為了加速對聚合表中數(shù)據(jù)的查詢與更新速度,聚合表往往采用內(nèi)存表的方式存儲,這樣當系統(tǒng)重新啟動時,聚合表中數(shù)據(jù)會丟失。因此需要在系統(tǒng)啟動后初始化階段,通過讀取事實表中的歷史結(jié)果數(shù)據(jù),按照聚合表的維度情況,通過預(yù)先進行聚合計算將結(jié)果加載到聚合表中,供多維數(shù)據(jù)分析引擎模塊查詢使用。
6)多維數(shù)據(jù)分析展現(xiàn)組件:通過MDX語句,與多維數(shù)據(jù)分析引擎模塊交互,得到相應(yīng)維度下的各項計算指標結(jié)果值。
7)多維數(shù)據(jù)分析引擎模塊:接收用戶通過多維數(shù)據(jù)分析展現(xiàn)組件發(fā)起的MDX查詢請求,首先在多維數(shù)據(jù)分析引擎的緩存中查找:若存在,則直接將結(jié)果返回給多維數(shù)據(jù)分析展現(xiàn)組件;否則,將MDX語句映射轉(zhuǎn)換為SQL語句,通過查詢關(guān)系型數(shù)據(jù)庫,得到數(shù)據(jù)庫表的查詢結(jié)果集。
8)緩存更新模塊:接收多維數(shù)據(jù)分析展現(xiàn)組件發(fā)起的請求,調(diào)用多維數(shù)據(jù)分析引擎模塊相關(guān)API接口清除系統(tǒng)緩存,然后通過重新執(zhí)行用戶查詢得到最新的結(jié)果,返回給多維數(shù)據(jù)分析展現(xiàn)組件。
2. 系統(tǒng)拓撲結(jié)構(gòu)
根據(jù)以上系統(tǒng)模塊結(jié)構(gòu)的介紹,下圖所示為本發(fā)明中一種實時多維數(shù)據(jù)的分析及同步系統(tǒng)的拓撲結(jié)構(gòu)示意圖:

1)數(shù)據(jù)收集服務(wù)器:實時采集網(wǎng)站的用戶訪問日志數(shù)據(jù),并發(fā)送給實時計算服務(wù)器。每次接收并轉(zhuǎn)發(fā)一行日志數(shù)據(jù),代表一個顧客的一次訪問記錄。
2)實時計算服務(wù)器:從數(shù)據(jù)收集服務(wù)器接收用于訪問日志數(shù)據(jù);提取其中的有用字段,轉(zhuǎn)換為對應(yīng)的維度信息;同時完成各項指標的計算;累積一定的時間周期后,將計算結(jié)果同步更新到數(shù)據(jù)庫服務(wù)器。
3)數(shù)據(jù)庫服務(wù)器:存儲多維數(shù)據(jù)的各項指標計算結(jié)果,作為數(shù)據(jù)源為數(shù)據(jù)加載服務(wù)器提供查詢服務(wù)。
4)數(shù)據(jù)加載服務(wù)器:用于系統(tǒng)啟動后讀取數(shù)據(jù)庫服務(wù)器中事實表和維度表中的數(shù)據(jù),初始化聚合表中的數(shù)據(jù)記錄,提供給多維數(shù)據(jù)分析引擎模塊查詢使用。
5)Web服務(wù)器:通過MDX語句,請求OLAP引擎服務(wù)器,得到請求維度下的各項計算指標結(jié)果值。
6)OLAP引擎服務(wù)器:將MDX語句解析為SQL語句,通過執(zhí)行SQL語句,查詢數(shù)據(jù)庫服務(wù)器,得到數(shù)據(jù)庫聚合表/事實表的查詢結(jié)果集,并返回給Web服務(wù)器。
7)緩存更新服務(wù)器:接收Web服務(wù)器發(fā)起的請求,調(diào)用OLAP引擎服務(wù)器相關(guān)API接口清除系統(tǒng)緩存,然后通過執(zhí)行SQL查詢得到最新的結(jié)果,返回給Web服務(wù)器。
3. 總結(jié)
1)通過項目的實踐過程證明了該方案的可行性,基于的軟件平臺是Mondrian和MySQL。
2)該方案的實施過程中,可以借助Mondrian的緩存機制、聚合表機制;MySQL的內(nèi)存表、索引機制進行調(diào)優(yōu),從而達到提高系統(tǒng)運行性能的目的。
3)同時在系統(tǒng)實現(xiàn)過程中發(fā)現(xiàn),對于實時變化數(shù)據(jù)進行多維分析,關(guān)鍵在于如何做到數(shù)據(jù)盡可能短時間內(nèi)保持同步更新(本方案中即指事實表和聚合表中數(shù)據(jù)的同步),這是系統(tǒng)性能和復(fù)雜性折中的結(jié)果。
浙公網(wǎng)安備 33010602011771號