一种基于实时分位数计算的系统及方法

一、问题描述与技术挑战

在实际工作中,我们发现许多业务场景中都有对某一数值型指标实时统计分位数的需求,一般要求计算结果有很高准确率同时具备极低的计算延迟,实现这类需求给数据RD的开发工作带来一定的挑战,其中主要的技术挑战包括以下三个方面:

无法对全量数据进行排序:由于在实时计算场景中是逐条处理数据的,无法对全量数据排序,进而无法获得全量数据的分位数

计算逻辑复杂,计算延迟高:即时在能够排序的场景中,高复杂度的排序操作也会带来很高的计算延迟,无法满足实时计算的低延迟要求

分位数结果无法聚合:两个计算得出的分位数结果无法像求和结果那样直接累加合并得到新的结果,这为分位数计算结果的存储方式带来挑战

针对上述问题,我们基于TDigest数据结构,实现了实时计算环境下的分位数计算方法,封装为基础组件并向上提供API接口,可以在不同的业务场景(内核性能、搜索性能、PUSH等)下提供实时、准确的分位数计算。

二、基础架构与解决方案

本节我们将从计算分位数的常用数据结构、我们实现分位数计算的基础架构、解决方案三部分介绍流式计算场景下的分位数计算方法:

2.1 分位数的常用数据结构

TDigest计算分位数
TDigest是一个简单,快速,精确度高,可并行化的近似百分位算法,被Spark, ES, Kylin等系统使用。TDigest的核心思想是通过聚类的方法将离散的数据点聚集为多个不同的质心,在通过线性插值法计算分位数,线性插值法是最简单的插值算法。

通俗的讲:传统方法是对离散的数据进行排序,在排序结果中直接获得分位数。而TDigest是将离散的数据聚类为多个质心,然后对质心进行近似的“排序”,最后通过插值法求取分位数。
在这里插入图片描述
如上图所示,将离散的数据点(图中无色的数据点)聚类为多个不同的质心(图中彩色的数据点),其中每个质心周围的数据点数决定了该质心所占的权重(图中质心的大小),最后通过对所有的质心进行排序,就可以使用线性插值法求取对应的分位数,其中数据点与质心的距离和权重关系如下图所示。

在这里插入图片描述
特别地,在每个TDigest创建时有一个重要的compression参数,主要用于在计算的精确度与空间复杂度之间做权衡:

当compression参数设置越大时,聚类得到的质心越多,则差分法求取的分位数精确度越高

当compression参数设置越大时,TDigest数据结构占用的存储空间越大,则分位数计算的空间复杂度越高

设置合适的compression参数,能够在提高计算准确率的同时,尽可能降低存储空间,从而满足业务的实际需求

为了帮助大家在做分位数计算时能够选取合适的参数,我们选择百万级的数据量(即统计100w个随机变量的分位数),在不同参数下的计算精确度和空间复杂的如下表所示:
在这里插入图片描述
针对上表所示的数据,我们将做出以下三点说明:

本次测试使用MergingDigest数据结构,该结构占用的空间与compression参数的取值有关,与统计的数据量无关;

随着数据量的增大,compression的取值应适当增大,能够有效提高计算的准确率

2.2 分位数组建的基础架构

由于实时分位数计算是一个常见统计方法,在许多业务场景都会提出类似的需求,对需求方关注的统计指标计算不同的分位数。

为节约人力成本,缩短迭代开发的时间周期,我们基于TDigest数据结构,封装了通用的基础组件,从而在不同的业务场景下快速实现实时分位数统计的开发。
在这里插入图片描述
如上图所示,在实时分位数计算的通用组件中,其基础架构和执行过程主要分为以下几个关键步骤:

  1. 从上游业务方读取需要统计分位数的原始数据

  2. 根据业务方需求的分组规则,按分组聚合为TDigest数据结构,将聚合结果存入Redis中,或与Redis中已存在对应的数据进行合并,以获取准确的计算结果

  3. 从TDigest结构中获取分位数的计算结果,并向上返回

综上所述,我们通过封装基础组件并向上提供API的方式,实现了通用、灵活且对应用方透明的分位数计算方法,能够保证实时性的同时,实现高准确率、低空间复杂度的分位数计算,目前已经在性能平台、搜索、PUSH等厂内多个业务需求中落地应用

2.3 整体实现方案

基于上述介绍的实时分位数基础组件,在厂内的大多数业务场景中,通常从消息队列中获取应用方上报的原始数据,经过一系列解析和计算后,将计算结果存储Doris等OLAP引擎或DB中,共需求方查询和生成对应报表,这是一个通用的解决方案。
根据上述分析,我们就可以得到一个分位数实时计算作业的基本架构,其架构模型如下图所示:

在这里插入图片描述
如上图所示,在厂内的环境中,实时分位数计算任务的常用基本架构主要包括以下几个关键步骤:

1)从消息队列中读取业务方上报的基础数据,并按业务逻辑进行数据解析;

2)通过FlatMap方法,按不同字段将一条数据展开为多条(具体内容将在第3节详细介绍);

