案例名称:集算器数仓版在北京银行综合可视化智能系统的应用

提供商名称:北京润乾信息系统技术有限公司

适用行业:政府、金融、传媒、地产、互联网以及中小企业

案例简介:

集算器是润乾公司自主研发运营数据计算中间件,是一个通用性的轻量级大数据计算引擎。集算器作为面向开发人员使用的动态程序设计语言,专注于(半)结构化数据计算,具有语法简单、类库丰富、集成性好、支持分步计算等特点,可以帮助用户实现提升开发效率、优化应用结构、提升运算性能等目标。

北京银行综合可视化智能系统将以数据可视化服务体系搭建为基础,整个项目架构方案的数据源通过Control-M ->集算器辅助ETL ->集算器数据缓冲层->集算器仓库,集算器仓库的模型来存储事实表和纬度表,用集算器的集文件(二进制文件)与组表来做数据存储,集算器在计算层负责计算单元,通过集算器应用接口,用可视化化组件来做数据的呈现。

核心特点介绍:

降低开发难度从而提高开发效率是集算器的设计初衷。用户通过内置的敏捷语法体系编写简单的代码即可完成原来在SQL或JAVA中需要复杂编码的计算,达到让编码简单化的效果。

优化应用结构是集算器的重要作用。集算器是解释执行的语言,使用其实现数据算法可以降低应用的耦合度;通过集算器将算法外置减少存储过程数量,将数据外置减少中间表数量,从而优化数据库结构;集算器天然支持多样性数据源,避免统一数据来源带来的繁重工作,进而优化应用结构。

提升运算性能是集算器的显着效果。集算器的敏捷语法体系和内置的(半)结构化计算类库让大部分计算的实现变得简单的同时获得更高性能。此外,集算器还提供了分步式计算功能,通过多机(PC)集群达到甚至超过小型机的性能,整体造价和维护成本更低。

行业应用解读:

在金融科技来临的时代,各大行业已基本具备海量数据规模,成熟高效的数据可视化解决方案已经成为大数据时代背景下的迫切需求,例如阿里巴巴、腾讯、屈臣氏等业界领先企业已经提前布局,在态势分析,竞争选址等场景下取得了良好的效果,而金融行业由于自身封闭性等特点,在此领域仍处于起步阶段。

目前北京银行数据平台发展迅速,机器学习、分布式计算等技术已逐步应用于大数据、人工智能等领域当中,数据预言与计算能力正在高速提升,数据可视化可以为上述能力以及它们背后承载丰富信息的数据群提供高效认知通道,以最佳视角直观彰显金融科技价值。此外,借助人脑的视觉思维能力,通过挖掘数据之间重要的关联关系,将若干有关联性的数据进行聚集处理,通过视觉感知,可进一步揭示数据中隐含的规律和发展趋势。

北京银行综合可视化智能系统将以本行数据可视化服务体系搭建为基础,整个项目服务体系需包含如下内容:

1、数据可视化规范。依托数据可视化设计理论、行内设计语言、用户体验标准,形成银行自身的数据可视化规范,用于指导上层模型、产品设计等工作,规范包括但不限于金融数据映射规范,颜色配比规范,交互操作规范,视图排列规范等。

2、可视化服务平台。依托数据可视化规范、银行积累的数据分析处理能力以及业界领先的可视化图形算法,形成行内自身的可视化服务平台,支持各类视觉模型的高性能渲染,统一接口化的服务输出模式,为后续可视化产品设计提供原子材料以及底层技术支撑。

3、综合可视化智能大屏。依托数据可视化规范、可视化服务平台,结合分行领导层以及业务分析岗在研判分析、决策指挥等场景下的业务需求,形成可视化智能大屏产品,以多元化、专业化、友好化的视觉通道,实时、准实时的将区域经营动态,产品热度等以大屏智能交互的形式对外展开服务。

174542314.png

北京银行综合可视化智能大屏架构图

方案应用价值:

比Java和SQL更易写,集算器语法优势

