mondrian作为开源的rolap引擎非常稳定,bug也非常少,但是就是基本没用人维护了,如果出现什么问题,需要自己修改源码了。现在很多BI工具的rolap引擎都使用的是modnrian ,例如比较出名pentaho,saiku,jpivot。这些产品只是在前端实现了一个前端展示,最终的多维度数据的聚合查询通过mondrian完成的,但是mondrian中不支持钻取与上卷操作,这些需要前端展示工具实现。我也开发了一个展现工具,表格钻取自己写的,chart用的是baidu echart,至少要比saiku好用,以后的blog单独介绍。

由于mondrian多年没人维护,有时遇到什么问题需要去修改mondrian的源码,mondrian项目成立比较早,所以mondrian内部实现有些地方比较复杂,例如mondrian内部自己实现的的ioc,应该是2005年左右实现的(真的很佩服作者)。那时好像还没有spring。但是也不是特别复杂。奉劝各位用saiku的人,想要将saiku作为产品的,还是要读读mondrian的源码,bug虽然很少,但是还是有的。mondrian是无法支持24*7运行的。废话不多说,说说主题,关于mondrian的性能优化的问题,其实mondrian性能还是不错的,基本上百万级别是没有什么问题的,我用个人笔记本I3 CPU 12G的内存,数据库(mysql)与mondrian还有查询工具全在我一台机器上而且都是默认设置没有经过任何优化的前提下,我的事实表数据在16W+,没有任何查询效率问题。介绍mondrian优化方法前,先介绍他的工作原理,mondrian通过给定的mdx表达式生成sql,然后通过jdbc查询数据库中的数据,mondrian将数据加载后创建虚拟的数据矩阵。例如 用户想分析foodmart超市,在 美国各个地区 所有各类食品销量。


生成对应的MDX

mondrian将mdx转换成SQL

可以看到sql中 group by 的聚合,凡是mdx中包含的Level,就会出现在sql语句中多了一个分组条件,例如,上个例子中的product_family,与product_department。mondrian会将sql查询后的数据创建内部矩阵。关于mondrian生成的sql语句包含in的问题,有很多人问过我mondrian中的生成的SQL的语句中在条件语句中会生成带有in ('xxxxxx','xxxxxxx') 会有in 的存在,上个例子中我是想查看product维度下,product_department层次下所有成员数据,如果我只查询 product_department下的几个成员的数据,这时sql语句where 后就会出现 in语句。mondrian之所以这么做的原因就是如果没有IN操作,生成的sql语句是product_department对应分类聚合下的所有成员数据。这样数据库查询一定是快于带IN的语句,但是,这样带来的问题,就是不带IN 的SQL查询出数据集要大于带有IN的数据集,这样就是如果SQL的性能好了,那么mondrian对应的虚拟矩阵增大,无论在加载矩阵与数据提取时,都增大mondrian压力。所以mondrian单独对于判断用户选择的成员的数据占总成员的数量,来定义是否采用IN SQL的形式。如果想修改这里,可以参考Aggregation.optimizePredicates(RolapStar.Column[] columns, StarColumnPredicate[] predicates)方法。mondrian的性能总体上来说两种方法
方法一.优化数据库
modrian只是rolap的引擎,他只只是将mdx转换成sql,最终的查询还是要通过数据库来做的,所以性能的压力大多数在DB上,所以如果出现性能问题,大家首先要测试mondrian的生成的sql,在数据库中的执行效率,至于数据库优化办法估计大家就有很多办法了,创建索引,简化数据库表之间的关系,没钱的话玩玩技术,有钱的话直接上数据库一体机什么问题都解决了。
方法二 mondrian的缓存修改
mondrian中存在缓存功能,查询过的mdx语句会存入到缓存中。下次再次查询是,数据将直接在缓存中读取。但是mondrian中缓存的实现真的是一般般。

在Mondrian中使用的是软引用,如果内存不足时,对象将会被回收。但是有些SegmentBody非常的大。这样导致对象经常被回收。经常需要重复的查询数据库。所以mondrian优化可以从修改缓存的部分开始,可以将mondrian的缓存放到另一个进程里,这样就可以大大的减轻mondriand造成的压力。可以将缓存部分修改成现在比较流行的ehcache或memcache,而且ehcache与memcache还支持集群或者文件形式的缓存。
如果你的数据量非常的大,数据库的查询性能,已经无法在优化,例如非传统数据库 hive spark sql ,这种数据库在查询性能方面天生具有缺陷。这时你可以修改缓存部分来提高mondrian的易用性。在缓存中存放已经聚合完成的数据。这样下次请求时可以直接可以在缓存中提取聚合后的数据。
分享我的优化方案,我给他命名为mondrian-cubes,mondrian-cubes实现原理就是预加载,提前通过schema计算出所有的维度组合mdx,在mondrian-cubes中缓存mdx查询的结果。只需要将mondrian缓存模块稍作修改将以前读取本地缓存部分的,改成读取mondrian-cubes中的的数据。这样通过预加载的模式,在用户没有查询之前,将聚合后的数据放到缓存中,用户查询直接查询聚合后的数据。大大的增加了在大数据的情况下mondrian的可用性。尤其在非传统数据库hadoop hive spark sql 等带来的问题。毕竟hadoop类数据库并不以查询速度为专长。
实现mondrian-cubes中遇到的问题,首先就是数据量大的问题。如果一个多维数据集(schema)有10维,每维5层,则可能产生的立方体总数是5^10≈9800000,而总的矩阵的数据单元个数更是大的惊人。所以如果你要自己实现,一定要考虑好你的数据集维度是多少,需要什么作为你的预加载cube的存储方案。我使用的是ehcahce,我通过ehcache将数据存储到硬盘上,我使用的mondrian foodmart.xml数据集做的测试。目前只有sales 数据集加载到200多G,因为磁盘空间不足,停止预加载,其它的数据集没有问题。所以大家可以参考参考,还有就是预加载的数据量取决于你维度与层次多少,与实际的数据量多少没有太大关系。预加载可能需要一段时间,可能与每个group by 语句在数据库中的执行时间。
为了快速的加载,我采用了ehcache+terracotta集群的预加载数据,多个模块加载可以提高加载速度,减轻存储压力,架构图如下。

