跑批为什么这么难

业务系统产生的明细数据通常要经过加工处理,按照一定逻辑计算成需要的结果,用以支持企业的经营活动。这类数据加工任务一般会有很多个,需要批量完成计算,在银行和保险行业常常被称为跑批,其它像石油、电力等行业也经常会有跑批的需求。

大部分业务统计都会要求以某日作为截止点,而且为了不影响生产系统的运行,跑批任务一般会在夜间进行,这时候才能将生产系统当天产生的新明细数据导出来,送到专门的数据库或数据仓库完成跑批计算。第二天早上,跑批结果就可以提供给业务人员使用了。

和在线查询不同,跑批计算是定时自动执行的离线任务,不会出现多人同时访问一个任务的情况,所以没有并发问题,也不必实时返回结果。但是,跑批必须在规定的窗口时间内完成。比如某银行的跑批窗口时间是晚上 8:00 到第二天早上 7:00,如果到了早上 7:00 跑批任务还没有完成,就会造成业务人员无法正常工作的严重后果。

跑批任务涉及的数据量非常大,很可能用到所有的历史数据,而且计算逻辑复杂、步骤众多,所以跑批时间经常是以小时计的,一个任务两三小时是家常便饭,跑到十个小时也不足为奇。随着业务的发展,数据量还在不断增加。跑批数据库的负担快速增长,就会发生整晚都跑不完的情况,严重影响用户的业务,这是无法接受的。

问题分析

要解决跑批时间过长的问题,必须仔细分析现有的系统架构中的问题。

跑批系统比较典型的架构大致如下图:

..

从图上看,数据要从生产数据库取出,存入跑批数据库。跑批数据库通常是关系型的,编写存储过程代码完成跑批计算。跑批的结果一般不会直接使用,而是再从跑批数据库中导出,采用接口文件的方式提供给其他系统,或者再导入其他系统数据库。这是比较典型的架构,图中的生产数据库也可能是某个中央数据仓库或者 Hadoop 等。一般情况下,生产库和跑批库不会是同一种数据库,它们之间往往通过文件的方式传递数据,这样也比较有利于降低耦合度。跑批计算完成后,结果要给多个应用系统使用,一般也都是以文件方式传递。

跑批很慢的第一个原因,是用来完成跑批任务的关系数据库入库、出库太慢。由于关系数据库的存储和计算能力具有封闭性,数据的进出要做过多的约束检查和安全处理,当数据量较大时,写入读出的效率非常低,耗时会非常长。所以,跑批数据库导入文件数据的过程,以及跑批计算结果再导出文件的过程都会很慢。

跑批很慢的第二个原因,是存储过程性能差。由于 SQL 的语法体系过于陈旧,存在诸多限制,很多高效的算法无法实施,所以存储过程中的 SQL 语句计算性能很不理想。而且,业务逻辑比较复杂的时候很难用一个 SQL 实现,经常要分成多个步骤,用十几甚至几十个 SQL 语句才能完成。每个 SQL 的中间结果,都要存入临时表给后续步骤的 SQL 使用。临时表数据量较大时就必须落地,会造成大量的数据写出。而数据库的写出要比读入性能差很多,会严重拖慢整个存储过程。

对于更复杂的计算,甚至很难用 SQL 语句直接实现,需要用数据库游标遍历取出数据,循环计算。但数据库游标遍历计算性能又要比 SQL 语句差很多,一般也都不直接支持多线程并行计算,很难利用多 CPU 核的计算能力,会让计算性能更加糟糕。

那么,是否可以考虑用分布式数据库来代替传统关系数据库,通过增加节点数量的办法,来提高跑批任务的速度呢?

答案仍然是不可行。主要原因是跑批计算的逻辑相当复杂,即使是用传统数据库的存储过程,也常常要写几千甚至上万行代码,而分布式数据库的存储过程计算能力还比较弱,很难实现这么复杂的跑批计算。

而且,当复杂计算任务不得不分成多个步骤时,分布式数据库也面临中间结果落地的问题。由于数据可能在不同的节点上,所以前序步骤将中间结果落地,后续步骤再读取的时候,都会造成大量跨网络的读写操作,性能很不可控。

这时,也不能采用分布式数据库依靠数据冗余来提升查询速度的办法。这是因为,查询之前可以预先准备好多份冗余数据,但是,跑批的中间结果是临时生成的,如果冗余的话就要临时生成多份,整体的性能只会变得更慢。

所以,现实的跑批业务通常仍然是使用大型单体数据库进行,计算强度太大时会采用类似 ExaData 这样的一体机(ExaData 是多数据库,但被 Oracle 专门优化过,可以看成是个超大型单体数据库)。虽然很慢,但是暂时找不到更好的选择,只有这类大型数据库有足够的计算能力,所以只能用它来完成跑批任务了。

SPL 用于跑批

开源的专业计算引擎 SPL 提供了不依赖数据库的计算能力,直接利用文件系统计算,可以解决关系数据库出库入库太慢的问题。而且 SPL 实现了更优算法,性能远远超过存储过程,能显著提高单机计算效率,非常适合跑批计算。