3)根据业务设计的查询维度,按不同的key对数据进行分组操作

4)分别将每个key的数据合并为一个TDigest数据结构

5)将聚合后的数据与Redis中存储的数据进行合并,同时将合并结果写回Redis中

6)最后根据数据聚合结构,从每个分组对应的TDigest结构中获取对应的分位数

综过以上步骤,可以实现高实时性、高精确度和低空间复杂度的实时分位数计算方法,能够满足大多数实时分位数业务的需求,在更多的业务场景中可能需要根据实际需求进行适当的调整。

三、解决分位数无法聚合的问题

3.1 问题描述

在实际的业务需求中,我们可能需要按照不同的时间、查询维度等信息检索统计的分位数。但是,已经计算好的两个分位数结果是无法进行聚合操作的。
例如:针对手百APP的用户访问时长,我们可以将某一天中每个小时访问时长的和(SUM)进行累加,从而获得这一天的访问时长总和。但我们如果记录了每个小时中访问时长的80分位数,则无法对这些分位数进行聚合,即无法求得这一天中访问时长的80分位数。这种现象被称为分位数的“不可聚合性”

因此,在实际应用中,如果业务需求要对不同时间、不同维度下的指标分位数进行任意聚合、查询等操作,就为分位数的计算和存储提出新的技术挑战。

3.2 分位数聚合方案

针对上述问题,我们提出按所有查询维度进行提前聚合计算的解决方案,即针对每一种可能出现的查询维度组合,我们都提前计算分位数并存储,这样在查询过程中直接检索对应查询维度的聚合计算结果,在解决了分位数的“不可聚合性”问题的同时,也避免了重复的聚合计算带来的时间开销,缩短了查询耗时,提升了用户体验。

接下来,我们通过一个简单实例讲解具体的聚合计算方法:假设在某业务场景中,用户关注的查询维度共有三个字段,分别为:APP版本(app_version)、厂商(manufacturer)和客户端操作系统版本(os_version)。则对于任意维度组合的查询操作,用户有可能采用 2^3=8 种聚合查询方式。因此,我们通过排列组合的方式,枚举中所有可能的聚合查询方式,分别统计分位数。假设从上游读取到的部分数据如下表所示:
在这里插入图片描述
并且,如果对某一字段进行聚合查询,我们将该字段的取值记为关键词 “ALL”,则这条数据共对应2^3=8 种可能的聚合查询方式。为了模拟出8种不同的维度排列组合方式,我们利用二进制排列组合的方式,让每个字段严格对应二进制数据中的一位:如果该位的取值为0,则字段内容为上报的原始值(即上表中的实际取值);若该位的取值为1,则对应字段的取值记为关键词“ALL”。此外,二进制数据中从右至左每一位与字段的对应关系为:

第1位对应os_version

第2位对应manufacturer

第3位对应app_version

由此可得,任意字段聚合查询的排列如何方式如下表所示:
在这里插入图片描述
这样,我们就通过二进制排列组合的方式,枚举出所有可能的维度组合查询方式。在实际的计算过程中,可以利用流式计算的FlatMap算子,按照上述的排列组合方式,将一条数据扩展为多条数据,并进行分组聚合、计算分位数,将最终的计算结果存入Doris等存储引擎中供用户查询。此时,计算结果中实际已经包含了所有可能的聚合查询方式,业务方可以按需要直接查询到最终的分位数结果,而无需另外进行聚合计算操作,在有效提高查询效率的同时保证了用户体验。

四、结语

以上内容是我们从宏观的角度,对实时分位数计算方法的核心技术、基础架构和技术难点进行了简要介绍。如有任何问题或建议,欢迎大家随时沟通交流。

文章发表在

