大大数据OLAP报表系统开发白皮书
Table of Contents
基本概念
BI
- 简单的方案是报表系统
- 深一个层次的商业智能是多维数据分析(OLAP)
- 更深层次是数据挖掘(Data Mining)
OLAP 介绍
Online analytical processing(OLAP)即 联机分析处理 。
联机分析处理(OLAP)系统是数据仓库系统最主要的应用,专门设计用于支持复杂的分析操作,侧重对决策人员和高层管理人员的决策支持,可以根 据分析人员的要求快速、灵活地进行大数据量的复杂查询处理,并且以一种直观而易懂的形式将查询结果提供给决策人员,以便他们准确掌握企业 (公司)的经营状况,了解对象的需求,制定正确的方案。
- 逻辑概念
- 维(Dimension):是人们观察数据的特定角度,是考虑问题时的一类属性,属性集合构成一个维(时间维、地理维等)。
- 维的层次(Level):人们观察数据的某个特定角度(即某个维)还可以存在细节程度不同的各个描述方面(时间维:日期、月份、季度、年)。
- 维的成员(Member):维的一个取值,是数据项在某维中位置的描述。(“某年某月某日”是在时间维上位置的描述)。
- 度量(Measure):多维数组的取值。(2000年1月,上海,笔记本电脑,0000)。
- OLAP的基本多维分析操作有钻取(Drill-up和Drill-down)、切片(Slice)和切块(Dice)、以及旋转(Pivot)等。
- 钻取:是改变维的层次,变换分析的粒度。它包括向下钻取(Drill-down)和向上钻取(Drill-up)/上卷(Roll-up)。Drill-up是在某一维上 将低层次的细节数据概括到高层次的汇总数据,或者减少维数;而Drill-down则相反,它从汇总数据深入到细节数据进行观察或增加新维。
- 切片和切块:是在一部分维上选定值后,关心度量数据在剩余维上的分布。如果剩余的维只有两个,则是切片;如果有三个或以上,则是切块。
- 旋转:是变换维的方向,即在表格中重新安排维的放置(例如行列互换)。
- 星形结构
- 事实(Fact)和维(Dimension)
当我们观察数据时,通常想察看聚合数据的某种顺序。这些数据叫做度量(measure)。度量就是可以度量和相加的数值。比如销售金额就是一种度量, 每个订单都有销售金额。假设每天销售20个产品,每个5美元,销售总额就是100美元。销售金额就是我们想关注的一种度量。此外我们可能还想知道 当天的顾客数,是5位顾客一共买了20个产品,还是1位顾客买了所有的20个产品呢?销售金额和顾客数量就是我们想关注的两个度量。
仅仅关心度量还不够。我们观察度量的时候都需要”by”条件。这些”by”条件就叫做维(dimension)。讨论销售金额的时候,总要指定是某一天, 某个季度或者某年的销售金额。几乎我们关心的任何度量都离不开时间维。我们可能还想按照产品名称或者产品类型查看销售金额,这些条件都要对 应到相应的维上。
由上可知,设计星型数据库的时候,我们首先要确定我们想看什么信息(确定度量),如何看这些信息(确定维)。
当我们开始创建维表的时候,有一些规则要牢记在心。第一,所有维表都要有一个基于单列的主键。这一主键列通常只是一标识列,包含自动递增的 数值,并没有真正的含义。有含义的信息都在其他列中,这些列包含了我们要查看的所有描述信息。比如在产品维中,包含了产品描述、类别、子类 等等。这些字段不能用来作为连接字段和其他表关联,但是包含了产品的所有描述信息。维表通常都比较胖,因为字段都比较多,每一字段都比较宽
创建事实表(Fact Table) 事实表存放度量(measure)信息,或者称事实(fact)信息。度量是根据各个维计算出来的一些数值。比如说销售金额是个数值,我们可以按产品、安 类型查看总数,可以查看任何时间段的所有总数。跟维表的又矮又胖相比,事实表一般显得又高又瘦。事实表很高,是因为他们拥有的记录数一般都 很巨大。
MDX
SELECT NON EMPTY {Hierarchize({[Measures].[已结算金额]})} ON COLUMNS, NON EMPTY {Hierarchize({{[Time.按周统计].[18], [Time.按周统计].[19], [Time.按周统计].[20], [Time.按周统计].[21]}})} ON ROWS FROM [SalesMoneyReportv2]
前端
jquery-ui-portlet
Bootstrap
Angular-dashboard
后端
Mondrian 介绍
Mondrian是一个BI开源项目。一个用Java写成的OLAP(在线分析性处理)引擎。它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据。然后经过Java API用多维的方式对结果进行展示。
saiku
Saiku介绍
Saiku是一个模块化的开源分析套件,它提供轻量级的OLAP(联机分析处理),并且可嵌入、可扩展、可配置。
Saiku 基本配置
- Schema 文件 https://github.com/standino/saiku/blob/master/FoodMart.xml
- 连接数据库 http://wiki.meteorite.bi/display/SAIK/Data+Sources
- 自定义角色 https://gist.github.com/standino/75198cd6f4e78ec8bfeb
- Mondrian-Dynamic-Schema-Processor https://github.com/pentahofan/Mondrian-Dynamic-Schema-Processor
saiku 插件编写
- https://github.com/OSBI/saiku-ui/wiki/Plugins
- https://github.com/brenopolanski/saiku-plugin-boilerplate
- SaikuChartPlus https://github.com/it4biz/SaikuChartPlus
1)编辑index.html, 插入如下代码:
<!--search for this and put the files under this--> <script type="text/javascript" src="js/saiku/plugins/CCC_Chart/plugin.js" ></script> <!--start js SaikuChartPlus--> <script type="text/javascript" src="js/saiku/plugins/saiku-chart-plus/plugin.js" ></script> <!--end js SaikuChartPlus-->
- 拷贝插件代码到如下目录 webapps/ROOT/js/saiku/plugins
嵌入式图表的使用
- 使用保存的query
这种使用方式需要先把要展示的表格和图表保存下来,通过传入文件路径来展示。这种方式适合不需要下钻的图表。
只要访问下面两个url就可以展示相应的表格和图表。
- http://sone.dev.__my_company_1__.com:8015/saiku-ui/embed/index.html#table/mon.saiku
- http://sone.dev.__my_company_1__.com:8015/saiku-ui/embed/index.html#chart/mon.saiku
井号(#)后面第一个参数表示是表格还是图表,后边是保存query的文件的路径。
还有一种方式显示图表,url如下。这种方式的优点是可以对表格进行过滤和查询。也可以使用saiku的插件进一步丰富其功能。
- 使用mdx查询
这种方式比较灵活,可以编写多种mdx查询语句从后台获得数据,进行展示。
- http://sone.dev.__my_company_1__.com:8015/saiku-ui/embed/index.html#mdxtable/mon.saiku
- http://sone.dev.__my_company_1__.com:8015/saiku-ui/embed/index.html#mdxchart/mon.saiku
大家可以看看下面的代码了解一下具体实现。
- 相关代码
缓存
- http://infocenter.pentaho.com/help/index.jsp?topic=/analysis_guide/concept_segment_cache_architecture.html
- https://github.com/pentaho/mondrian/blob/master/src/main/mondrian/rolap/cache/MemorySegmentCache.java
- http://mondrian.pentaho.com/api/mondrian/spi/SegmentCache.html
- http://stackoverflow.com/questions/17533594/implementing-a-mondrian-shared-segmentcache
- https://github.com/webdetails/cdc/blob/master/cdc-core/src/pt/webdetails/cdc/mondrian/SegmentCacheHazelcast.java
我们使用redis作为缓存。mondrian 默认是不支持 redis的。我们需要自己实现。
pig
hive
oozie.apache.org
Oozie is a workflow scheduler system to manage Apache Hadoop jobs.
optiq
- https://github.com/julianhyde/optiq
- Optiq: a SQL front-end for everything
- http://www.coderanch.com/t/621003/big-data/databases/Mondrian-Action-supported-databases
- http://www.slideshare.net/planetcassandra/south-bay-cassandrealtime-analytics-using-cassandra-spark-and-shark-at-ooyala
- https://wiki.apache.org/incubator/OptiqProposal
- http://incubator.apache.org/projects/optiq.html
spark SQL
mysql
mongodb
性能优化
引入 redis 缓存
分库分表
参考资料
- 数据仓库的架构主要有星型和雪花型两种方式
- http://wenku.baidu.com/view/7a2615a20029bd64783e2cf1.html
- http://blog.sina.com.cn/s/blog_7d8f0a900100qplj.html
- http://www.huqiwen.com/2012/06/15/olap-abstruct-and-mondrian-quick-start/
- Saiku Server环境搭建
- Saiku去掉登录模块
- https://github.com/pentaho/mondrian
- https://github.com/OSBI/saiku
- http://ci.analytical-labs.com/
- http://docs.analytical-labs.com/
- How to quickly add a date dimension to a Pentaho Mondrian OLAP cube http://www.freeportmetrics.com/devblog/2012/11/02/how-to-quickly-add-date-dimension-to-pentaho-mondrian-olap-cube/
- Mondrian 文档 http://mondrian.pentaho.com/documentation/schema.php#Time_dimensions
- http://blog.analytical-labs.com/
- http://forums.meteorite.bi/
- http://jira.meteorite.bi/secure/Dashboard.jspa
- http://docs.analytical-labs.com/
- http://jira.pentaho.com/browse/MONDRIAN-1584
- Backbone入门指南(一):什么是Backbone? http://yujianshenbing.iteye.com/blog/1748447
- http://documentcloud.github.com/underscore/
- mysql中的load data infile用法
- 定时备份mysql数据库 并删除7天前的备份 (windows linux )
- mysql定时备份和删除
- mysql删除大表的部分数据
/?mode=table&plugin=true#query/open/aaf.saiku
saiku-ui?mode=table&plugin=true#query/open/demo.saiku
saiku-ui?mode=view&plugin=true#query/open/demo.saiku