1. Mondrian是什麼?html
Mondrian是一個用Java成的OLAP引擎。它實現了MDX語言、XML解析、JOLAP規範。它從SQL和其它數據源讀取數據並把數據彙集在內存緩存中,而後通過 Java API用多維的方式對結果進行展現。java
2. Mondrian組成與架構mysql
Mondrian又四個manager組成,見下圖:web
l Session Manager:最爲重要的一個部分。接受MDX查詢、解析MDX,返回結果。sql
l Schema Manager:與初始化緊密相關。主要是一些重要的數據結構如緩存池的構建以及多維模型的生成。數據庫
l Aggregate Manager:實現了對彙集表的管理。主要是對OLAP緩存的管理,屬於性能優化的部分。編程
l Dimension Manager:維度的管理。實現多維模型中維度和關係數據庫表中列的映射,在Schema Manager也有部分功能處理這些映射。緩存
從架構上能夠分爲四個層次:tomcat
l 計算層:分析,驗證,執行MDX語句。先計算座標軸,而後再計算每一個單元格的值,從效率上的考慮,計算曾批量的從聚合層獲取單元格數據集合。性能優化
l 聚合層:聚合層中緩存了多維查詢結果,即單元格的數據集合,若是計算層所須要的數據不在緩存中,從存儲層中進行查詢獲取數據並緩存。
l 存儲層:通常使用關係數據庫實現,通常採用星型結構,提供事實表,維度表和聚合表。
l 表現層:通常使用Saiku或者PentahoBI-server。
系統部署結構上,能夠分三層結構分開部署,將表現層部署在一臺機器上,計算層和聚合層部署在第二臺,存儲層部署在第三臺。
3. MondrianSchema版本
須要注意的是MondrianSchema3.0和4.0的版本區別,升級事後SchemaXML的寫法發生了比較大的變化。支持Schema3.0的寫法,且shema4.0必須加上metamodelVersion='4.0'屬性。
l Schema3.0支持的主要elements
立方體:<Cube>
維度:<Dimension>
層級:<Hierarchy>
級別:<Level>
度量:<Measure>
維表關聯:<Join>
視圖:<View>
虛擬立方體:<VirsualCube>
聚合表:<AggregateTbale>
計算成員:<CalculateMember>
l Schema4.0支持的主要elements
立方體:<Cube>
物理模型:<PhysicalSchema>
關聯:<Link>:定義數據庫物理表之間的關聯關係
層級組:<Hierarchies>
層級:<Hierarchy>
級別:<Level>
維度組:<Dimensions>
維度:<Dimension>
維度屬性:<Attribute>
度量組:<MeasureGroups>
度量維度關聯:(事實表和維度表的關聯)<DimensionLinks>
查詢:<Query>:等同View
計算成員:<CalculateMember>
聚合表:<AggregateTable>
Schema3.0 |
Schema4.0 |
立方體:<Cube> |
立方體:<Cube> |
維度:<Dimension> 維表關聯:<Join>雪花模型 |
維度組:<Dimensions> 維度:<Dimension> 維度屬性:<Attribute> |
層級:<Hierarchy> 級別:<Level> |
層級組:<Hierarchies> 層級:<Hierarchy> 級別:<Level> |
度量:<Measure> |
度量組:<MeasureGroups> 度量維度關聯:(事實表和維度表的關聯)<DimensionLinks> |
視圖:<View> |
查詢:<Query>:等同View |
計算成員:<CalculateMember> |
計算成員:<CalculateMember> |
虛擬立方體:<VirsualCube> |
|
聚合表:<AggregateTable> |
聚合表:<AggregateTable> |
|
物理模型:<PhysicalSchema> 關聯:<Link>:定義數據庫物理表之間的關聯關係 |
4. 多維數據分析平臺構建
調研了兩種個架構:
1. mysql(Kylin)+Mondrian+Mondrian workbench+Saiku
2. mysql+Mondrian+Pentaho Business intelligence server Community Edition
此例子使用第一種框架做爲測試平臺。平臺框架以下:
MondrianSchema沒有一個比較好的圖形化編程工具,workbench只是一個這種的工具,且目前只找到3.0版本的。因此通常爲手寫。
Mysql和mondrian的安裝就不作過多的介紹,mysql本地安裝,mondrian下載最早的4.0版本的jar包便可。重點介紹一下Saiku的安裝。
Saiku下載地址:http://community.meteorite.bi/,下載在最新的saiku-latest.zip解壓。自帶mysql驅動因此不須要導入mysql驅動包,只須要將下載的mondrian-4.0的jar包複製到server/tomcat/webapps/saiku/WEB-INF/lib/下面集成Mysql+mondrian+Saiku的三層數據分析系統。
啓動Saiku,訪問http://localhost:8080,注意安裝在本機因此是localhost。默認用戶名和密碼是admin/admin。初次登陸提示須要從http://licensing.meteorite.bi/網站獲取一個免費的證書。而且上傳到http://localhost:8080/upload/html,照作便可。
登陸進Saiku以後,在控制檯-Datasourcemanager-add data source添加本地數據庫鏈接信息便可。至此mysql-mondrian-saiku的三層多維數據分析平臺構建完成。
5. 仿真數據集的準備
本例採用網絡上的銷售-產品數據集做爲多維數據分析的數據源。數據結構爲雪花模型。由一張事實表sale,三張維度表product,producttye,Customer三張維度表構成。包含customer和product兩個維度,其中product的外鍵proTypeId指向ProductType的主鍵proTypeId構成雪花模型。包含單價unitPrice和銷售量number兩個度量。具體數據結構見下圖。
建表和數據裝在的構成就不在作過多的介紹。
6. Mondrian schema3.0/4.0demo演示
結合saiku界面的實例和遇到的大坑演示。
7. 使用過程遇到的坑
l 查看mondrian生成的mysql語句須要配置
default-storage-engine=INNODB
general_log=on
general_log_file=D:\mysql-5.6.34-winx64\data\mysql.log
l mondrain schema4.0特性重點分析
1. 元素<physicalShema>必需要有:指定cube涉及到設事實表和維表的key和關聯關係,可是physicalSchema下面的table必需要:指定cube須要的事實表和維度表,link不是必須,可由<Dimension>下面的<Join>屬性,<MeasureGroups>下面的<DimensionLinks>下面的<ForeignKeyLink>代替。
2. <Dimension>下面的<Join>屬性也不是必需要有:指定雪花模型的維度表之間的關聯關係。可在<physicalSchema>下的<link>中指定維表之間的關聯關係。
3. <MeasureGroups>下面的<DimensionLinks>下面的<ForeignKeyLink>必需要有:指定事實表裏面的measures(度量)和維表之間的關聯關係。也就是事實表和維度表之間的關聯關係。
4. <View>(3.0)和<Query>(4.0)的區別:<Query>和<View>功能上同樣,可是Query的語法和官網上有點區別,推薦用View。
5. 使用<View>報錯:Caused by: java.sql.SQLException: No suitable driver found for jdbc.mysql://localhost:3306/test
解決:連接寫錯了。
6.使用<Query>報錯:Caused by: org.eigenbase.xom.XOMException: In Schema: In PhysicalSchema: In Query: Attribute 'alias' is unset and has no default value。
解決:name改alias(與官網有區別)。
7.將<Query>的name屬性改成alias報錯:Caused by: java.sql.SQLException: No suitable driver found for jdbc.mysql://localhost:3306/test
解決:連接寫錯了。
8. mondrainShema的大坑
(1) 錯誤:Caused by:com.mysql.jdbc.exceptions.jdbc4. MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group by `producttype`.`proTypeName` order by ISNULL(`producttype`.`proTypeName`' at line 1。
解決:解決:physicalSchema中涉及的要用到的表的定義中有個單詞寫錯了,(Column)寫成了Cloumn。
(2) 錯誤:定義了Hierarychy,卻說attribute必需要有一個Hierarchy,
解決:physicalSchema中涉及的要用到的表的定義中有個單詞寫錯了,(Column)寫成了Cloumn。
8. 虛擬立方體visualCube(3.0)
9. 性能優化aggregateTable