基于MapReduce 云计算的报表平台技术与应用

2023-11-22 10:28俞红威蔡玉立
江苏通信 2023年5期
关键词:轮询调用报表

俞红威 朱 建 蔡玉立

中博信息技术研究院有限公司

0 引言

云计算是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算早期,就是简单的分布式计算,解决任务分发,并进行计算结果的合并。因而,云计算又称为网格计算。通过这项技术,可以在很短的时间内完成对数以万计的数据的处理,从而能够提供强大的网络服务。

企业的业务数据在数据量越来越大的情况下,业务取数逻辑也越来越复杂。比如集团型企业财务月报,单个财务报表户涉及到8 张不同的报表,包括资产负债表、利润表、收入明细表等,共计近5000 个指标,再加上集团型企业涉及多财务报表户,按照1000 个财务账套计算则有500 万个指标的计算,因此报表数据的计算量非常大,云计算的分布式计算特点特别适合这种场景的计算。

1 技术现状

1.1 MapReduce 技术简介

云计算的关键技术是MapReduce,最早是由Google 提出,后来也运用在开源的云技术Hadoop 中。与传统开发模式相比,使用MapReduce 模式,开发人员在拆解问题的过程中,就要先对问题进行平行化处理。开发人员需要先分析问题的解决流程,找出可以利用平行运算来处理数据的部分,也就是那些能够被切成小段分开来处理的数据,再针对可以采用平行处理的部分写成Map 程序。

MapReduce 本身源自于函数式语言,主要通过“Map(映射)”和“Reduce(化简)”这两个步骤来并行处理大规模的数据集。首先,Map 会先对由很多独立元素组成的逻辑列表中的每一个元素进行指定的操作,且原始列表不会被更改,会创建多个新的列表来保存Map 的处理结果。当Map 工作完成之后,系统会接着对新生成的多个列表进行清理和排序,然后会对这些新创建的列表进行Reduce 操作,也就是对一个列表中的元素根据Key 值进行适当的合并。图1 是常见MapReduce 的体系结构。

图1 MapReduce 的体系结构

1.2 ICE 网络通信引擎技术简介

网络通信引擎ICE(Internet Communications Engine)是Zero C公司的分布式系统开发专家实现的一种新的,高性能的,面向对象中间件平台。基于ICE 可以实现电信级分布式网络通信的解决方案。ICE 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。

ICE 作为中间件平台,客户端及服务端的应用都是由应用代码及ICE 的库代码混合组成的。客户应用及服务器应用分别对应用的是客户端与服务端。代理是根据SLICE 定义的ICE 文件实现,它提供了一个向下调用的接口,提供了数据的序列化与反序化。

2 总体技术架构

2.1 方案介绍

考虑到场景的差异和实际项目需要,本方案没有直接采用Hadoop 的MapReduce架构。而是采用云计算MapReduce 的思想,自主开发云计算分布式框架,将报表主任务进行分解,调用任务的Mapper分解程序,根据不同的取数公式及参数拆分成若干个子任务。系统初始化一个子任务池,定义任意个取数线程,轮询获取分解的子任务,通过ICE RPC 远程调用方法实现任务远程调用,将子任务分配到远程计算节点,计算完成后返回此子任务的结果,并且将结果进行汇总,当所有的子任务都已经全部执行成功后,启动Reduce 程序,针对汇总的结果进行指标计算,并保存到数据库中,从而完成报表主任务的计算。图2 为整体方案架构图。

图2 整体方案架构图

配套整个系统设计,系统还包括表套,表单,指标,取数公式,报表户,时间维度(年度,月度)等基本信息。表套是由一系列相关的表单组成的,表单则由若干指标组成,它包括名称,编码和具体的取数公式构成。取数公式可能包括若干公式,通过加减乘除等四则运算计算而来。系统的计算任务是指具体一个或多个报表户的某年某月某个表套或者其中多个表单的取数任务。

2.2 方案优势

系统采用多线程高并发的计算模式,通过负载均衡策略实现了网格计算,极大提高了系统的计算性能。具体的优势包括下面几个方面:

基于MapReduce 高性能并发计算框架;

支持取数线程池的任意动态扩展;

支持远程计算节点的任意动态扩展;

可靠的轮询调度机制,确保远程节点任务均衡分配;

高效可靠的RPC 远程调用机制;

可靠的容错机制,在由于网络异常情况保证任务的成功调用。

