Mondrian多維分析引擎數據緩存功能分析與擴展實現

NO IMAGE

本文主要介紹Mondrian緩存模塊源碼分析以及緩存擴展實現。

概述

聯機分析處理(On Line Analytical Proccessing,簡稱OLAP) 概念最早由關係數據庫之父E.F.Codd於1993年提出。OLAP應用是目前數據倉庫上的重要應用之一,是決策分析的關鍵。作為數據倉庫最重要的多維分析工具,OLAP利用存儲在數據倉庫中的數據完成各種分析操作,並以直觀易懂的形式將分析結果返回給決策人員。它的目標是滿足決策支持或多維環境特定的查詢和報表需求,技術核心是多維分析。OLAP具有靈活的分析功能、直觀的數據操作和分析結果可視化表示等突出優點,從而使用戶對大量複雜數據的分析變得輕鬆而高效,以利於迅速做出正確的判斷,輔助決策。

Pentaho Analysis Services,即 Mondrian(項目代號),是 Pentaho 的多維分析、OLAP 解決方案。 Mondrian 就是一個 OLAP 引擎,而且是一個 ROLAP 引擎,ROLAP 指的是使用關係數據庫的OLAP它本身不管理數據的儲存,這是由關係數據庫來做的,它通過 JDBC 來訪問數據。這樣可以大大減少 OLAP 引擎的複雜性,而且可以使用多種數據庫。

Mondrian 採用開源協議 Eclipse Public License。

Mondrian從架構上可以分為四個層次:展現層、維度層、星層、存儲層。
Mondrian多維分析引擎數據緩存功能分析與擴展實現
展現層確定了終端用戶最終能夠通過系統在顯示器上看見什麼內容,並提供了用戶與系統進行交互的手段和方式。這裡有多種方法展示多維數據,包括樞紐表(pivot tables)、餅圖,線性圖和柱狀圖等,和一些高級的圖形展示工具,如可交互的地圖、動態圖形等。展示部分的程序可以通過java的Swing或者JSP進行實現,而圖表可以被返回為JEPG或者GIF格式的文件,或者通過XML進行封裝傳輸。用戶通過展示層詢問系統要展示什麼東西,OLAP服務迴應該詢問。

第二層是維度層。維度層按階段確認和執行了MDX查詢請求。一個查詢請求可以看成由多個階段執行完成。維度軸線首先被計算,然後計算該維度軸線上的單個元素值。為了提高計算效率,維度層將元素(cell)請求以批量的方式發送給了聚合層(aggregation layer)。同時元數據描述了該維度模型和如何將維度模型映射為關係模型的方法。

第三層是星層,它負責維護一個聚合體(一個或多個cubes)的緩存,即一個聚合代表了由維度信息表徵的內存中的元素(cell)的一個集合。第二層的維度層傳送了對指定元素的請求給星層,如果所需要查詢的元素不在該緩存中,或者正在執行對聚合的滾卷操作,聚合管理器將發送一個數據請求給存儲層,從而裝載數據到內存中。

存儲層為一個RDBMS。它負責提供被聚合的元素數據和維度表的成員。Mondrian目前主要持RDBMS作為數據源,不支持直接的多維數據庫。

以上四層可以同時部署到一臺機器上,也可以進行分佈式部署到多臺機器上。但是第二層和第三層必須部署到一臺計算機上,其組成了Mondrian服務。存儲層可以部署到其它的機器上並通過遠程JDBC連接進行訪問。在一個多用戶系統中,展現層可以存在在每個用戶終端機上(除非通過Jsp頁面以服務器的方式產生)。

為了提高海量數據下的查詢響應速度,Mondrian自動將首次查詢的結果緩存到內存中,之後的查詢如果命中緩存內容,則不再訪問數據庫。這種實現方式實現實時OLAP時會存在問題,實時OLAP中數據變化頻繁導致緩存中的數據不是最新的。

緩存控制接口:為了做到不重啟OLAP Server也能更新緩存,Mondrian提供了一系列的刷新緩存的接口,支持指定清除指定schema的元數據緩存、查詢結果緩存;清除動作可以是全部清除 也可以是部分清除。

緩存功能分析

Mondrian中緩存功能,查詢過的mdx語句會存入到緩存中。下次再次查詢時數據將直接在緩存中讀取。
Mondrian多維分析引擎數據緩存功能分析與擴展實現
在Mondrian中使用的是軟引用,如果內存不足時對象將會被回收。但是有些SegmentBody非常的大。這樣導致對象經常被回收,經常需要重複的查詢數據庫。所以mondrian優化可以從修改緩存的部分開始,可以將mondrian的緩存放到另一個進程裡,這樣就可以大大的減輕mondriand造成的壓力。可以將緩存部分修改成現在比較流行的ehcache或memcache,而且ehcache與memcache還支持集群或者文件形式的緩存。
如果你的數據量非常的大,數據庫的查詢性能,已經無法在優化,例如非傳統數據庫 hive spark sql ,這種數據庫在查詢性能方面天生具有缺陷。這時你可以修改緩存部分來提高mondrian的易用性。在緩存中存放已經聚合完成的數據,這樣下次請求時可以直接可以在緩存中提取聚合後的數據。

