基于实时计算(Flink)与高斯模型构建实时异常检测系统
案例與解決方案匯總頁:
阿里云實(shí)時(shí)計(jì)算產(chǎn)品案例&解決方案匯總
1. 概述
異常檢測(anomaly detection)指的是對不符合預(yù)期模式或數(shù)據(jù)集(英語:dataset)中其他項(xiàng)目的項(xiàng)目、事件或觀測值的識別。實(shí)際應(yīng)用包括入侵檢測、欺詐檢測、故障檢測、系統(tǒng)健康監(jiān)測、傳感器網(wǎng)絡(luò)事件檢測和生態(tài)系統(tǒng)干擾檢測等。
之前我曾經(jīng)介紹過一種異常檢測的解決方案《準(zhǔn)實(shí)時(shí)異常檢測系統(tǒng)》,但那個(gè)架構(gòu)中Flink主要承擔(dān)的還是檢測后的分析,真正的異常檢測被前置到了業(yè)務(wù)系統(tǒng)中。
在本文中,我將介紹一種直接使用Flink做實(shí)時(shí)異常檢測的方案。
2. 異常檢測算法
2.1 異常的種類
異常(離群點(diǎn))分為三種類型:
- 全局離群點(diǎn),最基本的異常,即一個(gè)單獨(dú)的遠(yuǎn)離群體的點(diǎn);
- 情境(或條件)離群點(diǎn),該點(diǎn)在全局不算異常,但在某個(gè)上下文中卻是異常的,比如人的性別為男性不是異常,但如果選定范圍為女廁所,那么這個(gè)就是異常的;
- 集體離群點(diǎn),單個(gè)點(diǎn)不算異常,但一系列組合起來卻是異常。比如偶爾的服務(wù)延遲不是異常,但如果整個(gè)系統(tǒng)大部分服務(wù)都延遲那就是異常。
本文以說明基本原理為主,所以使用最簡單的全局離群點(diǎn)做例子,即只關(guān)注檢測某個(gè)單獨(dú)的事件是否偏離正常。
完成的異常分類可參考:這里
2.2 異常監(jiān)測算法
關(guān)于異常檢測有大量的算法,詳細(xì)理論可參考scikit-learn的《?Novelty and Outlier Detection》一章。
本文選取最簡單的一種算法,基于高斯分布分布的異常檢測算法。
假設(shè)我們已經(jīng)有了一組正常數(shù)據(jù),x(1),x(2),..,x(m),那么針對新的數(shù)據(jù)x,我們判斷這個(gè)x是否正常,可以計(jì)算x在正常數(shù)據(jù)中出現(xiàn)的概率如何,如果x出現(xiàn)的概率大于某個(gè)閾值,則為正常,否則即為異常,這種方法叫做密度估計(jì)。
那么我們可以假設(shè),這些數(shù)據(jù)遵循高斯分布(正態(tài)分布),那么對某個(gè)特定的值來說,其在高斯分布的中間部分是比較正常的,在兩端可能是異常的。
通常如果我們認(rèn)為變量 x 符合高斯分布 x~N(μ,σ2),則其概率密度函數(shù)為:
異常檢測算法的步驟為:
- 對于給定的數(shù)據(jù)集 x(1),x(2),...,x(m),針對每一個(gè)特征計(jì)算 μ 和 σ2 的估計(jì)值,計(jì)算方法如下。
- 一旦我們獲得了每個(gè)特征的平均值和方差的估計(jì)值,給定新的一個(gè)訓(xùn)練實(shí)例,根據(jù)模型計(jì)算每一特征的概率再相乘得到整體的概率:
注:可能你要檢測的事件只有一個(gè)特征,那么很顯然就不用再乘了。
- 選擇一個(gè)閾值 ε,將 p(x)=ε 作為判定邊界,當(dāng) p(x)>ε 時(shí)預(yù)測數(shù)據(jù)為正常數(shù)據(jù),否則為異常,這樣就完成了整個(gè)異常檢測過程。
注:閾值ε的選擇可以直接估算一個(gè),也可以簡單訓(xùn)練得出,具體訓(xùn)練方式這里不再贅述,可參考這里。
總結(jié)一下,其實(shí)整個(gè)模型我們只需要計(jì)算正常數(shù)據(jù)中每個(gè)特征的平均值和方差,再加上最終整體閾值,所以模型是非常小的,完全可以把這些數(shù)據(jù)計(jì)算出來后隨代碼一起發(fā)布。(當(dāng)然從解耦性來說,最好能夠獨(dú)立存儲,通過注冊或配置的方式來發(fā)布)
3. 基于Flink和高斯分布的實(shí)時(shí)異常檢測系統(tǒng)
前面介紹了異常檢測的基本算法,那么本小節(jié)我們就基于Flink和高斯分布設(shè)計(jì)一個(gè)實(shí)時(shí)異常檢測系統(tǒng)。
假設(shè)你是一個(gè)公司的運(yùn)維人員,負(fù)責(zé)管理全公司的IT資源,為了保證公司IT穩(wěn)定性,提前發(fā)現(xiàn)主機(jī)或者系統(tǒng)的問題,你設(shè)計(jì)了這樣一個(gè)實(shí)時(shí)異常檢測系統(tǒng)。
系統(tǒng)采用Kapp架構(gòu),關(guān)于Kappa架構(gòu)的說明可參考:數(shù)據(jù)倉庫介紹與實(shí)時(shí)數(shù)倉案例。
系統(tǒng)架構(gòu)與所選軟件如下圖所示:
數(shù)據(jù)源包括兩個(gè)部分,主機(jī)運(yùn)行信息與系統(tǒng)的運(yùn)行日志,主機(jī)運(yùn)行信息通過collectd?收集,系統(tǒng)運(yùn)行日志通過Filebeat收集,二者均將數(shù)據(jù)推送到Kafka。
數(shù)據(jù)通過Kafka流轉(zhuǎn),支持Flink計(jì)算過程中的實(shí)時(shí)分層。
最終數(shù)據(jù)存儲到Elastic Search中,并通過KIBANA可視化。
異常檢測由實(shí)時(shí)計(jì)算Flink完成,計(jì)算過程很簡單:
- 數(shù)據(jù)清洗,把原始數(shù)據(jù)格式化;
- 計(jì)算特征值,計(jì)算所選事件的特征,比如某個(gè)服務(wù)打印日志的頻率就是一個(gè)特征,假如系統(tǒng)調(diào)用失敗,則會打印一條失敗記錄,那么當(dāng)系統(tǒng)打印失敗記錄的頻率變高時(shí),系統(tǒng)可能出現(xiàn)了問題;
- 計(jì)算特征統(tǒng)計(jì)值,即找到該特征的高斯分布(確定平均值和方差即可確定高斯分布);
這里高斯分布直接在線計(jì)算,好處是隨時(shí)可更新,沒有顯式的訓(xùn)練過程,缺點(diǎn)是可能受異常數(shù)據(jù)影響。另外一種方式是離線選取一些正常數(shù)據(jù)然后計(jì)算高斯分布。
- 檢測異常值,利用2.2節(jié)中的算法原理檢測異常事件;
- 輸出,最后把檢測出的異常數(shù)據(jù)寫到下游;
好了,一個(gè)簡單的實(shí)時(shí)異常檢測系統(tǒng)就完成了。
4. 總結(jié)
在本文中,在Kappa架構(gòu)上添加簡單的異常檢測算法即可完成一個(gè)簡單有效的實(shí)時(shí)異常檢測系統(tǒng)。
該架構(gòu)具備良好的可擴(kuò)展性,基于Flink的Kappa架構(gòu)讓系統(tǒng)能夠應(yīng)對超大規(guī)模數(shù)據(jù)流,并且能夠在數(shù)據(jù)流轉(zhuǎn)的過程中完成處理。
此外,雖然本文中直接把異常檢測算法內(nèi)置到了Flink的邏輯中,但實(shí)際的應(yīng)用中很容易把通過算法API的方式讓系統(tǒng)解耦:算法團(tuán)隊(duì)訓(xùn)練并提供一個(gè)用以判別某個(gè)事件或特征是否異常的算法服務(wù),在Flink的處理過程中計(jì)算好特征值之后調(diào)用這個(gè)算法服務(wù)進(jìn)行檢測。
?
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的基于实时计算(Flink)与高斯模型构建实时异常检测系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL的未来在哪?
- 下一篇: 开发跨平台app推荐React Nati