基于Flink的动态基线实战总结

在大数据的背景下,随着指标的数量增加、指标波动幅度变大,设置固定阈值的方式显得日渐乏力。为此,本文在公司自动化运维产品平台上,通过研究动态基线告警的算法,将实时指标数据进行处理并生成告警内容。目前已有的基线计算算法,主要分为两种,即静态基线算法和动态基线算法,不同指标适用一种或多种算法,用于针对不同的监控目的。

 1.动态基线算法

根据现场人员的运维的经验以及实际监控场景,目前场景中主要需要知道历史曲线中最大值、最小值、平均值以及符合正态分布的标准差。本文针对具体的场景结合概率法给出了一种动态基线算法。

首先为了提高算法的稳定性,即减少数据异常对动态基线的影响,需要对数据先进行一些预处理,主要的目的是去除数据中极不合理的数据,本文采用去除最大最小值的方式来进行预处理。为了预处理的同时,减少对数据过多的干涉,本文除去最大值和最小值的个数为5%,且向下取整,对于小于1个,则按1个计算。即样本如果为10个,则应该对数据去除1个最大值(10乘以0.05为0.5个,由于0.5小于1应当按1个进行计算),以及1个最小值(10乘以0.05为0.5个,由于0.5小于1应当按1个进行计算)。

假设指标为X,指标值每分钟统计一次即每分钟指标值为value,动态基线配置的统计时长为q分钟,一天的区间数量为m,去除最大值和最小值的个数y的公式为

基于Flink的动态基线实战总结

区间内数据经过预处理之后有效样本数为n,则指标X的动态基线的最大值max计算公式为:

基于Flink的动态基线实战总结

指标X的动态基线的最小值min计算公式为:

基于Flink的动态基线实战总结

指标X的动态基线的平均值μ计算公式为:

基于Flink的动态基线实战总结

指标X的动态基线的标准差σ计算公式为:

基于Flink的动态基线实战总结

   2.动态基线的优化

在真实的应用场景中,往往数据不能按理想的状态分布,真实数据中经常会存在一些异常值,比如某一个时间点网络波动导致一个时间点的指标值抖动特别明显,同时也存在数据不是一直连续存在断点的情况,有的是场景本身如此,就像某个业务可能某一段时间一直有人办理,而另一个时间段这个业务很少有人办理或者没有人办理,数据的不连续性以及数据的异常值都让动态基线的准确性有所降低。本文采用了插值法对数据进行填充以及降噪处理,来提高数据的完整性,使基线曲线更加平滑。

对数据缺失的情况,有两种方式进行填充,直接采用相邻的值进行填充或者用平均值进行数据的填充,以保证数据的完整及连续性。考虑到实际生产中的数据,一般都会存在异常数据,此时如果采用相邻数据插值法,可能会用异常数据来进行填充,导致基线的可参考性变差,从而影响告警的准确性。本文采取了用平均值来填充断点数据的方式,以减少对原有数据稳定性的影响。

而对于异常数据,具体的降噪处理为,首先,计算出每组指标的平均值、最大值、最小值以及标准差。其次,在数据符合正态分布的情况下(本文的数据为现场主机性能数据以及现场业务办理的日志数据,经过对历史数据的测试符合正态分布),根据‘小概率事件’(事件发生概率小于0.05)以及‘3σ-原则’,一般的采用平均值代替或者边界值μ-3σ或μ+3σ进行替换,以保证数据不会大幅度的被修改,且修正后依然满足之前的正态分布,为了保持数据的原始属性本文采用边界值来对数据进行修正。

对于异常数据的判断,本文采用‘3σ-原则’。计算出符合正态分布的范围(μ-3σ,μ+3σ),根据正态分布的原理,符合正态分布的数据落在这个范围概率为99.73%,如果数据落在(μ-3σ,μ+3σ)范围内则认为数据可以作为基线计算,否则需要对数据进行降噪处理。

为了保持原有数据的真实性,具体的消除波峰以及填波谷的方法为,判断每个指标值value,如果value大于μ+3σ,则用μ+3σ进行代替;如果小于μ-3σ,则用μ-3σ进行代替;其余情况保持原值。

数据填充以及降噪公式为:

基于Flink的动态基线实战总结

经过对数据的重新填充以及降噪之后,数据的完整性得到了优化,并且数据中的异常值也得到了一定的修正。此时,再将修正之后的数据,采用第一小节中的算法,用公式(2)、(3)、(4)、(5)重新计算出指标的基线,作为告警时需要用到的动态基线。

   3.基于Flink的动态基线实现

为了将指标的动态基线更小粒度化,需要将指标的Key按实际的场景进行设计,并且各个Key之间的基线计算互不影响。而Flink本身提供的KeyedStream,通过KeySelector函数来将数据流进行分流,每个Key对应一条属于自己的流,并且各个流互不影响,恰好与动态基线的这一设计思路一致。而且Flink本身框架的高吞吐性,很好的保证动态基线生成的效率。

动态基线的核心思想是结合时间计算出各个时间区间的理想基线,因此需要根据时间来划分窗口,各个窗口有自己的一个基线数据。Flink的核心API就包含了窗口(window)机制,并且有水位(Watermarkers)机制来保证数据能正确的划分到自己的窗口进行收集、运算以及清除。

基于Flink的动态基线生成的具体步骤为:

step1: 设置Flink的source函数,即消费已有的历史数据;

step2: 根据数据的时间字段,定时更新Flink的Watermarkers,本文使用每来一条数据就进行水位更新的方式;

step3: 定义KeySelector函数,对数据流按指标Key进行分流,保证各个Key之间相互独立;

step4: 每条KeyedStream设置一个基于业务时间(EventTime)的窗口,窗口大小可根据实际情况进行定义,本文按2小时进行划分,即每两小时汇总一次窗口;

step5: 窗口汇总时表示该时间区间的数据都已经到齐,此时触发aggregate的汇总函数,函数的功能为本文给出的动态基线算法;

step6: 统计出基线数据,保存。

基于Flink的动态基线生成示例图如图1。

基于Flink的动态基线实战总结

图1基于Flink的动态基线生成示例图

图1为了展示动态基线生成的数据流转图,所以给出的并行度为1,实际环境中的动态基线程序需要根据现场的机器性能以及数据量等因素,来调节并行度。

表1BOSS_BIL与APP_INTF调用量2小时统计时长的动态基线示例

时段平均值最大值最小值标准差
00:00199.00309.0076.0067.87
02:0056.67134.003.0034.97
04:0015.6340.001.009.03
06:00764.651345.00286.00246.00
08:001384.602080.00596.00303.03
10:00978.431687.00453.00276.04
12:00436.001479.003.00451.77
14:00354.78704.0031.00168.06
16:00262.03563.0068.00143.99
18:00296.07648.0072.00147.67
20:00313.31760.00149.00149.85
22:00345.75803.00160.00153.66

表1展示了业务BOSS_BIL与业务APP_INTF调用量,根据一天24小时的历史数据,以2小时的统计时长划分的动态基线示例。

来源:IT那活儿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/125088

发表评论

登录后才能评论
服务中心
服务中心
联系客服
联系客服
侵权联系 投诉举报
返回顶部
河南,挺住!郑州,挺住!一起为他们加油!!