知乎:一种基于实时分位数计算的系统及方法
CSDN:一种基于实时分位数计算的系统及方法

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3l1mmpy2jiuc0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常用的温度检测元件主要有热电偶、热电阻、热敏电阻等。热电偶主要是利用两种不同金属的热电效应,产生接触电势随温度变化而变化,从而达到测温的目的。测量准确,价格适中测温范围宽,线性度较好。但其输出电压受冷端温度影响,需要进行冷端温度补偿,使电路变得复杂,在本题中并非最佳方案。 热敏电阻由金属氧化物或半导体材料制成,灵敏度高、热惰性小、寿命长、价格便宜。但其测量的稳定性和复现性差,测量精度无法满足本题发挥部分0.2℃的要求。而且线性度差,需要进行查表线性拟合,大大浪费控制器的资源,因此不能选用。 热电阻是利用金属的电阻率随温度变化而变化的特性,将温度量转化成电阻量。其优点是准确度高,稳定性高,性能可靠,热惯性小、复现性好,价格适中。但电阻值与温度是非线性关系,Pt100热电阻,当0℃<t<850℃时可用下式表示: 其中A=3.9083╳10-3 /℃;B=-5.775╳10-7 /℃;由此可见,温度越高非线性误差越大,本题目要求温控范围是40℃~90℃,温度较低。经计算当温度为90℃时,非线性误差为0.34%,运用最小二乘法适当的进行零点和增益的调整,还可使此误差降低一倍,而本题要求精度为,0.2/90=0.22%,因此在本题中可以选用Pt100热电阻,并可近似将其电阻值与温度看作线性关系。 2、 放大电路 热电阻所测得的是电阻量,需要转化为电压量才能被控制器采集。最基本的电阻-电压转换电路是将其与另一固定电阻串联,但这种方法,当温度为量程下限时输出不为零,这样不利于小信号的放大和提高A/D转换的精度。因此,本作品采用桥路测量,电路如图2所示: 其中R1R2为10kΩ固定电阻,Rt为热电阻,Rw2为调零电阻,由于 ,因此上下两支路电流相等,并保持恒定不变,输出电压 ,可调整Rt0=Rw2,使得 由于在桥路中R1很大,使得输出量uo变化很小,当Rt从0到100℃变化时,输出仅有十几毫伏,因此还需要进行小信号放大。本作品所用低频增益可调放大电路如图3: 其中Rw1为增益电阻,用于调整测量满量程,运放采用低噪声NE5532,令R1=R2,R3=R4,R5=R6,则该放大电路总增益为 ,当Rw1从0到50kΩ变化时,Av的变化范围为150至+∞,满足所需增益要求。 3、 A/D转换 题目所要求测量度精度为0.2℃,测温的范围应该为室温到要求的最高温度,即20~90℃,这就决定了A/D转换的最低分辨率不低于0.2/(90-20)=1/350,而普通八位A/D转换芯片只能达到1/256,不能满足要求。而如果选用更高位的芯片,将大大增加成本。温度是一种变化时间常数较大的物理量,对A/D转换速度要求不高,因此,在设计中选用了压控振荡器,先将电压信号转化为频率量,再通过控制器的计数功能转化为数字信号,这样可以大大提高精度,节约成本。 压控振荡器如图4所示: 电容器C1充电周期为 ,放电周期为 ,由于 所以 ,所以其振荡频率可近似看作与输入电压Ui成正比。但当频率较高时,仍有较大(约为5%)非线性误差,不能满足题目要求。因此,在作品中利用FPGA的优点,该测频率为测正脉冲宽度,再通过单片机求倒数,这样即可完全消除非线性误差。 4、 控制器 对水温的反馈偏差控制,就必然用到经典控制理论中的PID(Proportional Integral and Derivative比例积分微分)控制,控制器可有多种选择,如模拟电路、单片机、逻辑器件等。 模拟电路控制可对偏差变化进行连续的控制,技术成熟,性能较稳定。但其缺点是不便于显示,调整PID参数需更换元器件,易受到外界干扰等,在现在这个数字化高度发展的时代已趋于淘汰。 单片机作为微型计算机的一个分支,已有二十多年的发展,在各控制领域都有广泛的应用。而近年以FPGA(现场可编程门阵列)为代表的可编程逻辑器件异军突起,其优异的性能大大弥补了单片机响应速度慢、中断源少的缺点。但FPGA的运算能力有限,因此,在我们的设计中采用FPGA与单片机相结合的控制方式,二者优势互补,性能大大提高。 在本作品中,FPGA主要负责接收压控振荡器的信号,通过测量其正脉宽而获得电压量;单片机接收FPGA发送的数据,进行显示、PID运算,和输出。 5、 输出驱动电路 控制器将其PID运算的结果转化为不同占空比的脉冲信号输出,该信号作用于执行机构还需要经过驱动电路。 本作品中采用交流调功电路,即将负载与交流电源接通几个周波,再断开几个周波,通过改变开通与断开周波的比值来调节负载所消耗的平均功率。具体实现电路如图5。 将220V/50Hz的市电,经电阻分压到5V以下,输入运放的同相输入端,运放作为过零比较器,当市电过零时,产生跳变,运放输出送到D触发器的时钟端,D触发器的输入接单片机输出的脉冲信号,输出接双向晶闸管的门极。这样,只有当交流电过零时,单片机的输出信号才对晶闸管产生作用,也就是说,只有当交流电过零时,晶闸管才能开通或关断。这样可以大大减小开通关断过程中对晶闸管的冲击,减少开通关断损耗。 二、 控制器软件设计 1、 FPGA程序设计 在本作品中,FPGA的主要功能是测量压控振荡器输出高脉宽的时间。由于压控振荡器的频率较低(0,则输出脉冲的占空比增加1%,反之减小1% 为了确定PID参数,根据容器加热、传热的公式,列出加热容器的微分方程,经拉氏变换后得到一个一阶滞后环节,其传递函数约为 ,对整个控制回路用Matlab中的Simulink工具箱进行方针,其框图如图8 图中step为输入阶跃给定信号,step1为干扰量,A中存储输出占空比,scope显示输出波形(图9a),scope1显示占空比值(图9b)。 图9a 图9b 当t=10时刻,给定值输入阶跃量,t=100时刻,输入干扰阶跃量。由此可见,本系统可以以较小的超调和较短的调节时间达到稳定状态,并对于干扰有较好的控制作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值