面对海量的日志(TB乃至PB级别),如何从日志中挖掘出异常信息对于大部分的开发者而言是一个大难题。例如,判断机器的延时是否正常,部分request是否正常。一般,咱们对于异常的数据,要及时的报警,以尽快的处理。算法
一般咱们是怎么搞得呢? 在之前,依赖于开发者的经验,来根据某些特定的特征,判断是否达到了阈值,例如根据延时是否达到了某个特定的值,或者http 响应码5xx的比例达到了某个阈值。这个阈值,依赖于资深的开发者的丰富的经验。spa
AI算法的迅猛发展,给异常日志挖掘提供了新的方向。大名鼎鼎的AI领域专家吴恩达(Andrew NG),在他所教授的Machine Learning课程中提供了一种Abnormal Detection算法。算法经过训练数据集,得到一个正态分布。而后检测目标数据是否落在了正态分布的边缘位置,若是落在了边缘位置,则认为是一个异常数据。日志
算法步骤:code
接下来,咱们介绍如何在SQL中使用该算法来检测异常。orm
以延时为例,咱们来看哪些延时是异常的。 延时的分布通常是这样的:blog
不知足正太的需求,要把上述图形转化成正太分布,对latency 求对数:log(latency)
ip
stddev即标准差
variance即方差
avg_ln即ln(latency)的均值
avglatency即latency的均值开发
| select latency where pow(e(), - pow((ln(latency) - 8.223) ,2)/2/0.3975) /sqrt(2*pi()) / 0.53 < 0.01 order by latency desc
把方差标准差和均值带入公式,使用where筛选出来小于0.01的结果,即异常值。能够看到,得到的结果,明显大于军latency的均值。it