JPivot+Mondrian笔记

xinxuan 2010-08-18

JPivot+Mondrian笔记

一、引言

Mondrian官方网站(http://mondrian.pentaho.org/)给出的定义是MondrianisanOLAPserverwritteninJava.ItenablesyoutointeractivelyanalyzeverylargedatasetsstoredinSQLdatabaseswithoutwritingSQL.

Mondrian是一个OpenSource的基于关系数据库的分析服务器,遵循MDX、XML/A和JOLAP标准。Mondrian是一个BI开源项目。一个用Java写成的OLAP(在线分析性处理)引擎。它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据。然后经过JavaAPI用多维的方式对结果进行展示。首先应该到http://sourceforge.net/projects/mondrian/下载mondrian的最新版本。

二、MondrianArchitectrue

Mondrian从架构上可以分为四个层次:表现层、计算层、聚合层、存储层。

计算层:分析、验证、执行MDX语句,先计算坐标轴,然后再计算每个单元格的值,从效率上的考虑,计算层批量从聚合层获取单元格数据集合。

聚合层:聚合层中缓存了多维查询结果,即单元格的数据集合,如果计算层所需要的数据不在缓存中,从存储层中进行查询获取数据并缓存。

存储层:采用关系数据库实现,一般采用星型模型构建,提供维表、事实表和聚合表。

系统部署结构上,可以分三层结构分开部署,将表现层部署在一台机器上,计算层和聚合层部署在第二台,存储层部署在第三台。

根据OLAP服务器数据存储技术,可以分为ROLAP和MOLAP,Mondrian采用ROLAP技术。

在ROLAP的多维模型组织和存储数据中,比较常用的方式是星型模式,由一个事实表和一组维度表组成。维度必须预先确定,可以是一般的星型架构,也可以是比较特殊的父子架构、雪花架构等。在ORACLE数据库中,我们能够按照维度进行预先的统计、分类、排序,创建大量的实体化视图。对于没有实体化视图类似功能的数据库,我们也可以创建大量的临时聚合表,这样当用户进行比较高级的分析的时候,不用访问数据量庞大的基础事实表,只需要在我们已经形成的实体化视图或聚合表上作进一步的聚合就可以了,这样能够大大提高查询分析的效率,并且减少占用的系统资源。

在使用聚合表方面有一个关键的技术称之为"聚合感知"技术,只有OLAP引擎必须能够根据多维查询中的维度信息,从适当的聚合表中提取数据,否则聚合表形同虚设。另外在多维模型设计中,设计正确的聚合表也是很关键的。不恰当的设计导致将聚合表的不能满足多维查询的需求,每次从事实表取数据,开销是非常大的。

Mondrian采用关系数据库存储事实表,其本身不具有"聚合感知"的技术,当需要从比较明细的事实表中汇总数据时,性能就比较差了。但是如果关系数据库能够支持实体化视图或其他聚合技术,那么就可以利用关系数据库的技术透明的提高系统性能。我们可以利用Oracle实体化视图来提高Mondrian的效率。

三、Mondrian开发

Mondrian开发顺序的分为4个步骤。

1、创建Mondriancubes(Schema文件)

Schema元模型包括维度(Dimensions)、层次(Hierarchies)、级别(Levels)、和成员(Members)等。Mondrian要根据它来从关系数据库中聚合数据响应MDX语法的查询。可以说Schema文件是Jpivot+Mondrian架构应用中最核心,最关键的文件。JPivot+MondrianDemo的/WebRoot/Web-Inf/pasmondrian.xml文件就是基于XML的,用于映射OLAP的数据库结构,以供Mondrian服务器响应MDX语句查询的Schema元模型文件。Schema元模型的定义文件较复杂。幸运的是有开源工具CubeDesigner可以帮我们生成该文件,虽然该工具刚推出不久,并不成熟、稳定,还有许多BUG存在,但它至少可以生成一个大致的文件框架,可以大大减轻工作量。

Mondriancubes创建有多种办法,最原始的办法就是用手写。Mondrian现在有自己的Cube创建平台——workbench。下载地址:http://sourceforge.net/project/showfiles.php?group_id=35302。目前版本为workbench-2.3.2.9247。该平台有三个功能:生成Schema,执行MDX和JDBCExplore。经测试该平台对Mysql数据库可以成功使用,但对Oracle数据库报错如下:“10:56:50,062INFO[MondrianProperties]Mondrian:loaded0systemproperties

10:56:51,406ERROR[JDBCMetaData]java.sql.SQLException:ORA-01424:转义符之后字符缺失或非法”。

一、下载workbench-2.3.2.9247.zip后解压缩,运行workbench.bat文件

file-->new-->schema出来的界面如下图:

二、使用

1.配置数据库

tools-->Preferences

在弹出的对话框处填写JDBC连接信息。

注意:要把相应的JDBC驱动包拷贝到workbench-版本号\lib目录下。

2.制作***.mondrian.xml(立方体)

另外一种方法,就是用PentahoCubeDesigner去创建Mondriancubes。

下载CubeDesigner-0.7.2.0_Win32.zip,解压后运行CubeDesigner.exe。如下图:

第一步:创建newcube,定义数据源

定义CubeName——选择数据源——编辑JNDIName——Driver——ConnectString——Username/Password,然后Test连接是否成功。

第二步:定义数据模型和TableMapping

选择数据库——选择Table/View——双击抽取目标数据——定义Mapping——选择要显示的字段。

在这步数据模型建立的查询中,还可以定义wherecondition,groupby,having,orderby等。

第三步:选择事实表和定义度量

第四步:创建Dimensions及hierarchy,level

第五步:生成Schema及Publish或者保存

在最后一步中,如果定义的Schema文件有错误,则看不到XMLSource并且无法保存结果!要注意维度和度量的定义!

至此,在保存的目录下就生成三个文件:***.mondrian.xml,***.properties,***.xaction。其中***.mondrian.xml就是我们所需要的Cubes。

2、创建MDX查询

第一步,将上述生成的***.xml文件放在Tomcat_HOME\webapps\mondrian\WEB-INF\queries目录下。

第二步,编写MDX查询语句

使用JPivot的<jp:mondrianQuery>标签定义一个MDX查询语句,代码如下:

Java代码

1.<jp:mondrianQuery

2.id="query01"jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver"

3.jdbcUrl="jdbc:oracle:thin:@172.16.31.51:1521:orcl"

4.jdbcUser="stat"

5.jdbcPassword="stat"

6.catalogUri="/WEB-INF/queries/AAA_MONTH_CUBE.xml">

7.select{[Measures].[SUMofAAA_MONTH.USERCOUNT],[Measures].[SUMofAAA_MONTH.UPWARDDOC],[Measures].[SUMofAAA_MONTH.DOWNWARDDOC]}ONCOLUMNS,{[DIM_TIME.TIME_ID].[DIM_TIME.YEAR].Members}ONROWSfrom[AAA_MONTH_CUBE]

8.</jp:mondrianQuery>

<jp:mondrianQuery

id="query01"jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver"

jdbcUrl="jdbc:oracle:thin:@172.16.31.51:1521:orcl"

jdbcUser="stat"

jdbcPassword="stat"

catalogUri="/WEB-INF/queries/AAA_MONTH_CUBE.xml">

select{[Measures].[SUMofAAA_MONTH.USERCOUNT],[Measures].[SUMofAAA_MONTH.UPWARDDOC],[Measures].[SUMofAAA_MONTH.DOWNWARDDOC]}ONCOLUMNS,{[DIM_TIME.TIME_ID].[DIM_TIME.YEAR].Members}ONROWSfrom[AAA_MONTH_CUBE]

</jp:mondrianQuery>

<jp:mondrianQuery>标签及其属性,可参考JPivot文档。

3、编写OLAP展现页面

在Demo的/WebRoot/pasmondrian.jsp利用JPivot及WCF一系列JSP标签展现Mondrian服务器返回的OLAP数据集。

具体代码参见DEMO相关文件;JPivot及WCF标签用法参考相关文档。

最后,在web.xml文件中加入映射:

Java代码

1.<filter-mapping>

2.<filter-name>JPivotController</filter-name>

3.<url-pattern>/AAA_MONTH_CUBE_QUERY.jsp</url-pattern>

4.</filter-mapping>

<filter-mapping>

<filter-name>JPivotController</filter-name>

<url-pattern>/AAA_MONTH_CUBE_QUERY.jsp</url-pattern>

</filter-mapping>

4、程序典型流程

1、用户发出pasmodrian.jsp?query=pasmodrian的请求

2,pasmodrian.jsp上的<wcf:include>根据query参数,匹配/WEB-INF/query/下的pasmodrian.jsp来获取数据

3,pasmodrian.jsp上的<jp:mondrianQueryid="query01">查询数据,放入到query01变量中

4,pasmodrian.jsp上的<jp:tableid="table01"query="#{query01}"/>根据query01的结果(领域数据)准备显示OLAP表格所需的数据(显示数据)

5,pasmodrian.jsp上的<wcf:renderref="table01"xslUri="/WEB-INF/jpivot/table/mdxtable.xsl"/>根据table01的结果,使用xsl,渲染出OLAP表格。

6,循环第4,5步,使用<jp:navigator>等tag准备navigator,chart的数据然后用<wcf>渲染出图表和导航系统.

整个流程,第2步的pasmodrian充当Controller调用第3步的Model层,然后第4,5步执行从领域数据(比如一些javabean)中转换出格式整齐的,需要显示的数据(比如一段xml),再用xsl将其渲染为最终的表现形式。

5、优点

1、基于JSPTag的展现层,不需要安装任何插件即可运行;

2、可以轻易集成到web项目中。

6、缺点

1、没有完善的帮助文档、开发手册和错误指南,遇到问题不能迅速解决;

2、不支持SQL直接查询,需要编写MDX语句及Schema元模型定义文件,要求程序员对OLAP数据模型及数据仓库思想、理论的认识较高,学习成本高;需要相当高的熟练度才能达到快速开发的目的。

3、相关开发工具(如:报表生成器、可视化的多维报表开发工具等)缺乏,基本上处于代码级的开发。

四、结论

JPivot+Mondrian架构,由olap核心引擎响应来自JPivot表现层的MDX语法查询,返回多维查询结果,最终由JPivot展现多维数据。功能相当单一。JPivot和Mondrian项目均处在成长的阶段,在开发工具、文档及技术支持等方面做得还不够。[/img]