利用 SPL 实现的跑批系统新架构是下面这样的:

..

在新架构中,SPL 解决了造成跑批慢的两大瓶颈问题。

首先来看数据的入库、出库问题。SPL 可以直接基于生产库导出的文件计算,不必再将数据导入到关系数据库中。完成跑批计算后,SPL 还能将最终结果直接存储成文本文件等通用格式,传递给其他应用系统,避免了原有跑批数据库的出库操作。这样一来,SPL 就省去了关系数据库缓慢的入库、出库过程。

下面再来看计算的过程。SPL 提供了更优的算法(有许多是业界首创),计算性能远远超过存储过程和 SQL 语句。这些高性能算法包括:

..

这些高性能算法可以应用于跑批任务中的常见 JOIN 计算、遍历、分组汇总等,能有效提升计算速度。例如,跑批任务常常要遍历整个历史表。有些情况下,对一个历史表还要遍历好多次,来完成多种业务逻辑的计算。历史表数据量一般都很大,每次遍历都要消耗很多的时间。此时我们可以应用 SPL 的遍历复用机制,仅对大表遍历一次,就可以同时完成多种计算,可以节省大量时间。

SPL 的多路游标能做到数据的并行读取和计算,即使是很复杂的跑批逻辑,也可以利用多 CPU 核实现多线程并行运算。而数据库游标是很难并行的,这样一来,SPL 的计算速度常常可以达到存储过程的数倍。

SPL 的延迟游标机制,可以在一个游标上定义多个计算步骤,之后让数据流按顺序依次完成这些步骤,实现链式计算,能够有效减少中间结果落地的次数。在数据必须落地的情况下,SPL 也可以将中间结果存成内置的高性能数据格式,供下一个步骤使用。SPL 高性能存储基于文件,采用有序压缩存储、自由列式存储、倍增分段、自有压缩编码等技术,减少了硬盘占用,读写速度要远远好于数据库。

应用效果

SPL 在技术架构上打破了关系型跑批数据库存在的两大瓶颈,在实际应用中也取得了非常好的效果。

L 银行跑批任务采用传统架构,以关系数据库作为跑批数据库,用存储过程编程实现跑批逻辑。其中,贷款协议存储过程需要执行 2 个小时,而且是很多其他跑批任务的前序任务,耗时这么久,对整个跑批任务造成了严重影响。

采用 SPL 后,使用高性能列存、文件游标、多线程并行、小结果内存分组、游标复用等高性能算法和存储机制,将原来 2 个小时的计算时间缩短为 10 分钟,性能提高 12 倍

而且,SPL 代码更简洁。原存储过程 3300 多行,改为 SPL 后,仅有 500 格语句,代码量减少了 6 倍多,大大提高了开发效率。

更详细的介绍参见这里:我们怎样把 L 银行贷款协议跑批速度提高 10+ 倍。

P 保险公司的车险业务中,需要用往年历史保单来关联新的保单,在跑批中称为历史保单关联任务。原来也采用关系数据库完成跑批,存储过程计算 10 天的新增保单关联历史保单,运行时间 47 分钟;30 天则需要 112 分钟,接近 2 小时;如果日期跨度更大,运行时间就会长的无法忍受,基本就变成不可能完成的任务了。

采用 SPL 后,应用了高性能文件存储、文件游标、有序归并分段取出、内存关联遍历复用等技术,计算 10 天新增保单仅需 13 分钟;30 天新增保单只需要 17 分钟,速度提高了近 7 倍。而且,新算法执行的时间随着保单天数的增长并不是很大,并没有像存储过程那样成正比的增长。

从代码总量来看,原来存储过程有 2000 行代码,去掉注释后还有 1800 多行,而 SPL 的全部代码只有不到 500 格,不到原来的 1/3

详情参见:我们怎样把 P 保险公司 2 小时的跑批优化成 17 分钟。

T 银行通过互联网渠道发放贷款的明细数据,需要每天执行跑批任务,统计汇总指定日期之前的所有历史数据。跑批任务采用关系数据库的 SQL 语句实现,运行总时间 7.8 小时,占用了过多的跑批时间,甚至影响了其他的跑批任务,必须优化。

采用 SPL 后,应用了高性能文件、文件游标、有序分组、有序关联、延迟游标、二分法等技术,原来需要 7.8 小时的跑批任务,单线程仅需 180 秒,2 线程仅需 137 秒,速度提高了 204 倍

详情参见:我们怎样把 T 银行贷款跑批任务提速 150+ 倍。

开源SPL源码地址

免费下载试用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8275.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深⼊理解指针(3)【数组与指针】

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. ⼆级指针 6. 指针数组 7. 指针数组模拟⼆维数组 一 数组名的理解 由上图可知我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址…

ubuntu【桌面】 配置NAT模式固定IP

DHCP分配导致虚拟机IP老变,SSH老要重新配置,设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP IP不要与网关重复 这里网关注意要与虚拟…

最强攻略密码 | 腾讯云双十一活动爆款直击底价

前言 每年双十一,腾讯云都会推出一系列的优惠活动,吸引着大量的消费者和开发者参与。作为国内领先的云计算服务商之一,腾讯云不仅提供强大的云计算基础设施服务,还涉及云存储、大数据分析、人工智能等多个领域,而双十…

