资讯专栏INFORMATION COLUMN

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

IT那活儿 / 4222人阅读
基于Flink的动态基线实战总结

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


 1.动态基线算法



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

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

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

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

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

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

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



   2.动态基线的优化


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

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

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

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

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

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

经过对数据的重新填充以及降噪之后,数据的完整性得到了优化,并且数据中的异常值也得到了一定的修正。此时,再将修正之后的数据,采用第一小节中的算法,用公式(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。

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

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

1BOSS_BILAPP_INTF调用量2小时统计时长的动态基线示例

时段

平均值

最大值

最小值

标准差

00:00

199.00

309.00

76.00

67.87

02:00

56.67

134.00

3.00

34.97

04:00

15.63

40.00

1.00

9.03

06:00

764.65

1345.00

286.00

246.00

08:00

1384.60

2080.00

596.00

303.03

10:00

978.43

1687.00

453.00

276.04

12:00

436.00

1479.00

3.00

451.77

14:00

354.78

704.00

31.00

168.06

16:00

262.03

563.00

68.00

143.99

18:00

296.07

648.00

72.00

147.67

20:00

313.31

760.00

149.00

149.85

22:00

345.75

803.00

160.00

153.66

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


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129965.html

相关文章

  • Flink实战(六) - Table API & SQL编程

    摘要:每个在简洁性和表达性之间提供不同的权衡,并针对不同的用例。在这些中处理的数据类型在相应的编程语言中表示为类。该是为中心的声明性表,其可被动态地改变的表表示流时。这种抽象在语义和表达方面类似于,但是将程序表示为查询表达式。 1 意义 1.1 分层的 APIs & 抽象层次 Flink提供三层API。 每个API在简洁性和表达性之间提供不同的权衡,并针对不同的用例。 showImg(ht...

    lifefriend_007 评论0 收藏0
  • 你公司到底需不需要引入实时计算引擎?

    摘要:再如通过处理流数据生成简单的报告,如五分钟的窗口聚合数据平均值。复杂的事情还有在流数据中进行数据多维度关联聚合塞选,从而找到复杂事件中的根因。因为各种需求,也就造就了现在不断出现实时计算框架,而下文我们将重磅介绍我们推荐的实时计算框架。 前言 先广而告之,本文摘自本人《大数据重磅炸弹——实时计算框架 Flink》课程第二篇,内容首发自我的知识星球,后面持续在星球里更新,这里做个预告,今...

    HackerShell 评论0 收藏0
  • Flink 全网最全资源(视频、博客、PPT、入门、实战、源码解析、问答等持续更新)

    摘要:由于配置流是从关系型数据库中读取,速度较慢,导致实时数据流流入数据的时候,配置信息还未发送,这样会导致有些实时数据读取不到配置信息。从数据库中解析出来,再去统计近两周占比。 showImg(https://segmentfault.com/img/remote/1460000019367651); Flink 学习项目代码 https://github.com/zhisheng17/f...

    Dr_Noooo 评论0 收藏0
  • Flink实战(八) - Streaming Connectors 编程

    摘要:默认情况下,当数据元到达时,分段接收器将按当前系统时间拆分,并使用日期时间模式命名存储区。如果需要,可以使用数据元或元组的属性来确定目录。这将调用传入的数据元并将它们写入部分文件,由换行符分隔。消费者的消费者被称为或等。 1 概览 1.1 预定义的源和接收器 Flink内置了一些基本数据源和接收器,并且始终可用。该预定义的数据源包括文件,目录和插socket,并从集合和迭代器摄取数据...

    beita 评论0 收藏0
  • Flink 灵魂两百问,这谁顶得住?

    摘要:由于配置流是从关系型数据库中读取,速度较慢,导致实时数据流流入数据的时候,配置信息还未发送,这样会导致有些实时数据读取不到配置信息。从数据库中解析出来,再去统计近两周占比。 Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧! showI...

    Guakin_Huang 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<