3 详细解决方案

3.1 报表定义(Report Define)

基础设置部分由用户首先通过表样定义,指标生成,公式定义等操作,将指标编码、指标名称和指标取数表达式进行初始化编制,具体的取数公式需要对应开发人员开发相对应的取数插。为能够说明本方案关于报表任务基于MapReduce的过程,本文章中仅仅截取报表中的部分指标作为举例描述。生成出的部分表样及取数表达式如表1 所示。

表1 指标编码名称公式

表1 中共包括6 个指标,其中有4 个指标是正常的取数指标([443_E_1], [443_E_2], [443_F_1], [443_F_1]),两个指标是表间运算的指标([443_E_3],[443_F_3])。将指标的公式信息一直迭代到最后取数公式为止,相当于将[443_E_3]指标的取数表达式变更成UDEF_FYD(“y”,“6001”)-UDEF_FYD(“y”,“600190”)+UDEF_FYD(“y”,“6002”)-UDEF_FYD(“y”,“600192”)。其中UDEF_FYD 和UEDF_ND 注册成指定的JAVA 类,平台要求将注册的取数Java 文件编译后打包成jar 文件。

3.2 任务分解(Task Mapper)

任务分解是系统中的核心步骤,用来将复杂任务分解成多个简单任务,这样会使得任务能够并行计算。系统中TaskMapper 程序负责报表任务的MAP 分解过程。提供一个主线程,专门扫描待处理表中的未处理的报表任务,得到报表任务后,会根据包含的表套或表单得到具体需要计算的指标,并循环指标列表,直接从缓存中拿到指标包含的取数公式及参数信息。根据上面示例中得到包含的取数公式数据是UDEF_FYD(发生额),参数为("y","6001"),("y","600190"),("y","6002"),("y","600192")。UDEF_ND(累计额)公式,参数包括("y","6001"),("y","600190"),("y","6002"),("y","600192")。此任务中包括两个具体公式的业务数据取数,UDEF_FYD(发生额)和UDEF_ND(累计额),系统会为这两个公式分别定义报表户分解数和参数分解数,并根据这两个参数来分解子任务。如果参数分别设成0,那么就是有几个具体公式就生成几个任务,否则会根据这两个参数嵌套循环分解子任务。任务分解后,会将子任务加到报表子任务池中。如表2 所示,是不同参数配置下某个取数公式任务分解说明以及生成的子任务个数举例。

表2 不同参数配置下取数公式任务分解说明

假设此时只计算1 个报表户,报表户编码为A3201,同时UDEF_FYD 和UDEF_ND 两个公式的账户分解数为0,参数分解数分别为4 和2 时,根据上述报表定义的指标和取数公式配置共分解成以下3 个子任务,其中UDEF_FYD 公式有1 个任务,UDEF_ND 公式有2 个任务,具体任务、公式及参数如表3 所示。

表3 任务拆分的具体公式和参数

通过对报表指标公式表达式的解析和分解,将指标计算任务按照公式的维度进行分组,并且根据参数进行分解,这样将一个大的报表任务分解成任意多个以公式为维度的子任务。从以指标维度进行同步横向计算变成了按照公式维度进行纵向并行计算。这些子任务通过并行计算,改变了整个报表计算的模式。

3.3 任务轮询分配(Task Polling)

当将报表任务分解成若干个子任务后,将子任务加入到子任务池。系统定义了多个取数线程数,系统初始化时,会启动定义的取数线程,轮询从子任务池中获取一个任务,将任务更新成处理中状态。

远程计算节点定义心跳服务端口,并且提供服务端状态更新程序调用,定期将不可用的节点移除出可分配远程计算节点,确保任务分配成功率。远程计算节点启动时会根据配置的端口启动心跳服务,提供服务端调用,服务端调用成功后将此节点更新成可用状态,如果无法访问则标记成不可访问,具体方案如图3 任务轮询机制示意图所示。

图3 任务轮询机制示意图

本方案中轮询调用算法采用权重轮询调度算法 (Weighted Round-Robin Scheduling)。权重轮询调度算法可以解决服务器间性能不一的情况,它用相应的权值表示服务器的处理性能,按权值的高低和轮询方式分配请求到各服务器。权重轮询算法根据新建连接数来调度,权值高的服务器先收到连接,权重值越高被轮询到的次数(概率)也越高,相同权值的服务器处理相同数目的连接数。