c# 动态lambda实现二级过滤(多种参数类型)

效果 调用方法 实体类(可以根据需求更换) public class ToolStr50 {public bool isSelected { get; set; }public string toolStr1 { get; set; }public string toolStr2 { get; set; }public string toolStr3 { get; set; }public string toolStr4 { …

5万加购上线即断货,双11洗衣机品类打破增长难关

距离2024年双11结束仅剩最后几天。据网经社报告,目前各电商平台累计销售额已超8000亿元。 其中,家电品类已超1000亿元的销额位居前列,市场占有率达15.7%。天猫平台数据显示,预售日开售后1小时,大家电整体成交同比增长7…

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…

Xfce桌面设置右键菜单:用右键打开VSCode

前言 AlmaLinux安装VSCode之后始终没有找到如何用右键菜单打开VSCode,比Windows麻烦多了。每次都需要先找到文件夹,然后用系统自带的Open In Terminal打开终端,再输入code .,才能够在当前文件夹中快速打开VSCode。那么&#xff0…

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机,但是发现之前是二进制文件部署的,会在物理机上部署污染环境&#x…

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution,normal是“正常”或“标准”的意思,中文翻译是正态,多完美的…

【嵌入式】STM32中的SPI通信

SPI是由摩托罗拉公司开发的一种通用数据总线,其中由四根通信线,支持总线挂载多设备(一主多从),是一种同步全双工的协议。主要是实现主控芯片和外挂芯片之间的交流。这样可以使得STM32可以访问并控制各种外部芯片。本文…

大A终究是逃不过高开低走的魔咒

大A终究是逃不过高开低走的魔咒,早盘高开太多,周末休市,今天会议结束,各种不确定因素增加等原因导致午盘普跌。其实还是那句话,股市嘛,涨多了会跌,跌多了会涨,别急也别慌。 周末&…

知识付费小程序搭建,线上网课平台开发

我是【码云数智】平台的黄导,今天分享:知识付费小程序搭建,线上网课平台开发 在线网校小程序开发,在线教育小程序还不断优化界面设计,确保操作简便直观,无论是老人还是小孩都能轻松上手。​​ 01、小程序…

Python | Leetcode Python题解之第543题二叉树的直径

题目: 题解: class Solution:def diameterOfBinaryTree(self, root: TreeNode) -> int:self.ans 1def depth(node):# 访问到空节点了,返回0if not node:return 0# 左儿子为根的子树的深度L depth(node.left)# 右儿子为根的子树的深度R …

无代码开发平台smardaten R5C50 新版本更新!都做了哪些改变?

数睿数据为此次新版本做了7项体验优化、8项功能增补、1项性能优化,总计16个功能点。快来看看,哪个功能戳中你的心~ 一、体验优化 围绕smardaten搭建第一个原型并完成发布主链路,进行了体验优化,解决新手门槛高、模板使用路径长、…

175页PPTBCG某企业健康智能制造与供应链战略规划建议书

智能制造与供应链战略规划方法论是一个系统性、科学性的框架,旨在指导企业实现智能制造转型和供应链优化。以下是对这一方法论的核心内容的归纳和阐述: 一、智能制造的目标与原则 明确智能制造目标: 提高生产效率:通过引入自动…

DICOM标准:深入详解DICOM医学影像中的传输语法

引言 DICOM(数字成像和通信医学)标准在医学影像数据交换中扮演着至关重要的角色。其中,*传输语法(Transfer Syntax)是DICOM标准中定义数据编码和传输方式的核心部分。理解传输语法对于确保不同设备和系统之间的互操作性…

爱普生SG-8201CG可编程晶振智能门锁的核心驱动

在智能家居蓬勃发展的时代浪潮中,智能门锁作为智能家居的第一道防线,其安全性与便捷性至关重要。爱普生 SG - 8201CG 可编程晶振犹如一颗隐藏在幕后却发挥着关键作用的智慧芯片,为智能家居系统的高效、稳定运行提供了不可或缺的精准时钟信号。…

LLM大模型微调(lora原理)

一、微调方法介绍 1.1 Lora原理 通过低秩矩阵来降低模型训练的参数量,有点‘给我一个支点,就可以撬动地球’的感觉,其中矩阵的秩(rank)就有点像这个‘支点’的意思,大致原理如下: LoRA 的核心…

协议(OSI-tcp-udp)

目录 OSI七层协议模型 TCP/IP协议 3次握手 4次挥手 TCP VS UDP TCP和UDP分别对应的常见应用层协议 Tcp 状态机 TCP/ UDP /socket /http /webSocket 区别 RPC 和 RMI RPC与RMI的区别 Web Service SOAP(Simple Object Access Protocol:简单对…

源代码防泄密管理分享

随着信息技术的快速发展,软件已成为现代企业不可或缺的核心资产之一。然而,源代码作为软件的心脏,其安全性直接关系到企业的核心竞争力。为了有效防止源代码泄露,构建一套全面且高效的源代码安全管理体系显得尤为重要。以下是六个…