基於實時計算(Flink)與高斯模型構建實時異常檢測系統

架構師springboot發表於2019-03-11

1. 概述

異常檢測(anomaly detection)指的是對不符合預期模式或資料集(英語:dataset)中其他專案的專案、事件或觀測值的識別。實際應用包括入侵檢測、欺詐檢測、故障檢測、系統健康監測、感測器網路事件檢測和生態系統干擾檢測等。

之前我曾經介紹過一種異常檢測的解決方案《準實時異常檢測系統》,但那個架構中Flink主要承擔的還是檢測後的分析,真正的異常檢測被前置到了業務系統中。

在本文中,我將介紹一種直接使用Flink做實時異常檢測的方案。

2. 異常檢測演算法

2.1 異常的種類

異常(離群點)分為三種型別:

  • 全域性離群點,最基本的異常,即一個單獨的遠離群體的點;
  • 情境(或條件)離群點,該點在全域性不算異常,但在某個上下文中卻是異常的,比如人的性別為男性不是異常,但如果選定範圍為女廁所,那麼這個就是異常的;
  • 集體離群點,單個點不算異常,但一系列組合起來卻是異常。比如偶爾的服務延遲不是異常,但如果整個系統大部分服務都延遲那就是異常。

本文以說明基本原理為主,所以使用最簡單的全域性離群點做例子,即只關注檢測某個單獨的事件是否偏離正常。

2.2 異常監測演算法

本文選取最簡單的一種演算法,基於高斯分佈分佈的異常檢測演算法。

假設我們已經有了一組正常資料,x(1),x(2),..,x(m),那麼針對新的資料x,我們判斷這個x是否正常,可以計算x在正常資料中出現的概率如何,如果x出現的概率大於某個閾值,則為正常,否則即為異常,這種方法叫做密度估計。

基於實時計算(Flink)與高斯模型構建實時異常檢測系統

那麼我們可以假設,這些資料遵循高斯分佈(正態分佈),那麼對某個特定的值來說,其在高斯分佈的中間部分是比較正常的,在兩端可能是異常的。

基於實時計算(Flink)與高斯模型構建實時異常檢測系統

通常如果我們認為變數 x 符合高斯分佈 x~N(μ,σ2),則其概率密度函式為:

基於實時計算(Flink)與高斯模型構建實時異常檢測系統

異常檢測演算法的步驟為:

  • 對於給定的資料集 x(1),x(2),...,x(m),針對每一個特徵計算 μ 和 σ2 的估計值,計算方法如下。
基於實時計算(Flink)與高斯模型構建實時異常檢測系統
  • 一旦我們獲得了每個特徵的平均值和方差的估計值,給定新的一個訓練例項,根據模型計算每一特徵的概率再相乘得到整體的概率:
基於實時計算(Flink)與高斯模型構建實時異常檢測系統

注:可能你要檢測的事件只有一個特徵,那麼很顯然就不用再乘了。

  • 選擇一個閾值 ε,將 p(x)=ε 作為判定邊界,當 p(x)>ε 時預測資料為正常資料,否則為異常,這樣就完成了整個異常檢測過程。

    注:閾值ε的選擇可以直接估算一個,也可以簡單訓練得出,具體訓練方式這裡不再贅述。

總結一下,其實整個模型我們只需要計算正常資料中每個特徵的平均值和方差,再加上最終整體閾值,所以模型是非常小的,完全可以把這些資料計算出來後隨程式碼一起釋出。(當然從解耦性來說,最好能夠獨立儲存,通過註冊或配置的方式來發布)

3. 基於Flink和高斯分佈的實時異常檢測系統

前面介紹了異常檢測的基本演算法,那麼本小節我們就基於Flink和高斯分佈設計一個實時異常檢測系統。

假設你是一個公司的運維人員,負責管理全公司的IT資源,為了保證公司IT穩定性,提前發現主機或者系統的問題,你設計了這樣一個實時異常檢測系統。

系統架構與所選軟體如下圖所示:

基於實時計算(Flink)與高斯模型構建實時異常檢測系統

資料來源包括兩個部分,主機執行資訊與系統的執行日誌,主機執行資訊通過collectd 收集,系統執行日誌通過Filebeat收集,二者均將資料推送到Kafka。

資料通過Kafka流轉,支援Flink計算過程中的實時分層。

最終資料儲存到Elastic Search中,並通過KIBANA視覺化。

異常檢測由實時計算Flink完成,計算過程很簡單:

基於實時計算(Flink)與高斯模型構建實時異常檢測系統
  • 資料清洗,把原始資料格式化;

  • 計算特徵值,計算所選事件的特徵,比如某個服務列印日誌的頻率就是一個特徵,假如系統呼叫失敗,則會列印一條失敗記錄,那麼當系統列印失敗記錄的頻率變高時,系統可能出現了問題;

  • 計算特徵統計值,即找到該特徵的高斯分佈(確定平均值和方差即可確定高斯分佈);

這裡高斯分佈直接線上計算,好處是隨時可更新,沒有顯式的訓練過程,缺點是可能受異常資料影響。另外一種方式是離線選取一些正常資料然後計算高斯分佈。

  • 檢測異常值,利用2.2節中的演算法原理檢測異常事件;

  • 輸出,最後把檢測出的異常資料寫到下游;

好了,一個簡單的實時異常檢測系統就完成了。

4. 總結

在本文中,在Kappa架構上新增簡單的異常檢測演算法即可完成一個簡單有效的實時異常檢測系統。

該架構具備良好的可擴充套件性,基於Flink的Kappa架構讓系統能夠應對超大規模資料流,並且能夠在資料流轉的過程中完成處理。

此外,雖然本文中直接把異常檢測演算法內建到了Flink的邏輯中,但實際的應用中很容易把通過演算法API的方式讓系統解耦:演算法團隊訓練並提供一個用以判別某個事件或特徵是否異常的演算法服務,在Flink的處理過程中計算好特徵值之後呼叫這個演算法服務進行檢測。

感興趣的可以自己來我的Java架構群,可以獲取免費的學習資料,群號:855801563對Java技術,架構技術感興趣的同學,歡迎加群,一起學習,相互討論。


相關文章