但是,这三种选择都有各自的问题。普通数据库一样平常都是行式存储,很难得到多维剖析希望的高性能,只适用较小数据量。专业数据仓库有不少是列式存储的,性能问题不大,但是价格都比较昂贵,培植、扩展和掩护本钱也都非常高。BI 系统自带的数据源都比较封闭,只能为自家的 BI 前端供应支持,无法为多个不同厂家的前端供应数据做事。
办理思路与过程集算器可以独立承担轻量级多维剖析后台的浸染,相称于中小型数据仓库或者数据集市。构造图如下:
集算器可以将多维剖析的数据事先以列存形式存储到二进制文件中,称为组表。多维剖析前端运用拖拽天生 SQL,通过集算器 JDBC 提交。集算器对组表实行 SQL 查询,将结果返回给多维剖析前端。组表文件也可由集算器从各种异构数据源采集数据并打算而来。
和普通数据库方案比较,集算器列存的二进制文件能够直接提升性能。而对付昂贵的专业数据库和相对封闭的 BI 自带数据源,集算器可以供应更加经济、简便的办理方案,并能够从各种异构数据源采集数据。
集算器有三种支配办法:1、集成在前端运用中;2、独立做事器;3、集群热备。下面先容详细方法。
案例场景解释
不才面的案例中,多维剖析系统要针对订单数据做自助剖析。为了简化起见,多维剖析系统前台用 tomcat 做事器中的 jdbc.jsp 来仿照。Tomcat 安装在 windows 操作系统的 C:\tomcat6。
集算器 JDBC 集成在多维剖析运用中。jdbc.jsp 模拟多维剖析运用系统,产生符合集算器规范的 SQL,通过集算器 JDBC 提交给集算器 SPL 脚本处理。
多维剖析系统的数据来自于生产数据库 demo 中的 ORDERS 表,生产库是 ORACLE 数据库。多维剖析系统不能直接连 demo 数据库实现剖析,以免给生产数据库带来过多的压力。ORDERS 订单表是全量数据,集算器 ETL 每天将当天的最新数据同步到组表文件中。日期以订购日期 ORDERDATE 为准,假设当前的日期是 2015-07-18。
后台数据初始化
用下面的 ordersAll.sql 文件在 ORACLE 数据库中完成 ORDERS 表的建表和数据初始化。
ordersAll
数据截止到 2017 年 7 月 17 日。
多维剖析系统后台上线初始化的时候,要将 ORDERS 表中的历史数据同步到集算器的二进制文件中。这是上线前一次性实行的准备事情,上线运行后就不须要实行了。
在集算器中,新建一个数据源 orcl,连接 ORACLE 数据库。用 SPL 措辞脚本 etlAll.dfx 将全部数据读取到集算器组表文件 orders.ctx 中。SPL 脚本如下:
Orders.ctx 是组表文件,默认是采取列式存储的,支持任意分段的并行打算,可以有效提升查询速率。天生组表的时候,要把稳数据预先排序和合理定义维字段。本例中,按照常常过滤、分组的字段,将维字段确定为:ORDERDATE,CUSTOMERID,EMPLOYEEID, ORDERID。
从 ORACLE 中取得数据的时候,要按照维字段排序。由于 ORDERDATE,CUSTOMERID,EMPLOYEEID 对应的重复数据多,以是放在前面排序;ORDERID 对应的重复数据少,以是放在后面排序。
B1 单元格中数据库游标的 @d 选项,表示从 ORACLE 数据库中取数的时候将 numeric 型数据转换成 double 型,精度对付金额这样的常见数值完备足够了。如果没有这个选项就会默认转换成 big decimal 型数据,打算性能会受到较大影响。
ETL 过程
多维剖析系统上线之后,要每天晚上定时同步当天最新的数据。我们假设当天日期是 2015-07-18。用下面的 ordersUpdate.sql 文件在 ORACLE 数据库给 ORDERS 表增加当天的数据,仿照数据的增量。
ordersUpdate
用 SPL 措辞脚本 etlUpdate1.dfx 将当天数据增量补充到集算器组表文件 orders.ctx 中。SPL 脚本如下:
etlUpdate.dfx 的输入参数是 etlDate,也便是须要新增确当天日期。
B4 单元格直接将新数据追加到组表文件中。由于第一个排序字段是 orderdate,以是追加新数据不会影响排序。如果第一个排序字段不是 orderdate,就要重新排序。
C4 中的 rollback 是回滚函数,若 B4 实行 append 过程中,涌现缺点,那么将实行回滚操作,规复到 append 操作之前的组表状态。正常实行完毕,则不会回滚。
etlUpdate1.dfx 脚本可以用 windows 或者 linux 命令行的办法实行,结合定时任务,可以定时实行。也可以用 ETL 工具来定时调用。
windows 命令行的调用办法是:
C:\\Program Files\\raqsoft\\esProc\\bin>esprocx.exe C: \\etlUpdate1.dfx
linux 命令是:
/raqsoft/esProc/bin/esprocx.sh /esproc/ etlUpdate1.dfx
运用构造一:运用集成打算
集算器 JDBC 集成在多维剖析的运用中,吸收到 SQL 后查本地文件 orders.ctx 返回结果。
1、下面压缩文件中的 DW 目录复制到 tomcat 的运用目录。
DW
目录构造如下图:
配置文件在 classes 中,在官网上获取的授权文件也要放在 classes 目录中。集算器的 Jar 包要放在 lib 目录中(须要哪些 jar 请参照集算器教程)。
修正 raqsoftConfig.xml 中的主目录配置:
<mainPath>C:\\tomcat6\\webapps\\DW\\WEB-INF\\data</mainPath>
配置好主目录后,orders.ctx 就可以不写全路径名,直接写 from orders.ctx 即可。
2、编辑 DW 目录中的 jdbc.jsp,仿照前台界面提交 sql 展现结果。
<%@ page language=”java” import=”java.util.” pageEncoding=”utf-8″%><%@ page import=”java.sql.” %><body><%String driver = “com.esproc.jdbc.InternalDriver”;String url = “jdbc:esproc:local://”;try {Class.forName(driver);Connection conn = DriverManager.getConnection(url);Statement statement = conn.createStatement();String sql =”select top 10 ORDERID,CUSTOMERID,EMPLOYEEID,ORDERDATE,AMOUNT from ORDERS.ctx where ORDERDATE=date(‘2015-07-18’) and AMOUNT>100″;out.println(“Test page v1<br><br><br><pre>”);out.println(“订单ID”+”\\t”+”客户ID”+”\\t”+”雇员ID”+”\\t”+”订购日期”+”\\t”+”订单金额”+”<br>”);ResultSet rs = statement.executeQuery(sql);int f1,f6;String f2,f3,f4;float f5;while (rs.next()) {f1 = rs.getInt(“ORDERID”);f2 = rs.getString(“CUSTOMERID”);f3 = rs.getString(“EMPLOYEEID”);f4 = rs.getString(“ORDERDATE”);f5 = rs.getFloat(“AMOUNT”);out.println(f1+”\\t”+f2+”\\t”+f3+”\\t”+f4+”\\t”+f5+”\\t”+”<br>”);}out.println(“</pre>”);rs.close();conn.close();} catch (ClassNotFoundException e) {System.out.println(“Sorry,can`t find the Driver!”);e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}%></body>
可以看到,jsp 中先连接集算器的 JDBC,然后提交实行 SQL。步骤和一样平常的数据库完备一样,具有很高的兼容性和通用性。对付多维剖析工具来说,虽然是界面操作来连接 JDBC 和提交 SQL,但是基本事理和 jsp 完备一样。
3、启动 tomcat,在浏览器中访问 http://localhost:8080/DW/jdbc.jsp,查当作果。
还可以连续测试如下情形:
1、分组汇总
sql =\"大众select CUSTOMERID,EMPLOYEEID,sum(AMOUNT) 订单总额,count(1) 订单数量 from ORDERS.ctx where ORDERDATE=date(‘2015-07-18’) group by CUSTOMERID,EMPLOYEEID\"大众;
2、并行查询
sql=\公众select /+ parallel (4) /top 10 ORDERID,CUSTOMERID,EMPLOYEEID,ORDERDATE,AMOUNT from ORDERS.ctx where ORDERDATE=date('2015-07-18') and AMOUNT>100\"大众
和 ORACLE 类似,集算器大略 SQL 也支持 /+ parallel (4) / 这样的并行查询。
运用构造二:独立做事器
第一种办理办法是利用运用做事器的资源。在并发量很大,或者数据量很大的情形下,运用做事器会涌现较大压力。这种情形下,推举用独立的节点做事器进行数据打算。
集算器 JDBC 吸收到 SQL 后,转给 DW.dfx 程序处理。DW.dfx 调用节点做事器上的 DWServer.dfx 进行打算。DWServer.dfx 把表名换成文件名,查本地文件 orders.ctx 返回结果。
下面的 DWServer 目录复制到须要的目录。集算器的节点做事用具备跨平台的特性,可以运行在任何支持 Java 的操作系统上,支配方法拜会集算器教程。这里假设放到 windows 操作系统的 C 盘根目录。
DWServer
1、系统上线之前实行初始化 dfx,将 orders.ctx 文件放到 C:/DWServer/data 目录中。测试的时候可以直接将已经天生好的 orders.ctx 复制过去。
2、修正前面的 dfx,将 A1 改为 =file(“C:/DWServer/data/orders.ctx”),另存为 etlUpdate2.dfx。修恰好的 etlUpdate2.dfx 在 c:\DWServer 目录。
3、打开运用做事器中的 C:\\tomcat6\\webapps\\DW\\WEB-INF\\dfx\\DW.dfx,不雅观察理解 SPL 代码。参数 sql 是传入的 SQL 语句。
A1:调用节点机上的 DWServer.dfx。参数是 [sql],中括号表示序列,此时是只有一个成员的序列。[“127.0.0.1:8281”] 是节点机的序列,采取 IP: 端口号的办法。
A2:返回 A1 调用的结果。由于调用结果是序列,以是要用 ifn 函数找到序列中第一个不为空的成员,便是 SQL 对应的返回结果。
修正 C:\\tomcat6\\webapps\\DW\\WEB-INF\\classes\\raqsoftConfig.xml 中的如下配置:
<mainPath>C:\\tomcat6\\webapps\\DW\\WEB-INF\\dfx</mainPath><JDBC><load>Runtime,Server</load><gateway>DW.dfx</gateway></JDBC>
这里标签的内容便是 JDBC 网关 dfx 文件。在 BI 系统中调用集算器 JDBC 时,所实行的 SQL 都将交由网关文件处理。如果不配置这个标签,JDBC 提交的语句会被集算器当作脚本直接解析运算。
4、启动节点做事器。
运行 esprocs.exe, 如下图:
点击配置按钮,配置干系参数:
点击确定后,返回主界面,点击启动按钮。
5、打开 C:\DWServer\dfx\DWServer.dfx,不雅观察理解 SPL 代码。
A1:定义集算器集文件的绝对路径。
A2:将文件名更换为绝对路径。
A3-C3:连接文件系统。实行 SQL 得到游标并返回。
做事器办法也可以和“运用构造一”中一样配置主目录,A2 就不用写绝对路径了。路径写在这里的 SPL 中,好处是同一个做事器可以给多套数据表(文件)供应做事。如果很多文件都在主目录下,会未便利管理。
6、重启 tomcat,在浏览器中访问 http://localhost:8080/DW/jdbc.jsp,查当作果。
运用构造三:集群热备
在并发量不断增大,或者数据量不断增加的情形下,节点做事器可以进行横向扩展,应对大并发或大数据量打算的压力。
1、在另一台 window 的机器上再支配一套集算器节点,支配方法和解决方法二略有不同,须要配置一下数据分区。两台做事器的 IP 地址是 168.0.122 和 192.168.0.176。方法二中的 c:\\DWServer 目录也要复制到另一台做事器上。
图中数据分区名称配置为 0,路径是 c:/DWServer/data。把稳,两个做事器都要配置。
2、改写 168.0.122 上的 c:/DWServer/dfx/etlUpdate2.dfx,另存为 etlUpdate3.dfx。
A6 单元格是将更新之后的 orders.ctx 同步到 192.168.0.176 的 0 分区,也便是 C:/ DWServer/data 目录。[“192.168.0.176:8281”] 是指须要同步的节点机列表,如果有更多的节点机须要同步,可以写作:[“IP1:PORT1″,”IP2:PORT2″,”IP3:PORT3”]。
由于这里有同步的代码,以是只须要在 192.168.0.122 上实行定时任务 etlUpdate3.dfx 就可以了。
3、打开运用做事器中的 C:\tomcat6\webapps\DW\WEB-INF\dfx\DW.dfx,修正如下:
A1:调用节点机上的 DWServer.dfx。参数是 [sql],中括号表示序列,此时是只有一个成员的序列。由于节点机是集群,以是有两个 IP 地址。在多并发时 callx 会随机访问两个节点。
4、重启 tomcat,在浏览器中访问 http://localhost:8080/DW/jdbc.jsp,查当作果。
集算器上风总结开放的轻量级数据仓库 / 数据集市
集算器是专业的数据打算中间件(DCM),具备独立打算的能力,可以分开数据库、数据仓库为多维剖析系统前端供应数据源做事。
集算器采取列存数据,具备专业数据仓库的查询性能,千万级别的数据量,可以达到秒级的明细查询速率。普通数据库一样平常都是行存,无法达到多维剖析的性能哀求。同时,和专业数据仓库不同,集算器价格都较低,培植、扩展和掩护本钱都比较小。
集算器是开放的,对多维剖析系统前端供应标准的 JDBC 做事。可以形成平台式的后台数据源,为多个不同厂家的前端同时供应数据做事。
组表列存 / 有序压缩存储
前辈的数据存储办法,是数据打算中间件(DCM)成功履行的主要保障。
集算器组表采取列存办法存储数据,对付字段特殊多的宽表查询,性能提升特殊明显。组表采取的列存机制和常规列存是不同的。常规列存(比如 parquet 格式),只能分块之后,再在块内列存,在做并行打算的时候是受限的。组表的可并行压缩列存机制,采取倍增分段技能,许可任意分段的并行打算,可以利用多 CPU 核的打算能力把硬盘的 IO 发挥到极致。
组表天生的时候,要指定维字段,数据本身是按照维字段有序存放的,常用的条件过滤打算不依赖索引也能担保高性能。文件采取压缩存储,减小在硬盘上占用的空间,读取更快。由于采取了得当的压缩比,解压缩占用的 CPU 韶光可以忽略不计。
组表也可以采纳行存和全内存存储数据,支持内存数据库办法运行。
集群功能
敏捷的集群能力可以担保数据打算中间件(DCM)的高性能和高可用性。
集算器节点做事器是独立进程,可以接管集算器 JDBC 的打算要求并返回结果。对付并发访问的情形,可以发给多个做事器同时打算,提高并发容量。对付单个大打算任务的情形,可以分成多个小任务,发给多个做事器同时打算,起到大数据并行打算的浸染。
集算器集群打算方案,具备敏捷的横向扩展能力,并发量或者数据量大时可以通过快速增加节点来办理。集算器集群也具备容错能力,即有个别节点失落效时还能确保全体集群能事情,打算任务能连续实行完毕,起到多机热备和担保高可用性的浸染。
运用推广作为数据打算中间件(DCM),集算器供应的后台数据源可以支持各种前端运用,不仅仅限于前端是多维剖析的情形。例如:大屏展示、管理驾驶舱、实时报表、大数据量清单报表、报表批量订阅等等。
集算器形成的后台数据源也可以和数据库、数据仓库合营利用。集算器实现的数据打算网关和路由,可以在集算器缓存数据和数据仓库之间智能切换,办理数据仓库无法知足性能哀求的问题。例如:冷热数据分开打算的场景。详细做法拜会《用打算路由的方法优化BI后台性能》。