3.4 任务远程调用(RPC Invoke)

当通过任务轮询分配,获得可用的远程计算节点之后,就需要通过远程调用方式,将需要计算的子任务发送到远程计算节点。首先需要定义子任务信息,子任务包括公式代码、jar 包文件名、年份、月份、定义JAVA 类、拆分的调用参数、报表户等信息。然后通过RPC 远程调用发送子任务,在本方案中,采用ICE 作为RPC 框架,负责底层传输调用,技术人员关注业务逻辑的编写。

RPC(Remote Producer Call),指远程过程调用,Remote Producer Call Protocol 是一种计算机通信协议。它允许像调用本地方法一样调用远程服务。首先根据ICE 技术架构要求,其传输核心代码是通过对SLICE 文件解析动态生成。系统定义的SLICE 文件如下,文件定义了1 个调用方法call,在消息体中定义同步和异步标识。

3.5 任务汇聚(Task Reducer)

通过远程同步调用后,在计算节点上动态生成任务信息中的指定JAVA 类的方法。方案中要求指定的JAVA 类继承系统提供RPFormulaBase 基础类,动态加载对象实例,根据公式包含的参数,以及调用参数,构造String[]参数,从而反射调用calculate(String[] p1,String[] p2,……,String[] pn)方法。此方法会返回Object 对象。在calculate 方法中,可以根据报表户、年月、调用参数这些参数,从相应的业务表中执行逻辑,生成需要的取数结果。MAP 对象中KEY 的形式为“报表户编码_公式编码(参数1、参数2……参数n)”格式。

当所有的子任务全部成功执行并返回结果后,会在服务端汇聚成一个包含全部返回结果的MAP 对象,然后会启动指标结果的Reduce 过程。如表4 所示,描述了3 个任务的基本信息以及分别反馈回来的MAP 汇总后的KEY 和VALUE。

表4 任务反馈后MAP 中对应KEY 和VALUE 值

在得到全量MAP 的信息之后,通过循环所有的指标,在系统缓存中快速得到指转换后取数公式,通过KEY 值检索到对应的VALUE,替换取数公式中的原公式和参数信息。如指标[443_E_1]的取数表达式为UDEF_FYD("y","6001")-UDEF_FYD("y","600190"),从指标缓存中得到包含的取数公式、参数及报表户编码,形成KEY 的值为A3201_UDEF_FYD("y","6001")、A3201_UDEF_FYD("y","600190")。假设从全局MAP 缓存中根据KEY 值分别得到400、200,分别用这二个值进行替换得到最终的取数表达式为“(400)-(200)”,再通过引擎计算得到值为200,全部指标进行替换后形成如表5 所示的数值。

表5 全部指标经过引擎计算后指标数值

当得到全部指标的值后,并且通过SQL 批量插入方式进行批量更新,从而完成指标计算结果的保存,最终完成任务汇聚过程。系统会更新主任务状态为计算完成状态,通过前端页面任务主动提醒用户已经完成报表任务的计算。

4 结束语

本文针对集团级复杂报表的计算提供了一种新的基于MapReduce 云计算计算报表平台解决方案,能够解决大数据规模下报表取数的性能问题,通过对报表任务的分解,将报表任务按照取数公式分解成若干个子任务,运用分布式计算处理子任务,完成子任务远程计算节点的远程调用。然后对全部结果数据进行Reduce 操作。通过这种云计算分布式报表平台的设计和使用,大大提升了大数据下报表计算的效率。当然,整个方案还有很大的优化点和提升空间,比如现有任务轮询调度机制使用的权重轮询调度算法,但此算法尚未考虑不同任务自身计算的复杂度,这些都需要在后续的研发过程中进一步优化和更新。下一步会将此方案运用到其他符合MapReduce分布式计算的场景中。

猜你喜欢
轮询调用报表
核电项目物项调用管理的应用研究
基于等概率的ASON业务授权设计∗
LabWindows/CVI下基于ActiveX技术的Excel调用
LabWindows/CVI中Excel报表技术研究
从三大报表读懂养猪人的成绩单
基于系统调用的恶意软件检测技术研究
依托站点状态的两级轮询控制系统时延特性分析
利用时间轮询方式操作DDR3实现多模式下数据重排
利用RFC技术实现SAP系统接口通信
数据链轮询多网优化设计方法研究*