緩存類型

Mondrian有三種不同的緩存:Schema、Member、Segment

Schema Cache將Schema 保存在緩存中,因此每次cube多維數據集加載時不需要重讀。

Member Cache從內存中的維度中存儲Member值,從而減少了從數據庫讀取的次數。

Segement Cache將預先計算的值存儲在緩存中,不需要回收和重新計算,可以減少重複讀取計算的次數,顯著加快分析速度。

Mondrian多維分析引擎數據緩存功能分析與擴展實現

緩存清除

當原始數據改變時需要更新緩存數據,通常當ETL執行完需要清除緩存數據。

Schema

每個Schema緩存將唯一保存在內存中。當模式從緩存中刷新時,其關聯的Member和Segment緩存也被刷新,這是一種性能很低的方法。但是,如果模式已經更改,或者確定要刷新的內容的細節太複雜,那麼這可能是最好的方法,當然也是最簡單的方法。緩存可以是使用前一節中描述的技術重新填充。

大多數Mondrian工具,如PunaHo,提供了一種手動刷新的方法。在PunaHo中,您可以使用企業控制檯或用戶控制檯。如果你是作為管理員登錄到用戶控制檯,只需選擇工具>刷新>Mondrian緩存。

手動方法很好,但管理員通常希望自動化。緩存刷新作為整個ETL工作流的一部分。下圖顯示Mondrian如何高速緩存適合整個ETL工作流。在填充OLAP數據庫之後,Mondrian被調用來刷新並保存緩存。這個過程確保了緩存與基礎數據庫同步,以便在執行分析時,數據是最新的。

Mondrian多維分析引擎數據緩存功能分析與擴展實現

為了便於將緩存保存到ETL過程中,可以創建一種包含刷新緩存部分的方法的類。您也可以創建一個JSP使用新類。然後通過配置參數調用URL來保存緩存變得容易。

下圖顯示了ETL工具將支持的三種情況。場景從刷新所有內容到刷新緩存的特定區域。Mondrian的緩存控制SPI非常詳細,可以允許您控制緩存的任何部分。

Mondrian多維分析引擎數據緩存功能分析與擴展實現

清單顯示了控制緩存的JSP代碼接收參數,然後調用CacheFlusher類以刷新指定的部分緩存。這很容易將緩存從用戶界面中清除的工作分開。或者在適當的情況下嵌入應用程序中。

  • JSP刷新緩存

    為了刷新整個緩存,可以簡單地調用JSP,而不需要參數。例如,如果JSP部署到本地機器的patahoweb應用程序的公用文件夾中。會調用http://localhost/punaho/pult/ flushcache.jsp。這將調用CacheFlusher類的FlushAll()方法,這隻適用於新的連接。

Mondrian多維分析引擎數據緩存功能分析與擴展實現

  • 整個Shema緩存刷新

Mondrian多維分析引擎數據緩存功能分析與擴展實現

Cube

在有許多不同的模式和立方體的環境中,可能存在多個只適用於指定立方體的ETL處理過程。數據更新後只有被影響的Cube立方體的緩存數據需要更新。這意味著其他Cube立方體將繼續使用緩存。這隻會影響新的連接。

以下代碼顯示了清除指定Cube立方體緩存的代碼。若要清除緩存,只需調用JSP並指定Catelog和Cube清除緩存數據。

Ø 指定Cube立方體緩存清除

Mondrian多維分析引擎數據緩存功能分析與擴展實現

這樣很好清除了整個Cube立方體緩存。但通常只是想更新Cube立方體的部分數據,特別是當時間為維度時,因為過去事實不應該改變。下一節描述如何刷新特定區域的立方體緩存。

Region

更新指定區域Cube多維數據集緩存提供了對緩存的最佳控制。假設已經跟蹤銷售數年了。有個每晚需要從操作數據庫更新數據到數據倉庫的處理過程,只需要更新改變的數據緩存,如本月的銷售。下面代碼顯示了刷新區域所需的代碼。看起來有點複雜,但是其實只有幾個關鍵調用參數。代碼Schema和Cube現在瞭解了,所以我們只關注代碼清理區域。

Mondrian多維分析引擎數據緩存功能分析與擴展實現

單元格區域是Cube立方體中需要清除的一組單元格區域。memberNameToSegmentList 方法將成員名稱轉換為成員的特殊列表。

一旦定義了所有區域,就創建交叉連接和緩存控制,對象刷新區域。下一個調用mondrian指定區域中的單元格將從數據庫讀取並填充緩存。

源碼分析

