一直以来,我们有一个愿望:
Structured Process Language
面向过程的结构化数据计算语言
Data Computing Middleware
数据计算中间件
High Performance Computing
高性能计算
结构化数据总是批量形式
WHERE,ORDER BY,GROUP
INTERSECT,UNION,MINUS
集合成员可以游离在集合外存在
独立运算或及其它游离成员再组合新集合运算
只有单行记录的表,没有游离记录
计算结果总是新产生,和原记录无关
彻底的集合化需要离散性的支持
允许游离成员组成新集合
有序计算是集合化与离散性的结合物
运算不仅与数据本身有关,还和数据所在位置有关
A | |
---|---|
1 | =股票.sort(交易日).group@i(收盘价<收盘价[-1]).max(~.len()) |
1 | SELECT max(连续日数)-1 FROM |
---|---|
2 | (SELECT count(*) 连续日数 FROM |
3 | (SELECT SUM(涨跌标志) OVER ( ORDER BY 交易日) 不涨日数 FROM |
4 | ( SELECT 交易日, |
5 | CASE WHEN 收盘价>LAG(收盘价) OVER( ORDER BY 交易日 THEN 0 ELSE 1 END 涨跌标志 |
6 | FROM 股票 )) |
7 | GROUP BY 不涨日数) |
A | |
---|---|
1 | =股票.sort(交易日).group(代码) |
2 | =A1.select((a=0,~.pselect(a=if(收盘价>收盘价[-1],a+1,0):3))>0).(代码) |
感受SPL分步骤解题的思路,以及有序运算的效能!
1 | WITH A AS |
---|---|
2 | (SELECT 代码,交易日, 收盘价-LAG(收盘价) OVER (PARITITION BY 代码 ORDER BY 涨幅) FROM 股票) |
3 | B AS |
4 | (SELECT 代码, |
5 | CASE WHEN 涨幅>0 AND |
6 | LAG(涨幅) OVER (PARTITION BY 代码 ORDER BY 交易日) >0 AND |
7 | LAG(涨幅,2) OVER PARTITION BY 代码 ORDER BY 交易日) >0 |
8 | THEN 1 ELSE 0 END 三天连涨标志 FROM A) |
9 | SELECT distinct 代码 FROM B WHERE 三天连涨标志=1 |
计算逻辑脚本单独维护,方便模块化
集算器使用JAVA开发,提供标准应用接口可无缝集成到应用中
直接使用多个数据源混合计算,无需后台先将数据统一(ETL)后再计算
针对MongoDB和文件等使用SQL进行查询
目前T+0在线计算常用方式与存在问题
大量的历史数据会导致高昂的数据库成本(存储成本和性能成本)
需要数据库具有跨库运算能力,但实施复杂度较高,性能较低;当数据库类型不同时难以实现
集算器可以基于多个异构数据库完成报表T+0查询;
还可以将历史数据存放到IO性能更佳的文件系统中采用集群运算获得更高性能和更低成本
文件系统IO性能高于数据库,还可以使用压缩数据存储、列式存储、内存记录引用,以及分布式集群等获得更高性能,减轻数据库负担
软件改变不了硬件的计算性能
但软件可以设计一些高效(低复杂度)算法,降低计算规模,从而提升计算性能
这类方案通常需要定制化,因地制宜,看菜吃饭
集算器使用了诸多高效算法:
了解了计算和数据特征,就可以选用适合的算法,从而获得高性能
测试用例 | Intel X86芯片 | 国产飞腾芯片 | |||
---|---|---|---|---|---|
SPL读文件计算 | SPL读数据库计算 | 数据库中SQL计算 | SPL读文件计算 | SPL读数据库计算 | |
连接后并集 | - | 3.8 | >1小时 | - | - |
连接后交集 | - | 3.9 | >1小时 | - | - |
多对多连接遍历 | 69 | 103 | >1小时 | 93 | 268 |
有序分组遍历 | 100 | 647 | >1小时 | 102 | 2037 |
多步过程计算 | 272 | 848 | >1小时 | 377 | >1小时 |
大分组 | 39 | 155 | 2573 | 56 | 2493 |
大表关联分组 | 111 | 566 | >1小时 | 178 | 2106 |
批量键值查询 | 15 | >1小时 | >1小时 | 15 | >1小时 |
【注】SPL是润乾集算器采用的程序设计语言;SQL是关系数据库采用的程序设计语言
私有数据存储格式,集文件、组表
支持以树状目录方式按业务分类存储数据
提供内外存两种数据容错机制,外存冗余式容错,内存备胎式容错
支持计算容错,节点故障时自动将该节点计算任务迁移掉其他节点继续完成
用户可根据数据和计算任务的特点灵活定制数据分布及冗余方案,有效减少节点间数据传输量,以获得更高性能
集群没有永久的中心主控节点,程序员用代码控制参与计算的节点
根据每个节点空闲程度(线程数量)决定是否分配任务,实现负担和资源的有效平衡