当前复杂业务场景的数据准备工作一般是采用Java或SQL完成的,存储过程以及中间表也可以看作是SQL。集算器的语法比Java和SQL更为简单易懂,采用集算器能在很大程度上简化这些开发量,集算器采用集合化语法,代码要比没有直接提供结构化计算的程序更加短小。

集算器的代码比Java也要短小很多,这样不仅是写得更快,而且还能容易理解算法和排错,绝大多数报表的数据准备算法可以在一个屏幕内显示出来,可以更直观地理解代码的整体含义。

集算器除了模型上的优势外,在日期和字串等运算,也比大部分SQL提供了更丰富的函数。许多情况用SQL也不是写不出来,但不能直接按自然思维实现,很费脑筋,这种代码放时间长了程序员自己都会忘了是怎么写出来的,给将来的维护也造成麻烦。集算器代码则符合自然思维习惯,即使是与SQL相同的思路也能更清晰地表达,更容易理解和维护。

多样性数据源及跨库计算

现在有许多业务场景的数据源并不只来源于关系数据库,还可能是NoSQL数据库、本地文件、从WEB上传来的数据等。这些非关系数据库的数据源缺乏标准的数据获取接口和语法,有些甚至没有最基本的过滤能力。而计算业务场景逻辑时总还要进行一些过滤甚至关联运算,虽然报表工具一般都能提供这些计算能力,但由于都是内存计算,只适合于数据量较小的情况,数据量较大时就会导致容量负担过重。大多数报表工具也不能很好地处理象json或XML这种多层数据,也没有灵活编码能力以登录远程WEB服务获取数据。

如果采用集算器准备数据,则可以直接用这些非数据库数据作为数据源去计算业务逻辑,不需要导入数据库的过程,充分利用现有数据源的优势,减少开发工作量。

集算器自有的计算能力可以使这些计算能力不一的多样性数据获得通用一致的计算能力;而这将意味着更低的移植成本以及学习难度。

解释执行降低应用耦合度

Java应用大多数情况是事先编译并静态加载的,也就是要把所有模块一起编译打包后部署,在运行过程中代码就不再改变了。

一般来讲,报表的业务稳定性要比主应用差得多,报表变动的频率远远高于主应用,好的体系设计应当能把报表模板独立出来降低整个应用的耦合性。但是,一个完整的报表由报表工具开发的报表呈现模板和Java开发的数据准备算法构成,报表修改时需要同时改变这两部分,报表模块和主应用的耦合度就会很高。因为报表模板一般保存在文件系统中或有时在数据库中,而数据准备算法却要打入了主应用程序包,存放和管理机制都不一样,这样要保持两者一致就相当麻烦了,报表模块很难独立出来。

Java大多是静态加载的,报表数据准备算法有修改后会导致整个应用重新编译部署,很难做到热切换,如果用集算器来实现数据准备算法,就能有效地降低主应用程序与报表功能的耦合度了。

集算器写出来的脚本也是类似报表模板的外置文件,不需要和主应用程序一起编译打包,而可以和报表模板一起放在文件系统中管理维护,报表模块可以独立出来。

集算器是解释执行的动态语言,在修改时不需要涉及主应用程序,只要把集算器脚本替换就可以,天然就支持热切换。

算法外置减少存储过程

在体系结构方面用存储过程准备报表数据和用Java程序是类似的,也会造成耦合度高的问题,只是从报表模块与主程序之间的耦合变成的报表模块与数据库之间的耦合。

存储过程存放在数据库中,报表模板放在文件系统中,保持两者同步修改依然很麻烦。

存储过程修改时需要申请一定级别的管理员权限做重编译,虽然不象Java那样难以做到热切换,但数据库高权限的频繁使用又会带来安全隐患。

比Java更糟糕的是,数据库及其中的存储过程可能被多个应用共享,如果管理不善,很容易造成多个应用之间的高耦合,时间长了会搞不清楚某个存储过程在被哪些应用调用,越来越混乱。

