作者介紹
左喻灝,新炬網路AIOps高階工程師。擁有豐富的HBase運維經驗和專業的機器學習知識,擅長使用人工智慧技術解決大資料運維中的實際問題。2019年開始基於各類機器學習演算法進行大資料平臺異常檢測方向的研究,近期正在積極參與某運營商大資料平臺自動化運維平臺建設工作。
王哲,新炬網路大資料運維開發工程師。擅長Spark、Flink等流處理技術開發,擁有豐富的實時資料處理經驗,近期正在積極參與某運營商大資料平臺自動化運維平臺建設工作。
背景
告警系統是運維人員的“眼”,是維護生產安全的第一層保障。傳統基於規則的告警系統是透過同比、環比、差分、設定閥值等手段來判斷當前指標是否存在異常,但往往不盡人意,存在維護成本高、準確率低等問題。隨著人工智慧的興起,大資料運維也迎來了新的契機,同時也對自身告警系統的實時性提出了更高的需求。
於是我們結合Tensorflow深度學習演算法,基於大資料平臺天然原生的分散式流處理框架Spark,打造了一套高覆蓋性與強實時性的告警系統,有效的減少了人工規則的參與,並降低了維護成本。
本文主要從“基於深度學習的時序預測演算法”和“演算法結合Spark流處理的實時告警”兩個方面對本套告警系統進行介紹。框架圖如下圖所示:
一、基於深度學習的時序預測演算法
使用演算法監控時序資料的常規思路,是透過本時刻實時值與用前幾個時間點的時序資料對本時刻的預測值進行比較。因此,告警的第一步是做好時序預測工作,即時序分析。
引用一段百度文庫對時序分析原理的介紹:“承認事物發展的延續性, 事物的現實是歷史發展的結果,而事物的未來又是現實的延伸,事物的過去和未來是有聯絡的。時間序列分析預測法的哲學依據,是唯物辯證法中的基本觀點,即認為一切事物都是發展變化的,事物的發展變化在時間上具有連續性。”
時序分析的過程分為以下三個操作步驟:
第一步:資料預處理;
第二步:核心指標分類;
第三步:選擇演算法訓練模型。
下面對以上步驟展開敘述。
1、資料預處理
利用好資料的前提是資料是好用的,因此所有的資料分析工作第一步一定要先經過資料預處理,主要包括資料清洗和特徵提取。
時序預測基於歷史資料預測未來,歷史資料中的“空值”、“異常值”將會極大的影響到預測的質量,因此在訓練預測模型前需要對訓練集時序資料進行清洗。可以先對資料繪圖直觀的看一下是否有周期性,然後對於空值採取補齊的方式,具體補齊方式可以根據原序列有明顯週期性則可以用歷史多個週期在這一個時間點的平均值,無明顯週期性則可以用前後兩點的均值代替,對於異常值同理。
時序分析的特徵提取,業界多采用滑動視窗時序特性分析的方法,也即多個時間視窗之間資料做統計上的均值、方差、協方差等對比,分解出時間序列的成分。時間序列的成分則分為3種:
長期趨勢:一段時間後序列總體呈現的上升或下降的趨勢;
季節性:週期性固定的變化;
餘項:時間序列除去趨勢、季節性後的偶然性波動,稱為隨機性,也稱不規則波動,是常態。
長期趨勢
季節波動
餘項
不同於分類場景中將提取的特徵用於模型訓練,這裡特徵提取的季節波動和餘項都將服務於下一步的指標分類。
2、核心指標分類
對核心指標的時序預測,則需要事先分解時序資料的成分並進行預分類。參照業界時序預測指標分類的方式,用是否具有周期性和是否穩定兩個標準可分為以下四類,以叢集環境真實指標圖解說明:
週期性穩定
週期性非穩定
非週期性穩定
非週期性非穩定
從演算法角度上,我們提出了一種基於時序分解,對週期分量進行觀察並對餘項進行方差分析的指標型別判定方式:
Step 1:時序分解演算法將時序資料分解出“趨勢分量”、“週期分量”和“餘項”
透過觀察週期分量,上述第三張圖具有明顯規律性波動才被認為具有周期性。
Step 2:對時序分解法分解出的“餘項”做方差分析
首先對“餘項”進行預處理,採用“歸一化”的處理方式將“餘項”歸一化到區間。再計算出“歸一化餘項”的方差,只有方差在一定閾值以內才被認定為穩定。具體閾值的大小沒有一個統一標準,在對多達近百個指標進行如上分析,最終閾值取了0.2。
至此,完成黃金指標的型別分類。對於非週期性指標的監控,業界內暫時也沒有一個好的方案,主要還是採用同比環比、差分、設定閥值等經典規則方法。同一種方法,不可能解決所有型別指標的監控,使用新演算法並不意味著完全摒棄一些舊方式,這裡不做進一步探討。對於週期性非平穩序列,則可以透過粗粒度時窗,比如原本1分鐘一個的點,現統計每5分鐘的值進行求和或者求均,都可以處理成周期平穩序列。因此,本文主要針對透過以上方式分類和處理得到的週期性平穩資料。
3、基於LSTM演算法的時序預測
時序預測的演算法整體上有兩大類:基於統計學的傳統機器學習演算法;基於神經網路的深度學習演算法。常用的機器學習演算法,如指數平滑法、移動平均自迴歸模型以及添加了週期性成分的季節性移動平均自迴歸模型;常用的深度學習演算法,如深度神經網路、迴圈神經網路以及解決了RNN存在長期依賴問題的長短時記憶網路。
考慮到平臺部署、穩定性等實用性因素,並對統計學模型兩種演算法ARIMA、SARIMAX跟深度學習模型LSTM演算法的實時性進行對比,在真實環境下,進行多次對比取均值,得出以下結論:
可以看到,LSTM模型不僅在訓練跟預測上所花費的時間均遠低於其他兩個模型,其他兩個模型的實時性無法滿足需求;同時在資源消耗以及丟失值敏感問題上也要優於其他。因此,最終選擇的是深度學習演算法——LSTM。
1)LSTM簡介
近幾年,隨著計算能力的迅猛提升,上個世紀末研究到一半的深度學習在今天重新“翻熱”,並在各個領域大放異彩。深度學習模仿大腦的神經元之間傳遞,處理資訊的模式,對其演算法思想的理解需要有一定機器學習的基礎,下面只做簡要介紹。
深度學習隸屬於機器學習,與基於人工規則定義特徵的傳統機器學習相比,DL明確了特徵學習的重要性。簡單的深度學習演算法有深度神經網路DNN,它透過逐層特徵變換,將樣本在原空間的特徵表示變換到一個新特徵空間,透過組合低層特徵形成更加抽象的高層表示屬性類別或特徵。
隨著深度學習的進一步研究,除了DNN以外還有較多應用於影象識別的卷積神經網路CNN以及自然語言處理NLP常用到的迴圈神經網路RNN等等。RNN又因為其輸入是同一事物的多個時間點的資料,透過不停的將資訊迴圈操作,保證資訊持續存在,從而可以利用前面的事件資訊的特性被應用於時序分析。本文中的LSTM是一種特殊的迴圈神經網路RNN,它既有RNN儲存歷史資訊的功能,還解決了普通RNN存在的梯度消失跟梯度爆炸問題。LSTM也有很多變種,這裡只給出樸素LSTM的網路結構圖。
2)LSTM模型訓練操作過程
LSTM 演算法的時序預測方式是先基於指標的歷史資料訓練出模型,再根據當前資料預測指標未來。以下具體的操作使用的是Tensorflow框架,Tensorflow是Tensor以資料流圖的形式進行數值計算。
Step 1:已經預處理過的資料轉換為Tensorflow可接受的張量形式
A:資料歸一化;
B:訓練資料轉換格式,……,x;Y:x);
C:Reshape成指定形狀的張量。
以上過程舉例說明,假設有時序資料,設n為3。那麼對這個序列進行處理得到,,……,共7個訓練樣本。然後再轉換為張量格式類似下圖所示:
兩個6維三階張量X
兩個1維二階張量Y
Step2:定義網路結構
A:選擇網路:這裡使用的是LSTM網路;
B:設定引數:輸入層、輸出層、timestep;
C:初始化各個神經元之間的連線跟偏置。
Step3:網路訓練
A:設定最佳化器、損失函式、學習率、啟用函式…;
B:設定訓練方式。
Step4:生產預測
A:儲存模型;
B:複用模型進行預測,注意需要反歸一化。
經過以上過程,即完成了LSTM模型的訓練,此時得到的網路結構格式如下:
編輯
二、演算法結合Spark流處理的實時告警
上一章節中,透過深度學習演算法有效的對指標進行預測,本章節則將其透過與Spark流處理框架的結合應用到告警系統的生產部署中。限於Spark已有的機器學習庫MLlib裡沒有深度學習演算法,以及大資料元件跟深度學習演算法之間的語言相容問題。因此嘗試在Spark中呼叫訓練好的Tensorflow模型,即“Tensorflow離線訓練,Spark實時預測“的AI生產部署模式。
具體分為以下幾步:模型上傳至HDFS;Yarn排程Spark Streaming載入PB模型;資料的實時消費與告警。涉及到以下引擎層和Hadoop底層:
1、模型上傳至HDFS
把一章節中的深度學習演算法模型輸出為可上傳至HDFS檔案系統格式的檔案並上傳至叢集HDFS。首先對深度學習模型的儲存方式做了簡單對比分析:
透過以上對比分析,根據場景適用性、介面豐富性、開發語言相容性等優勢,最終選用PB格式的儲存方式。PB模型實質是一個PB檔案,是深度學習演算法最終生成的一個二進位制檔案,需要Tensorflow框架進行讀取、編譯,最後在程式中形成一個預測模型。對其上傳則透過crontab定期執行上傳即可,上傳週期可調。
2、Spark載入PB模型
首先將PB檔案儲存在HDFS上,透過Spark Streaming程式可以直接讀取到HDFS上的PB檔案,然後利用Tensorflow框架將所有讀取到的PB檔案,還原成之前訓練好的神經網路模型,用於深度學習的預測。因為在生產環境中,程式是On Yarn模式,以此來保證程式的高可用和高效能,所以所有的PB模型都是透過Spark程式的Driver元件統一生成,然後在向下分發至各個Executor,預測過程將在各個Job中執行。
此外,因為選用的是Spark Streaming框架,所以支援動態PB模型載入,即如果想更新PB模型,可以直接替換HDFS上的PB檔案,程式即可識別新的PB檔案,生成新的PB模型為後面的資料進行預測。動態更新PB模型遍於調整預測規則,根據指標資料的實時變動,更加有效的更改調節演算法策略,使得預測結果更加精準。
整套程式上基於Spark Streaming框架開發的,所以在實時效能夠得以保證,在資料平臺搭建完善的基礎上,所有的實時資料指標資訊都會存放在Kafka訊息佇列中。程式在實時消費Kafka獲取當前指標資料,每一次預測都會根據當前的指標資料計算,得到的預測結果會更加貼合真實值。
上圖為Spark Streaming基本內部原理,SparkStreaming從實時資料流接入資料,再將其劃分為一個個小批次供後續Spark engine處理,所以實際上,Spark是按一個個小批次來處理資料流的。這正是符合我們的實際應用場景,資料實時接收,一批批處理,再結合深度學習演算法,實現了智慧AI實時預測的功能。
3、資料的實時消費與告警
為防止瞬時異常導致的模型失真問題,因此需要有個替換邏輯來保證模型的穩定。我們利用了外部應用Redis,因Redis是記憶體資料庫,其速度快、多型別儲存以及其他豐富特性,能夠完全支援我們的儲存需求。
對每一個需要預測的指標資料設計了三個不同的資料集,分別為forecast佇列、real佇列和pb佇列:
forecast佇列即為預測值佇列,此佇列中存放的是根據深度學習演算法生成的預測值;
real佇列即為真實值佇列,此佇列中存放的是從Kafka訊息佇列中消費得來的真實資料;
pb佇列即為模型輸入佇列,此佇列是用來灌輸到PB模型中的資料佇列。
三個佇列互相協作,保證模型的穩定。首先在程式第一次啟動時,需要先積累足夠多的原始資料,填入到real佇列和pb佇列中,當積累了t分鐘後,有了足夠多的資料可以預測時,將pb佇列中的資料填入PB模型中,預測t 1分鐘的資料,將t 1分鐘的預測值填入到forecast佇列中。
在t 1分鐘時,拿到了t 1分鐘的真實值,用t 1分鐘的真實值與t分鐘預測出來的t 1分鐘的預測值根據特定的比對規則比對,如果真實值與預測值符合比對要求,那麼將t 1分鐘的真實值填入到pb佇列中,反之則用t 1分鐘的預測值填入到pb佇列中,並且保持pb模型要求的長度,去掉pb佇列中時間最早的資料,用替換更改過後的pb佇列填入到PB模型中,預測t 2分鐘的預測值。
當以上步驟進行了足夠多的時候,那麼real佇列與forecast佇列都已經積累的足夠多的資料,並且時間都會互相匹配,即real佇列的資料為t分鐘至t n分鐘的真實值,forecast佇列的資料為t 1分鐘至t n 1分鐘的預測值,那麼在t n 1分鐘時,拿到了t n 1分鐘的真實資料,即可按照每個時間的真實值和預測值互相對比,判斷此指標資料是否出現異常,如果比對結果中的異常時間點超過既定個數,那麼此指標則被判定有異常發生,立刻會發出告警,提醒運維人員檢查修復。
對於每個佇列的長度和應用都做成可隨時更改的配置項,裡面有詳細的要求和規則來規定和約束每個不同的預測模型的資料佇列便於模型定製化調整,真正的實現了特定預測,特殊預測和準確預測。
三、總結
整個告警系統平臺,採用深度學習演算法提高了預測的準確性,再結合Spark Streaming流處理框架保障了告警的實時性,減少了人為規則的參與,降低運維人員維護的時間投入。
從2019年年底正式上線,現已穩定支撐某運營商包括Kafka、HBase等多個大資料技術棧的核心指標業務的實時監控。從平臺正式執行至今,總的查全率能達到98%以上;由於核心業務更注重查全率,因此查準率稍低,查準率大約維持在90%的水平;同時叢集環境提供的容錯性,以及Spark Streaming流處理提供的實時消費能力極大的降低了告警的時間延遲,理論上可以達到與指標採集頻率相差毫秒級的延遲。
隨著人工智慧的興起,運維也迎來了新的契機,想破解運維轉型困局,讓Gdevops全球敏捷運維峰會北京站給你新思路:
《浙江移動AIOps實踐》浙江移動雲計算中心NOC及AIOps負責人 潘宇虹
《資料智慧時代:構建能力開放的運營商大資料DataOps體系》中國聯通大資料基礎平臺負責人/資深架構師 尹正軍
《雲時代下,傳統行業的運維轉型,如何破局?》新炬網路董事/副總經理 程永新
《銀行日誌監控系統最佳化手記》中國銀行DevOps負責人 付大亮和中國銀行 高階軟體工程師 李曉寧
《民生銀行智慧運維平臺實踐之路》民生銀行智慧運維平臺負責人/應用運維專家 張舒偉
讓我們在新技術的衝擊下站穩腳跟,攀登運維高峰!那麼2020年9月11日,我們在北京不見不散。
Gdevops全球敏捷運維峰會北京站:https://www.bagevent.com/event/6243820?bag_track=dbaplus