问题的提出
BI系统的常见结构是:前端是BI应用,负责多维分析的用户操作和结果呈现;后台是数据库/数据仓库,负责数据计算和存储。前端和后台之间用SQL作为接口。
实际应用中,常常出现后台数据仓库压力过重的问题。问题表现为前端响应时间过长,数据仓库反应速度变慢。
常见的解决方案是在数据仓库和应用之间再增加一个前置数据库。但是前置数据库和后台数据仓库之间很难实现数据的路由和混合计算,例如:访问频次很高的热点数据放在前置数据库,大量冷数据放在数据仓库中,查询时按照一定规则来决定访问前置数据库还是后台数据仓库。而如果前置数据库和后台数据仓库是不同的产品,还要考虑SQL的翻译问题。
解决思路与过程
作为数据计算中间件(DCM),构建独立的数据前置层是集算器的重要应用模式。数据前置层将BI系统重构为三层结构:数据存储及批量数据计算层由数据库承担;数据前置及缓存层由集算器承担;数据分析展现层由多维分析工具或者报表工具承担。
集算器可以脱离数据库进行数据缓存和独立的复杂计算,同时具备可编程网关机制,可以在缓存计算和SQL透传之间自由切换。利用集算器完成前置层数据计算,可以与数据库承担的批量数据计算任务分离,并且不必再建设另外一个数据库。
集算器可以将热点数据、近期数据放在数据前置层,从而起到数据缓存的作用,可以有效提高数据计算的速度,减少用户等待时间。
系统架构图如下:
案例场景说明
前台BI系统,要针对订单数据做自助查询。查询的必选条件是订购日期。为了简化起见,前台BI系统用tomcat服务器中的jdbc.jsp来模拟。
集算器JDBC和智能网关集成在应用系统中。jdbc.jsp模仿BI应用系统,产生符合集算器简单查询规范的SQL,通过集算器JDBC提交给集算器智能网关处理。
数据来自于ORACLE数据库demo中的ORDERS表。ORDERS订单表是全量数据,集算器只存储最近三年的数据,比如:2015年-2018年。日期以订购日期为准。
基础数据准备与提取缓存数据
用下面的orders.sql文件在ORACLE数据库中完成ORDERS表的建表和数据初始化。
在集算器中,新建一个数据源orcl,连接ORACLE数据库。用SPL语言脚本etl1.dfx将最近三年的数据预先读取到集算器集文件orders.btx中。SPL脚本如下:
A | B | |
1 | =year(now())-3 | |
2 | =connect(“orcl”) | =A2.cursor@d(“select * from orders where to_char(orderdate,’yyyy’)>=?”,A1) |
3 | =file(“C:/tomcat6/webapps/gateway/WEB-INF/data/orders.btx”) | |
4 | =A3.export@z(B2) | >A2.close() |
从SPL脚本可以看出,只要在A4单元格中用一句export就可以将数据库中的数据导出到文件中。集文件是集算器内置的二进制文件格式,采用了简单压缩机制,相同数据量比数据库的占用空间会更小。@z选项表示写出可以分段的文件,很适合常常需要并行的多维分析类运算。
B2单元格中数据库游标的@d选项,表示从ORACLE数据库中取数的时候将numeric型数据转换成double型,精度对于金额这样的常见数值完全足够了。如果没有这个选项就会默认转换成big decimal型数据,计算性能会受到较大影响。
脚本可以用windows或者linux命令行的方式执行,结合定时任务,可以定时执行批量任务。windows命令行的调用方式是:
C:\Program Files\raqsoft\esProc\bin>esprocx.exe C: \etl1.dfx
linux命令是:
/raqsoft/esProc/bin/esprocx.sh /gateway/etl1.dfx
解决办法一:应用服务器集成计算
集算器JDBC智能网关接收到SQL后,转给gateway1.dfx程序处理。gateway1.dfx判断是否三年内的查询,如果是,就把表名换成文件名,查本地文件orders.btx返回结果。如果不是,把SQL转换成ORACLE格式,提交数据库处理。
1、下面的gateway目录复制到tomcat的应用目录。
目录结构如下图:
注意:配置文件在classes中,在官网上获取的授权文件也要放在classes目录中。集算器的Jar包要放在lib目录中(需要哪些jar请参照集算器教程)。另外,还需要检查和修改raqsoftConfig.xml中的如下配置:
<mainPath>C:\tomcat6\webapps\gateway\WEB-INF\dfx</mainPath>
<JDBC>
<load>Runtime,Server</load>
<gat