财务数据处理问题及解决方案分享

京东云开发者
• 阅读 309

一、平台介绍

财务自营计费主要承接京东自营数据在整个供应链中由C端转B端的功能实现,在整个供应链中属于靠后的阶段了,系统主要功能是计费和向B端的汇总。

二、问题描述

近年来自营计费数据量大增,有百亿+的数据量,一天中汇总占据了一半的数据库资源。

1、每天从单表千万W+中定位几万数据执行汇总,即全库全表执行group by操作,32库*32表,每天要花12小时处理。

2、汇总期间,系统基本停滞,导致了消息、任务处理慢,积压多,数据无法及时计费。

3、数据库压力大,有随时崩溃的风险。

4、影响供应商体验,大促期间供应商要实时查看销售数据,出战报,系统无法及时响应。

三、原技术介绍

系统汇总核心是依靠MySQL物理机在每库每表通过group by进行,汇总是按费用类型分而治之,每种类型汇总维度不一样,每次如有新的汇总维度引入,需从前到后,写一遍新的汇总逻辑,主要是锁定新维度的数据范围,确定新的group by 字段,之前逻辑还得回归测试,很蠢是吧,我也觉得。

四、解决问题的思路和办法

根据以上的背景和问题,确定大致的解决问题思路

1、首先要脱离MySQL汇总,数据库是很脆弱的,要保护数据库,不然量级一直递增,总有天塌的一天。

2、顺带解决新需求重复开发的弊端。

五、实践过程描述

由于量大,业务上允许T+1处理,既然是离线数据处理,一般都能想到spark,spring batch,finlk等,在技术调研阶段,主要考虑成熟性,社区活跃度,主要采用spark技术。按照汇总的流程划分4个步骤。以下内容为了通俗易懂,简化了逻辑进行简单描述下。

财务数据处理问题及解决方案分享

1、数据抓取

汇总前数据,就是业务数据,type泛指业务数据中划分数据费用类型的字段,ou、dept泛指源数据的维度,可以是别的一个或者多个字段,amount就是要汇总求和的字段,此处用金额表示。

配置表,就是针对源数据衍生出来的,配置数据可以由很多个,是泛指,本系统只用到了一张。type表示费用类型用来和源数据关联使用,关联可以用一个或者多个字段关联,此处用一个字段举例,merge_key是汇总的字段,字段取值是从源数据的表结构的一个或者多个字段组成。invoice_type,代表汇总后的结果集需要填充的公共字段,此处用发票类型来泛指。可以根据填充的字段扩充,扩充的话在配置表中往后增加列即可。如下示例图以单个字段表达这个意思。

财务数据处理问题及解决方案分享

2、规则匹配

进行第一次加工,即把源数据中的每一行和配置表中的唯一一行关联,如下图,特殊说明下,源数据的每一行,在配置表中有且仅有一行配置可以关联上,即left join,无法关联上的,即无配置,过滤掉,不进行汇总。第一步骤加工操作是在内存中操作完成。

财务数据处理问题及解决方案分享

然后进行第二步骤加工,此步骤我们需要把从配置表中取出的merger_key字段进一步解析成当前left join后的行所对应字段的具体值。解析后的结果如下图,此步骤说明下,根据merger_key的字段,比如第一行ou,获取本行对应列的字段值,就是81,原理是通过Java反射实现,现在已有各种开源的工具包可以直接用,如spring的表达式等工具。以此类推,也能获取多个字段的值,多个字段可以按照一定的连接符号拼接,此图以_拼接。填充字段也同步进行添加。

财务数据处理问题及解决方案分享

3、数据汇总

规则匹配数据加工完毕后,我们只需要对加工完毕后的merger_key字段进行汇总,汇总引擎中只需要按照固定的汇总字段(此处举例是第二步骤加工完毕后的merger_key字段),汇总的逻辑就能够固化下来,只需要1个通用sql即可实现所有费用类型的汇总,最终产生的汇总结果。

4、汇总结果

汇总后的数据和通过原技术实现汇总出来的数据能保持一样的结果,同时还能填充一些公共的字段。如下图,其中绿色的2行源数据,按ou汇总在结果表中变成1行;橙色的3行源数据按dept汇总在结果表中变成2行;黄色的源数据按ou、dept字段汇总变成3行。

财务数据处理问题及解决方案分享

最后把这个汇总结果回写到MySQL即可。

六、实践过程思考和效果评价

