您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > mondrian体系结构浅析
2开源OLAP引擎-MondrianOLAP引擎实现了除多维数据展示外的所有数据分析功能:包括建立多维模型、解析MDX语句、返回分析结果。国外传统数据库厂商都推出了自己的OLAP分析工具,微软发行了MDX语言标准,SQLSERVERAnalysisService是其商业化OLAP引擎。开源社区OLAP产品主要是MondrianOLAP引擎。Mondrian是开源项目Pentaho的一部分,是一个用Java写成的OLAP引擎。它实现了MDX语言、XML解析、JOLAP规范。它从SQL和其它数据源读取数据并把数据聚集在内存缓存中,然后经过JavaAPI用多维的方式对结果进行展示,同时可以不写SQL就能分析存储于SQL数据库的庞大数据集,可以封装JDBC数据源并把数据以多维的方式展现出来。JPivot是Mondrian默认的表现层工具,它是一个JSP自定制的标签库,可以绘制OLAP分析图表。用户可以执行典型的OLAP导航,如下钻、切片。JPivot使用Mondrian作为它的OLAP服务器但也支持XML/A数据源访问。它使用WCF(WebComponentFramework)框架,基于XML/XSLT来渲染WebUI组件。Mondrian支持的数据库或数据仓库主要有:LucidDb、Oracle、Access、Mysql、Sybase、Ingres、Postgres、Hypersonic、Teredata、Mondrian主要特点是对立方体进行了缓存,众所周知,缓存庞大的立方体对性能有很大的影响,但是Mondrian利用java语言的特点对这一点进行了很好的控制。其次由于Mondrian基于java语言,所以它能运行在不同的平台之上,这也是其流行的主要原因之一,例如花旗银行就在其数据仓库项目中用Mondrian作为它的OLAP引擎。Mondrian是开源项目,为开发人员和数据分析人员提供了深入研究OLAP技术的机会,同时这也为优化Mondrian总体性能提供了可能。3Mondrian体系结构浅析3.1Mondrian总体结构Mondrian体系结构如图3所示:图3整体的架构图将Mondrian分成了四个大部分Schemamanager、SessionManager、DimensionManager、AggregateManager,而实际上各个部分有着更为紧密的联系。对于DimensionalLayer、StarLayer和SQLLayer的划分,更多是处于总体逻辑分层的考虑,具体在源码中,逻辑分层的概念比较模糊。下面简单介绍下各个Manager的大致功能,在后续文章会分开详细介绍:1SessionManager:最为重要的一个部分。接受MDX查询、解析MDX,返回结果。2SchemaManager:与初始化紧密相关。主要是一些重要的数据结构如缓存池的构建以及多维模型的生成。3AggregateManager:实现了对聚集表的管理。主要是对OLAP缓存的管理,属于性能优化的部分。4DimensionManager:维度的管理。实现多维模型中维度和关系数据库表中列的映射,在SchemaManager也有部分功能处理这些映射。3.2MondrianSchemaManager分析3.2.1准备工作Mondrian的结果展示分为两种形式:一是利用jpivot展现层在web页面上展示,一种是调用Mondrianapi在控制台显示。在分析Mondrian的过程中,后一种方式有利于对结果封装格式的研究以及程序的调试。所以采取后一种方式来对Mondrian进行分析。分析之前要做一些必要的准备工作。分析环境为:(1)Window2003(2)Tomcat5.0(3)mysql5.0.37(4)java1.6.0(5)Mondrian3.0.3.110161正确配置Mondrian源码(1)在eclipse中构建一个空的java工程(Mondrian3.0工程);(2)将Mondrian3.0.3的源码压缩包解压,将其内容全部拷贝到Mondrian3.0工程中;(3)在工程属性中指定源代码目录为src/main;(4)ant运行build.xml文件的prepare,parser,generate.resources,def四个目标过程,按顺序运行;(5)将mondrian.war发布包中的WEB-INF/lib中的jar包全部拷贝到Mondrian3.0.工程的lib目录中;(6)根据提示的异常导入必要的jar包文件;在这个过程中需要注意的是:最后执行ant完成对工程进行清理处理;如果一切正常,之后则不需要用mondrian.jar文件,可以依此为标准检测是否构建成功。2数据库建表在数据库中建立如下三张表:createtabletb_employee(employee_idint,employee_nameint)createtabletb_time(time_idint,time_yearint,time_monthint)createtabletb_salary(employee_idint,time_idint,salaryint)插入适当的数据。3编写Schema文件test.xml在利用Mondrian进行多维分析过程中需要十分注意Schema文件的编写。Schema文件是对数据库中表的多维模型定义,所以有些选项要和数据库中表的定义保持一致,更为重要的是Schema文件的设计的好坏直接影响到多维查询的效率,Mondrian在schema文件定义的过程中提供了很多配置选项,可以对多维查询进行优化。下面是基于数据库表的一个test.xml:在test.xml中定义了一个名为CubeTest的立方体,这个立方体对应的事实表是tb_salary,定义了两个维度Employee和Time,这两个维度分别有一个层次,对应的维度表分别是tb_employee和tb_time,employeeid层次有一个级别,而time层次有两个级别。在事实表中用employeeid和timeid连接到这两个维表,该星型模式如图4所示:图44编写测试类可以构建一个简单的查询与结果输出:图五控制台输出的结果应为:5测试类的流程从测试类可以看出Mondrian的api的确与Jdbc有很多相似之处,从构建查询到输出结果主要完成四个步骤:(1)初始化Connection,初始化时传入必要的参数。getConnection(str)中的str就是连接字符串,指定了数据库参数和jdbc驱动。(2)生成一个String对象,用来保存MDX查询语句。(3)生成一个Query对象,用来查询结果。(4)生成一个Result对象,用来保存结果。其中Connection,Query,Result对象均是Mondrian自定义类型。3.2.2SchemaManager1Connection初始化与Rolapschema测试类的第一个步骤初始化了Connection对象,Connection对象提供了Mondrian的入口,Connection对象有一个十分重要的成员变量schema,Connection初始化的大部分工作其实是在完成schema的初始化。在整体架构中,Connection初始化属于SessionManager的范畴,而Schema的初始化由SchemaManager专门完成。Connection对象中含有Schema对象,这也是SessionManager和SchemaManager存在紧密联系的原因。图5是初始化一个connection的时序图:图6Connection在Mondrian中定义为接口类型,RolapConnection实现了Connection接口,完成了实际初始化的过程。图6展示了类RolapConnection的部分方法和全部属性:图7RolapConnection其中的一些属性与schema有很大的关联。datasource指定了连接数据源,如果在连接字符串里定义了jdbc参数,该属性可以为空。catalogUrl是test.xml的路径,schema的初始化是围绕xml文件展开的。schemaReader为其他对象提供了获取schema内部信息的渠道。RolapConnection的初始化最终会调用第二个构造方法。如果其schema参数为空,那么会调用RolapSchema.Pool.instance.get()方法,从这里开始,系统流程从SessionManager部分转到SchemaManger部分。Pool是RoalpSchema的内部类,Pool类利用Singleton模式维护了一个schema池,这样对于不同的connection,如果它们所用的xml文件是一样的,那么只用生成一个schema实例就可以满足需要,当xml文件很大时,shema池可以提高初始化效率。Mondrian提供了两种方式从schema池中取schema对象,一种是基于关键字的,一种是基于内容检查的。关键字key主要包含是xml文件路径、文件名和数据库连接参数,当采用这种方式时,schema池便是key与schema对象的映射,用key来访问schema对象。这一映射用java语言中的软引用技术实现和垃圾收集器之间的交互,最大限度上的利用内存同时又不影响垃圾收集过程。但是存在一个问题,那就是不同的key对应的xml文件的内容可能是一样的:可能同一个xml文件放在不同的路径下,也可能是xml文件名字不同但内容是一样的,在这种情况下,不同的key对应相同的schema对象,出现了对象冗余。基于内容检查的获取方式可以解决这一问题,它的实现思想是,用两个key来对应一个schema对象,一个key与上述的key完全一样,另一个key是对xml内容用md5加密后的字符串,取schema对象时,先将xml内容用md5加密,用得到字符串和映射中的所有key比较,如果字符串与映射中的某个key相同,说明对于该xml文件内容,映射中存在相应的schema对象,直接取就可以了,如果映射中没有一个key满足要求,说明该xml内容是第一次初始化,那么初始化对应的schema对象,并添加两个映射:key与schema对象的映射和md5字符串与schema对象的映射。在这里key与schema对象的映射并不是多余的,因为md5字符串可能为空。两种访问schema池的方法各有优劣,在实际应用中很难估计所使用的xml文件内容有多少是完全相同的。如果xml内容各不相同,第二种方式的效率反而会很低,不仅浪费了时间,而且还浪费了空间。基于内容检查方式Mondrian默认设置是关闭的,可以根据实际应用情况进行配置。2schema对象的初始化schema对象的初始化是SchemaManager的主要功能。显然,当初始化第一个连接访问schema池的时候,schema池是空的,这个时候就涉及到schema对象的初始化,即对于一个xml文件,建立与之对应的schema对象,并把该schema对象放到schema池里面去。图7是shema对象初始化的时序图,较之connection初始化的时序图,更为详细了描述了schema部分的初始化过程:RoalpSchema的类图如图8所示:图9类图中列出了一个schema对象的主要属性和主要的初始化方法。结合时序图和类图,可以分析出schema初始化的大致流程:(1)RolapSchema的六参构造方法调用RolapSchema的五参构造方法,在Rolap五参构造方法中,初始化了internalConnection,主要是设置了internalConnection的datasource属性,如前面所述,datasource传递进来时可以为空,在初始化internalConnection时,如果传递进来的datasource为空,会根据传递进来的jdbc参数构造一个datasource,这个datasource至关重要,在生成数据库方言的时候要用到。此外,构造方法
本文标题:mondrian体系结构浅析
链接地址:https://www.777doc.com/doc-2883094 .html