大哥商品做网站的目的,上海网站建设网站优化app,网络营销有什么岗位,张圣志建盏个人简介T0问题
T0查询是指实时数据查询#xff0c;数据查询统计时将涉及到最新产生的数据。在数据量不大时#xff0c;T0很容易完成#xff0c;直接基于生产数据库查询就可以了。但是#xff0c;当数据量积累到一定程度时#xff0c;在生产库中进行大数据量的查询会消耗过多的数…T0问题
T0查询是指实时数据查询数据查询统计时将涉及到最新产生的数据。在数据量不大时T0很容易完成直接基于生产数据库查询就可以了。但是当数据量积累到一定程度时在生产库中进行大数据量的查询会消耗过多的数据库资源严重时会影响交易业务这就不能接受了毕竟生产交易是更关键的任务。所以我们常常会把大量用于查询分析的历史数据从生产库中分离出去使用单独的数据库存储和查询以保证查询统计不会影响生产业务这就是常说的冷热数据分离。 数据分离后就会产生T0问题。数据拆分到两个数据库中要查询全量数据就涉及跨库查询。而且我们知道用于交易的生产库大多使用能够保证事务一致性的RDB而分离出来的冷数据量大且不再修改则会更多使用专门的分析型数据库或数据平台存储即使是关系数据库也很可能与原来的生产库类型不同这就不仅涉及跨库还需要跨异构库源查询。遗憾的是当前实现跨库查询的技术都存在这样那样的问题。
数据库自身的跨库查询功能如Oracle的DBLink、MSSQL的Linked Server、MySQL的FEDERATED、等通常是将远程数据库的数据拉到本地再在本地完成包括过滤在内的大部分计算整个过程十分低效。不仅如此这种方式还存在数据传输不稳定、不支持大对象操作、可扩展性低等很多不足。
事实上要解决分库后的T0查询问题也并非难事只要有具备这样一些能力的计算引擎就可以实现能够对接多种数据源拥有不依赖数据库的完善计算能力以完成多库数据归集后的数据计算工作还可以利用数据库源的能力充分发挥数据库的效能提供简单的数据计算接口性能相对理想等。
除了数据库自身的跨库查询能力使用高级语言硬编码也可以完成跨库查询毕竟没有什么问题不是硬编码解决不了的。这种方式虽然灵活但使用难度却很大尤其对于当前大部分应用的开发语言Java来说缺少足够的结构化数据计算类库使得完成跨库查询后的计算很难完成通常只能做简单的列表式查询而涉及到统计汇总类的运算就会异常麻烦。
引入SPL
可以借助开源SPL可以实现这些目标。SPL是一款开源数据计算引擎提供了大量结构化数据计算函数并拥有完备计算能力支持多数据源混合计算可以同时连接存储热数据的业务库和存储冷数据的历史库完成全量数据T0查询。 由于具备独立且完善的计算能力SPL可以分别从不同的数据库取数计算因此可以很好适应异构数据库的情况还可以根据数据库的资源状况决定计算是在数据库还是SPL中实施非常灵活。在计算实现上SPL的敏捷语法与过程计算可以大大简化T0查询中的复杂计算提升开发效率SPL解释执行支持热部署。更进一步依托SPL的强计算能力还可以完成冷热数据分离时的ETL任务。
SPL还提供了自有的高性能二进制文件存储对性能要求较高时可以将历史冷数据使用文件存储再借助SPL的高性能算法与并行计算来提升查询效率。此外SPL封装了标准应用接口JDBC/ODBC/RESTful供应用集成调用也可以将SPL嵌入应用中使用这样应用就轻松具备了T0查询与复杂数据处理能力将计算和存储分离也更符合当代应用架构的需要。
冷热混合计算
对于常见的冷热分库T0查询场景SPL实现很简单这里看一个例子。
A B 1 [[connectl(oracle),ORACLE],[connectl(mysql),MYSQL]] 2 SQLselect 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)
本例中Oracle作为生产库存储当期热数据MySQL存储历史冷数据。前端传入一句标准SQLA2再借助SPL的转换功能将标准SQL转换成对应数据库的语法B3并发给数据库查询B4最后归并结果进行最后的汇总运算A5。这里使用了多线程并行方式A3同时执行两个SQL效率更高。
在这里SPL不仅完成了两个数据库的跨库查询还提供了SQL转换方法更利于前端应用使用同时拥有合并两个数据库计算结果后的继续计算能力本例是分组汇总。SPL还有更丰富的结构化数据对象及其上的丰富运算除了分组汇总、循环分支、排序过滤、集合运算等基础计算外位置计算、排序排名、不规则分组也不在话下。 除了RDB对于有些场景涉及的NoSQL、Hadoop等数据源也能支持SPL具备多源混算能力无论基于何种数据源都可以进行混合查询实现T0。比如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.queryx(“select ordered,client,dept,amount from orders”) 6 [A3,A5].conj() 7 …后续计算
SPL的计算能力还能用于ETL将生产数据转移到历史库中还经常伴随一些转换计算这些都可以使用SPL来完成。比如出于某些原因要将生产数据某些编码字段通过某个对照表转换成另一种编码遵守一致性的编码规则、整理数据类型获得更好性能等而对照表通常并不会存在生产库中而不能直接在生产库中计算好这就涉及多数据源计算了。
A 1 sourceconnectl(“oracle”),targetconnectl(“mysql”) 2 source.cursor(“select * from orders”) 3 target.query(“select oldCode,newCode from codeComp”).keysi(oldcode) 4 A2.run(pidA3.find(pid).newcode) 5 target.execute(A2,insert into orders values(?,?,?,?,?) ,#1,#2,#3,#4,#5) 6 source.close(),target.close()
高性能
历史冷数据量可能很大使用RDB存储容易受到资源容量等因素限制而且数据读取效率很差。相比下文件存储具备很多优势不仅读取效率更高还可以有效利用并行、文件压缩等机制提速同时也不会像数据库容易受到容量的限制。不过开放的文本格式使用效率不高无压缩、解析数据类型慢等一般会使用二进制格式文件。另外文件存储的最大问题是没有计算能力不像数据库使用SQL可以很方便完成数据处理通过硬编码处理的难度很大。
这些问题都可以通过SPL来解决SPL提供了两种高性能二进制数据存储格式集文件和组表再借助SPL的独立计算能力可以直接基于文件和数据库混合计算实现高效T0查询。比如前面的例子可以使用SPL文件存储历史冷数据与生产库热数据混合查询。
A 1 connect(oracle) 2 A1.queryx(select sellerid, sum(amount) totalamount, count(amount) countamount,max(amount) maxamount,min(amount) minamount from sales group by sellerid) 3 file(“his_sales.btx”).cursorb() 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)
将历史数据存储在文件后与生产库混合查询历史数据使用游标可以支持大数据场景A4针对文件游标进行分组汇总A5归并数据并汇总分组结果。这里使用了SPL提供的二进制集文件btx相对文本更加高效。集文件采用了压缩技术占用空间更小读取更快存储了数据类型无需解析数据类型读取更快支持可追加数据的倍增分段机制利用分段策略很容易实现并行计算保证计算性能。
SPL还支持各种高性能算法。比如常见的TopN运算在SPL中TopN被理解为聚合运算这样可以将高复杂度的排序转换成低复杂度的聚合运算而且很还能扩展应用范围。
SPL还有另外一种支持列存的高效存储形式组表在参与计算的列数字段较少时会有巨大优势。组表上还实现了minmax索引也支持倍增分段这样不仅能享受到列存的优势也更容易并行提升计算性能。
A 1 file(“data.ctx”).create().cursor() 2 A1.groups(;top(10,amount)) 金额在前10名的订单 3 A1.groups(area;top(10,amount)) 每个地区金额在前10名的订单
这里的语句中没有排序字样也不会产生大排序的动作在全集还是分组中计算TopN的语法基本一致而且都会有较高的性能类似的算法在SPL中还有很多。
SPL也很容易实施并行计算发挥多CPU的优势。SPL有很多计算函数都提供并行机制如文件读取、过滤、排序只要增加一个m选项就可以自动实施并行计算简单方便。
易集成
SPL封装了标准JDBC和ODBC接口供应用调用特别对于Java应用可以将SPL嵌入应用内使用T0查询能力在应用端实现不再依赖数据源这样可以充分解耦应用与数据源获得很好的移植性和可扩展性。
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 resultst.execute();SPL是解释执行的天然支持热切换。基于SPL的数据计算逻辑编写、修改后不需要重启实时生效使开发运维更加便捷。
相对其它T0实现技术SPL借助自身独立的强计算与跨数据源计算能力可以更方便完成T0查询同时提供的高性能存储和高性能算法可以充分保障查询效率良好的集成性使得应用端可以轻松具备这些能力是名副其实的T0查询利器。
SPL资料
SPL下载SPL源代码