1、在测试环境验证的过程中,测试表和线上表表数量级别不一样,初上线时,读取数据超慢。由于spark读取单表速度很快,读取分库分表数据效率直线下降,此处采用多线程方式去读符合条件的未汇总数据,最后汇总一个大集合。

2、上线稳定运行一段时间后,性能对比图,主要是通过剥离了MySQL中执行group by的操作,汇总时长下降了,数据库性能提高了,进而处理消息和异步任务能力也提高了,牵一发而影响全局。

财务数据处理问题及解决方案分享

3、后续有新的汇总需求上线时,通过配置即可实现新维度汇总功能,简化了研发工作,提高了需求交付时效。弊端也是有的,目前汇总维度的字段必须要从主表里取,因为spark读取业务数据只读取了主表,未读取扩展表。后续对hive表数据质量有信心,可以改成spark直接读取hive表,或者读es,ck等库。

4、通过spark框架引入、把大库汇总从在线改成离线,缓解了数据库压力,数据库性能提升后,从而也提升了计费的实效性,同时还增加了系统的稳定性,提升了供应商体验。

作者:王石根

来源:京东云开发者社区 转载请注明来源

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java版本springcloud+springboot+mybatis 分布式 微服务 多租户 电子商务 直播带货 短视频带货 社交电商平台
涉及平台:平台管理(包含自营店面)、商家端(PC端、手机端)、买家平台(PC端、H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务)核心架构:SpringCloud、SpringBoot、Mybatis、Redis、SFTP前端框架:VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程
随机高并发查询结果一致性设计实践
物流合约中心是京东物流合同管理的唯一入口。为商家提供合同的创建,盖章等能力,为不同业务条线提供合同的定制,归档,查询等功能。由于各个业务条线众多,为各个业务条线提供高可用查询能力是物流合约中心重中之重。同时计费系统在每个物流单结算时,都需要查询合约中心,确保商家签署的合同内容来保证计费的准确性。
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
mysql查询每个学生的各科成绩,以及总分和平均分
今天看一个mysql教程,看到一个例子,感觉里面的解决方案不是很合理。问题如下:有学生表:!在这里插入图片描述(https://oscimg.oschina.net/oscnet/07b001b0c6cb7e0038a9299e768fc00a0d3.png)成绩表:!在这里插入图片描述(https://oscimg.o
Stella981 Stella981
3年前
Redis几个问题总结
redis持久化策略redis是一个内存数据库,但是它提供了持久化机制。即把数据永久的存储在磁盘上。我们来看看这个redis保存数据的流程(1)客户端向服务端发送写操作(数据在客户端的内存中)。(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系
十亿级订单系统的数据库查询性能优化之路
作者:京东零售崔健0.前言•系统概要:BIP采购系统用于京东采销部门向供应商采购商品,并且提供了多种创建采购单的方式以及采购单审批、回告、下传回传等业务功能•系统价值:向供应商采购商品增加库存,满足库存周转及客户订单的销售,供应链最重要的第一环节1.背景采
京东云开发者|mysql基于binlake同步ES积压解决方案
1背景与目标1.1背景国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与Mysql数据不一致,导致业务页面
性能提升,成本降低,原生数据库的崛起
腾讯高级工程师杨宇基介绍,作为国内首个云原生无服务器数据库,TDSQLC实现了自动伸缩三大目标,可以根据业务负载进行伸缩。开发者不需要提前预测负载和扩展资源;按使用量计费,按实际使用负载计费,开发者不需要为未使用的资源付费;没有使用,没有付款,没有数据请求
以数据思维和技能提升数据应用测试实践 | 京东云技术团队
作者:京东零售周雪梅以数据思维和技能提高测试覆盖率和效率。数据应用测试,功能测试主要聚焦在数据流向(输入和输出)。一、背景数据质量组当前主要承接黄金眼和商智中的供应链模块,商智包括PC(品牌版:商家端,运营端)和M端。各模块的产品特征和测试范围和策略的通用
京东云开发者 京东云开发者
8个月前
对号入座,快看看你的应用系统用了哪些高并发技术?
一系统简介百舸流量运营平台承接着京东金融APP核心资源位和京东APP部分重要资源位,大促单接口QPS达到10w,压测单接口到20w,典型的c端读链路高并发场景。接下来,聊聊我们的系统都有哪些应对高并发的“武功秘籍”。二“武功秘籍”1缓存(redis缓存