同样地,采用集算器也可以极大程度地减少数据库中的存储过程,算法外置后与报表模板一起存放管理,完全归属于报表模块,不仅降低与应用其它部分的耦合,更不会造成与其它应用的耦合。

实际上,存储过程本身编写难度并不小,遍历式计算代码的性能也不佳,而且可移植性很差,原则上在报表业务中应当尽量少用存储过程。

替代报表计算

减少隐藏格

报表中通常使用隐藏格来保存中间结果,而进一步获得分步计算的再引用。如果一个报表携带大量隐藏格,必然对性能产生很大影响。这是因为大量隐藏格会占用内存、降低运算速度。而且隐藏单元格除了单元格值外,还记录了很多显示属性值,比如:字体、颜色、显示方式等等。虽然单元格隐藏了,但是这些属性还在,如果带着这些属性计算,也会影响计算速度。

使用集算器事先准备数据则没有这些问题,过程式计算可以方便地复用中间结果,只进行纯粹的数据计算,不涉及隐藏格和外观属性,内存使用效率更高。

控制SQL执行路径

数据库本身的性能无法被报表工具以及其它数据库外部的技术手段优化,只能想办法优化SQL的写法。不过,还是有些场景可以使用集算器提高数据库相关的性能。

SQL不提倡分步的语法让程序员实施干预也相当困难。集算器提供分步的过程计算,充分利用集算器的离散型集合模型。分步执行,控制SQL的执行,集算器就可以自由控制执行路径,部分运算移出数据库实施,起到性能优化的效果。

内存共享

对于高并发报表,利用集算器的内存共享机制,将报表用到的数据缓存在内存中,几个报表可以共享这份内存中数据。从内存中计算不仅能获得数倍于数据库或文件的访问性能,而且可以更方便地实施并行计算,充分利用现代CPU多核的优势,而集算器编写多线性并行计算代码也是非常简单的。

对于这种场景,还可以采用集算器的内存字节表的方式来提高Java内存利用率,数据加载成字节,在使用时才对象化。牺牲大约30%的性能,但可以将Java的内存利用率提高3至5倍,使用内存后,即使牺牲掉30%的性能也仍然远远比数据库和文件等外存更快。

高性能算法

集算器提供了面向数据特征的函数和离散数据集模型,主要体现在:集合化、离散性、分组子集、有序聚合、逆分组、跨行引用、有序分组、位置利用、多级游标、有序游标、列间统计、通用转置、转置计算、文本解析、外键指针化、维表内存化、外键序号化、内存利用率、多线程并行、游标复用、分段并行、有序利用等技术上。

T+0计算场景

要实现T+0全数据量的实时业务逻辑计算,通常的办法是把部分历史数据被移出来做个分数据库,这样可以保证交易系统的正常运转,但要实现T+0报表就麻烦得多,会涉及到跨库运算。

许多数据库都支持跨库运算,但一般都要求同类型的数据库,但历史数据和当期交易数据的要求不同,数据量更大但不要求事务一致性,很可能使用另一种数据仓库来存储。即使是同构的数据库,数据库的跨库运算的方法一般也是将另一个库中的数据表映射成本库数据表,实际运算还是一个数据库在做,而且还多出许多数据传递的通讯成本,性能和稳定性都不好。

使用集算器就可以很好地完成这个混合计算任务了。

集算器自己有计算引擎,不依赖于数据库,各个数据库内的数据计算仍由各库进行。集算器可以使用多线程向各数据库同时发出SQL语句,由这些数据库并行执行,将各自的运算结果返回到集算器再汇总处理后传给报表工具去呈现。

这种机制还方便横向扩展,历史库可以有多个,是否同类型的也无所谓。

集算器还有服务器方式的集群运行模式,在集算服务器的支持下,历史数据不必一定存放到数据库中,还可以存储在IO性能更好的文件系统中,配合集群计算,可以在更低的成本下获得更好的性能。

信息化和软件服务网 - 助力数字中国建设 | 责编:吴良勇