在说说现在比较流行的kylin,我在实现mondrian-cubes时,真的还不知道kylin这个项目,后来看过几篇kylin的文章,但是我看了一下原理与我实现的原理相似都是创建molap,也没有详细用过,但是我看到有些文章说kylin并没有完美的支持mondrian。我个人认为如果你的公司深入的使用你还是需要去深度研究研究mondrian源码的,那么你就可以像我这样实现这块的功能。不是特别复杂。你可以完全根据你公司的业务随时调整这块的功能。例如 刷新数据,定制加载哪部分 ,加载常用相关人员。等等。
以上是个人见解 谢谢。

mondrian 性能优化相关推荐

  1. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  2. MegEngine推理性能优化

    MegEngine推理性能优化 MegEngine「训练推理一体化」的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案 ...

  3. asp.net程序性能优化的七个方面

    asp.net程序性能优化的七个方面 一.数据库操作 1.用完马上关闭数据库连接 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器 ...

  4. java criteria限制条数_java架构—Oracle SQL性能优化

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先 ...

  5. ab测试nginx Nginx性能优化

    转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...

  6. RHEL/CentOS通用性能优化、安全配置参考

    RHEL/CentOS通用性能优化.安全配置参考 本文的配置参数是笔者在实际生产环境中反复实践总结的结果,完全适用绝大多数通用的高负载.安全性要求的网络服务器环境.故可以放心使用. 若有异议,欢迎联系 ...

  7. Android开发——布局性能优化的一些技巧(一)

    0. 前言 上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布 ...

  8. Web性能优化实践——应用层性能优化

    随着公司项目的进一步推广,用户数量的增加,已经面临着单台服务器不能负载的问题. 这次的优化由于时间关系主要分两步走,首先优化应用层代码以提高单台服务器的负载和吞吐率.之后再进行分表,引入队列.MemC ...

  9. 嵌入式linux内存使用和性能优化

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

最新文章

  1. 【前沿科技】看完这篇文章前,你绝对想象不到欧美航空机器人竟然发展到这个程度了!...
  2. ubuntu常用配置整理
  3. python代码规范 自动优化工具Black
  4. Java黑皮书课后题第7章:*7.13(随机数选择器)编写一个方法,返回1到54之间的随机数,但不能是传递到实参中的数。指定如下方法头
  5. CodeSmith 基础用法和例子
  6. curl-loader介绍
  7. 归并排序概念及其实现
  8. 极坐标潮流计算matlab,基于Matlab矩阵运算的潮流计算导纳矩阵计算方法与流程
  9. java实现获取中国大学名称列表、即所在省份
  10. spark on hive 的部署,和spark on hive (ha)在本地测试步骤
  11. jQuery手风琴菜单的制作
  12. scratch——这个电路仿真工具真不错
  13. 禁止蝰蛇鼠标驱动软件自动安装;如何在插入Razer设备时停止Razer Synapse安装程序
  14. 积分域为椭球的三重积分的求解方式----广义的极坐标变换
  15. 潜入维基解密机房:探访维基总部
  16. KDD CUP 2009年数据集介绍及链接
  17. 杰理之芯片名字【篇】
  18. php老黄历源码,基于聚合数据的老黄历接口调用示例-PHP版
  19. php实现在线视频播放,HTML如何实现视频在线播放
  20. 自适应反步控制matlab,刚体航天器的反步自适应滑模大角度姿态机动控制方法与流程...

热门文章

  1. BRD、MRD、PRD文档撰写工具介绍-----产品经理深入浅出课程
  2. 中国医药代理商大全 2005 多特软件站
  3. cam350菜单怎么切换成中文_电子设计软件CAM350各菜单使用说明(二)
  4. 成绩分析之极差和方差
  5. 平板电脑中的王者,不是只有苹果
  6. 网络字体的中文用法(一)
  7. 新萝卜家园Ghost版Win10系统X32极速装机版2015年4月
  8. NLite.Data的应用
  9. 机器学习-->贝叶斯网络
  10. centos 7 Docker 安装及配置镜像加速