Session Manager:最為重要的一個部分。接受MDX查詢、解析MDX,返回結果。

Schema Manager:與初始化緊密相關。主要是一些重要的數據結構如緩存池的構建以及多維模型的生成。

Aggregate Manager:實現了對聚集表的管理。主要是對OLAP緩存的管理,屬於性能優化的部分。

Dimension Manager:維度的管理。實現多維模型中維度和關係數據庫表中列的映射,在Schema Manager也有部分功能處理這些映射。

Schema緩存

​ Schema緩存將Schema對象保存在緩存池中,因此每次cube多維數據集加載時不需要重新加載,顯著加快分析速度。

緩存相關類

類名說明
mondrian.rolap.RolapConnectionMondrian OLAP服務連接
mondrian.rolap.RolapSchema多維數據模式類
mondrian.rolap.RolapSchemaPoolSchema緩存處理類
mondrian.rolap.SchemaKeySchema緩存key

初始化緩存

  • 初始化Schema緩存池

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

  • 初始化RolapConnection對象

    每個RolapConnection有一個RolapSchema對象,RolapConnection對象初始化過程中會初始化對應的Schema對象。

    Schema對象初始化過程中首先去Schema緩存池中查找數據,如果存在緩存數據對象則直接返回,否則初始化加載Schema對象,將該對象保存到緩存池中。

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

  • 初始化Schema對象

    (一)解析XML生成Schema

    ​ 通過RolapSchema的load方法,傳入Catalog的XML形式的Schema,使用org.eigenbase.xom.XOMUtil創建一個XML的解析器,將XML傳入解析器,返回一個DOMWrapper對象_def。根據此對象創建DOMElement解析器,用它來解析Schema下包含的元素,獲取Schema的所有屬性,並將annotation、parameter、dimension、cube、virtualCube、namedSet等片段存入NodeDef集中,形成一個樹形結構,對此樹進行深度優先遍歷。

    (二)RolapSchema加載Schema

    ​ 首先,檢查在Schema中是否有用戶自定義函數,然後初始化FunctionTable。然後根據Schema解析結果樹,對層次創建SmartMemberReader用於維度成員以其子成員的緩存。最後初始化AggregationManager,然後返回。

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

加載緩存

根據RolapConnection初始化對象傳入的連接參數查找Schema緩存數據,如果存在直接返回Schema緩存對象,否則創建加載Schema對象,將對象保存至緩存池中。

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

清除緩存

Schema緩存將Schema對象保存在緩存池中,當Schema XML文件修改更新後,需要清除Schema緩存重新加載緩存數據。

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

Segment緩存

Segement 緩存將預先計算的值存儲在緩存中,不需要回收和重新計算,可以減少重複讀取計算的次數,顯著加快分析速度。

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

緩存相關類

類名說明
mondrian.spi.SegmentHeader用於從Segment緩存中檢索Segment的關鍵對象
mondrian.spi.SegmentBody包含Segment緩存數據的對象
mondrian.rolap.agg.SegmentCacheManager活動對象,用於維護“全局緩存”(在JVM中,但是在使用特定模式的連接之間共享)和“外部緩存”

開啟關閉緩存

通過配置文件屬性配置項控制Mondrian數據緩存的使用,disableCaching控制每次執行查詢是否緩存數據,disableLocalSegmentCache控制是否使用本地緩存。

  1. mondrian.properties配置

Mondrian多維分析引擎數據緩存功能分析與擴展實現

  1. MondrianProperties.java源碼

Mondrian多維分析引擎數據緩存功能分析與擴展實現

  1. 說明
名稱說明
mondrian.rolap.star.disableCachingTrue:不使用緩存False:使用緩存
mondrian.rolap.star.disableLocalSegmentCacheTrue:不使用本地緩存False:使用本地緩存

緩存服務擴展

Mondrian緩存服務擴展可以通過屬性文件配置、服務查找實現。實現流程為關閉本地緩存、實現外部緩存擴展。
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

關閉本地緩存

mondrian.properties配置

Mondrian多維分析引擎數據緩存功能分析與擴展實現

mondrian.rolap.star.disableLocalSegmentCache=true關閉MemorySegmentCache本地緩存處理

服務擴展實現

  1. 實現SegmentCache接口

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

  1. 配置緩存服務

通過配置文件配置服務類

將自定義擴展實現SegmentCache接口類在mondrian.properties屬性文件中配置

mondrian.rolap.SegmentCache
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

通過服務查找實現

創建服務配置文件mondrian.spi.SegmentCache

Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

處理代碼
Mondrian多維分析引擎數據緩存功能分析與擴展實現
Mondrian多維分析引擎數據緩存功能分析與擴展實現

相關文章

摸魚小技巧之IDEA調試篇一

Flutter使用Riverpod+Retrofit構建MVVM開發模式

教你寫出高性能JavaScript

花五分鐘把代碼註釋也規範一哈子?