时人不识凌云木,直待凌云始道高。这篇文章主要讲述云原生|中间件开源 SPL 轻松应对 T+0相关的知识,希望能为你提供帮助。
T+0问题
T+0查询是指实时数据查询,数据查询统计时将涉及到最新产生的数据。在数据量不大时,T+0很容易完成,直接基于生产数据库查询就可以了。但是,当数据量积累到一定程度时,在生产库中进行大数据量的查询会消耗过多的数据库资源,严重时会影响交易业务,这就不能接受了,毕竟生产交易是更关键的任务。所以,我们常常会把大量用于查询分析的历史数据从生产库中分离出去,使用单独的数据库存储和查询,以保证查询统计不会影响生产业务,这就是常说的冷热数据分离。
文章图片
数据分离后就会产生T+0问题。数据拆分到两个数据库中,要查询全量数据就涉及跨库查询。而且,我们知道,用于交易的生产库大多使用能够保证事务一致性的RDB,而分离出来的冷数据(量大且不再修改)则会更多使用专门的分析型数据库或数据平台存储,即使是关系数据库也很可能与原来的生产库类型不同,这就不仅涉及跨库,还需要跨异构库(源)查询。遗憾的是,当前实现跨库查询的技术都存在这样那样的问题。
数据库自身的跨库查询功能(如Oracle的DBLink、mysql的FEDERATED、MSSQL的Linked Server等)通常是将远程数据库的数据拉到本地,再在本地完成包括过滤在内的大部分计算,整个过程十分低效。不仅如此,这种方式还存在数据传输不稳定、不支持大对象操作、可扩展性低等很多不足。
除了数据库自身的跨库查询能力,使用高级语言硬编码也可以完成跨库查询,毕竟没有什么问题不是硬编码解决不了的。这种方式虽然灵活,但使用难度却很大,尤其对于当前大部分应用的开发语言java来说,缺少足够的结构化数据计算类库使得完成跨库查询后的计算很难完成,通常只能做简单的列表式查询,而涉及到统计汇总类的运算就会异常麻烦。
事实上,要解决分库后的T+0查询问题也并非难事,只要有具备这样一些能力的计算引擎就可以实现:能够对接多种数据源;拥有不依赖数据库的完善计算能力以完成多库数据归集后的数据计算工作;还可以利用数据库(源)的能力充分发挥数据库的效能;提供简单的数据计算接口;性能相对理想等。
引入SPL
可以借助开源SPL可以实现这些目标。SPL是一款开源数据计算引擎,提供了大量结构化数据计算函数并拥有完备计算能力,支持多数据源混合计算,可以同时连接存储热数据的业务库和存储冷数据的历史库完成全量数据T+0查询。
由于具备独立且完善的计算能力,SPL可以分别从不同的数据库取数计算,因此可以很好适应异构数据库的情况,还可以根据数据库的资源状况决定计算是在数据库还是SPL中实施,非常灵活。在计算实现上,SPL的敏捷语法与过程计算可以大大简化T+0查询中的复杂计算,提升开发效率,SPL解释执行支持热部署。更进一步,依托SPL的强计算能力还可以完成冷热数据分离时的ETL任务。
SPL还提供了自有的高性能二进制文件存储,对性能要求较高时可以将历史冷数据使用文件存储,再借助SPL的高性能算法与并行计算来提升查询效率。此外,SPL封装了标准应用接口(JDBC/ODBC/RESTful)供应用集成调用,也可以将SPL嵌入应用中使用,这样应用就轻松具备了T+0查询与复杂数据处理能力,将计算和存储分离也更符合当代应用架构的需要。
冷热混合计算对于常见的冷热分库T+0查询场景,SPL实现很简单,这里看一个例子。
A | B | |
1 | =[[connect@l("oracle"),"ORACLE"],[connect@l("mysql"),"MYSQL"]] | |
2 | =SQL="select month(orderdate) ordermonth,sellerid,sum(amount) samount,count(amount) camount from sales group by month(orderdate),sellerid" | |
3 | fork A1 | =SQL.sqltranslate(A3(2)) |
4 | =A3(1).query(B3) | |
5 | =A3.conj().groups(ordermonth,sellerid;
sum(samount):totalamount,sum(camount):totalcount) |
在这里,SPL不仅完成了两个数据库的跨库查询,还提供了SQL转换方法,更利于前端应用使用,同时拥有合并两个数据库计算结果后的继续计算能力,本例是分组汇总。SPL还有更丰富的结构化数据对象及其上的丰富运算,除了分组汇总、循环分支、排序过滤、集合运算等基础计算外,位置计算、排序排名、不规则分组也不在话下。
除了RDB,对于有些场景涉及的NoSQL、Hadoop等数据源也能支持,SPL具备多源混算能力,无论基于何种数据源都可以进行混合查询实现T+0。比如MongoDB与MySQL混合查询:
A | |
1 | =mongo_open("mongodb://127.0.0.1:27017/mongo") |
2 | =mongo_shell(A1,"Orders.find()") |
3 | =A2.new(Orders.OrderID:orderid,Orders.Client:client,Dept:dept,Amount:amount).fetch() |
4 | =mongo_close(A1) |
5 | =mysql.query@x(“select ordered,client,dept,amount from orders”) |
6 | =[A3,A5].conj() |
7 | …后续计算 |
A | |
1 | &
gt;
source=connect@l(“oracle”),target=connect@l(“mysql”) |
2 | =source.cursor(“select * from orders”) |
3 | =target.query(“select oldCode,newCode from codeComp”).keys@i(oldcode) |
4 | =A2.run(pid=A3.find(pid).newcode) |
5 | &
gt;
target.execute(A2,"insert into orders values(?,?,?,?,?) ",#1,#2,#3,#4,#5) |
6 | &
gt;
source.close(),target.close() |
这些问题都可以通过SPL来解决,SPL提供了两种高性能二进制数据存储格式集文件和组表,再借助SPL的独立计算能力可以直接基于文件和数据库混合计算实现高效T+0查询。比如前面的例子,可以使用SPL文件存储历史冷数据与生产库热数据混合查询。
A | |
1 | =connect("oracle") |
2 | =A1.query@x("select sellerid, sum(amount) totalamount, count(amount) countamount,max(amount) maxamount,min(amount) minamount from sales group by sellerid") |
3 | =file(“his_sales.btx”).cursor@b() |
4 | =A3.groups(sellerid;
sum(amount):totalamount,count(amount):countamount,max(amount):maxamount,min(amount):minamount) |
5 | =[A3,A4].conj().groups(sellerid;
sum(totalamount):totalamount,sum(countamount):countamount,max(maxamount):maxamount,min(minamount):minamount) |
SPL还有另外一种支持列存的高效存储形式组表,在参与计算的列数(字段)较少时会有巨大优势。组表上还实现了minmax索引,也支持倍增分段,这样不仅能享受到列存的优势,也更容易并行提升计算性能。
SPL还支持各种高性能算法。比如常见的TopN运算,在SPL中TopN被理解为聚合运算,这样可以将高复杂度的排序转换成低复杂度的聚合运算,而且很还能扩展应用范围。
A | ||
1 | =file(“data.ctx”).create().cursor() | |
2 | =A1.groups(;
top(10,amount)) | 金额在前10名的订单 |
3 | =A1.groups(area;
top(10,amount)) | 每个地区金额在前10名的订单 |
SPL也很容易实施并行计算,发挥多CPU的优势。SPL有很多计算函数都提供并行机制,如文件读取、过滤、排序只要增加一个@m选项就可以自动实施并行计算,简单方便。
易集成SPL封装了标准JDBC和ODBC接口供应用调用,特别对于Java应用可以将SPL嵌入应用内使用,T+0查询能力在应用端实现,不再依赖数据源,这样可以充分解耦应用与数据源,获得很好的移植性和可扩展性。
JDBC调用SPL 代码示例:
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
Statement st = connection.();
CallableStatement st = conn.prepareCall("call splscript(?, ?)");
st.setObject(1, 3000);
st.setObject(2, 5000);
ResultSet result=st.execute();
SPL是解释执行的,天然支持热切换。基于SPL的数据计算逻辑编写、修改后不需要重启,实时生效,使开发运维更加便捷。
【云原生|中间件开源 SPL 轻松应对 T+0】相对其它T+0实现技术,SPL借助自身独立的强计算与跨数据源计算能力可以更方便完成T+0查询,同时提供的高性能存储和高性能算法可以充分保障查询效率,良好的集成性使得应用端可以轻松具备这些能力,是名副其实的T+0查询利器。
SPL资料
- ??SPL源代码??
推荐阅读
- Azure 应用服务Azure Function 中运行Powershell 脚本,定位 -DefaultProfile 引发的错误
- Azure 应用服务App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)()
- 云原生核心技术之——Kubernetes
- Azure 应用服务App Service 部署txt静态文件和Jar包在不同目录中的解决办法
- LeetCode剑指offer46把数字翻译成字符串(动态规划)
- LeetCode5最大回文子串(中心扩散法)
- (ICCV-2021)用于步态识别的上下文敏感时间特征学习
- (ICCV-2021)通过有效的全局-局部特征表示和局部时间聚合进行步态识别
- (ICCV-2021)用于步态识别的3D局部卷积神经网络