賈雪磊 方 巍 張 文
(1.南京信息工程大學計算機與軟件學院 南京 210044)
(2.中國氣象科學研究院災害天氣國家重點實驗室 北京 100081)
(3.南京信大氣象科學技術研究院有限公司 南京 210044)
分布式的服務日志有著兩個特點,首先日志的數(shù)據(jù)量是海量的,大規(guī)模的系統(tǒng)每小時打印日志約50Gb(約1.2 億~2 億行)的量級[1];另外分布式系統(tǒng)產(chǎn)生的日志都是分散在不同的服務器目錄下。由于日志數(shù)據(jù)是海量且分散的,因此對整個分布式系統(tǒng)的日志進行分析與異常檢測會比單機系統(tǒng)復雜很多。所以就需要有一種高效的日志采集和分析方法來幫助完成對日志的分析工作,從日志中發(fā)現(xiàn)異常來避免系統(tǒng)異常而造成的嚴重后果。
近年來,有許多的科研團隊對日志異常檢測展開了相關研究工作,并且取得了很豐碩的成果。早在2004年Mike Chen[2]等學者提出了使用決策樹的方法對HDFS 日志進行的錯誤檢測。Yinglung Liang[3]團隊使用SVM(Support Vector Machines,支持向量機)對IBM BlueGene/L的日志數(shù)據(jù)進行一個異常處理。文獻[4]提出了使用RNN(Recurrent Neural Network,循環(huán)神經(jīng)網(wǎng)絡)對系統(tǒng)日志進行異常檢測。Qingwei[5]團隊提出了一個LogCluster的方法對服務系統(tǒng)進行一個日志錯誤識別。最近幾年深度學習飛速發(fā)展,許多研究日志異常的團隊將目光轉(zhuǎn)向了深度學習領域,其中Feifei Li[6]團隊提出了一種基于LSTM[7](Long Short-Term Memory,長短期記憶網(wǎng)絡)的日志異常檢測模型DeepLog,這個模型通過學習大量的正常日志數(shù)據(jù),從中學習日志規(guī)則,當檢測到新來的日志數(shù)據(jù)偏離了正常的日志規(guī)則,則認定這條日志是一條異常日志。
常見的日志異常檢測的方法可以歸納為三個步驟[8]:1)日志采集和預處理;2)日志解析;3)異常檢測。整個日志異常檢測的流程圖見圖1所示。
圖1 常見日志檢測的流程圖
本文針對目前分布式系統(tǒng)中日志異常研究存在的一些問題提出了如下的三點研究創(chuàng)新。
1)在日志采集前加入預處理操作。先進行預處理的好處是在一定程度上減少網(wǎng)絡傳輸?shù)臄?shù)據(jù)量,提高整個異常檢測的效率。
2)使用分布式的消息中間件進行日志的采集與傳輸。分布式消息中間件可以很好地應對高頻率的大數(shù)據(jù)的需求。
3)在日志異常檢測階段,本文提出了基于GRU[9]深度網(wǎng)絡的日志異常檢測方法,相比文獻[6]提出的基于LSTM 的檢測方法,GRU 結構更為簡單,所需訓練樣本較少,具有輕量級與易實現(xiàn)的特點。
本文針對的是分布式系統(tǒng)的日志異常檢測問題,因此日志數(shù)據(jù)的高效收集是重點任務之一,也是進行日志異常檢測之前必不可少的環(huán)節(jié)。
由于日志的數(shù)據(jù)量十分龐大,因此需要先進行一個日志預處理,將日志數(shù)據(jù)中對日志異常檢測沒有幫助的信息進行剔除,在一定程度上減少了需要進行網(wǎng)絡傳輸?shù)臄?shù)據(jù)量,提高整個異常檢測的效率。Filebeat 是一個輕量級的傳送器,可以用來對指定的日志文件或位置進行日志的收集,通過使用配置參數(shù)exclude_lines 可以對收集的日志先進行一個過濾。Filebeat 配置的輸出是Kafka,Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),具有高吞吐量、低延遲、持久性、高并發(fā)等特點,十分適合對實時的日志進行一個大數(shù)據(jù)量的傳輸。對不同機器的日志按不同Topic 進行傳輸,使得日志流數(shù)據(jù)不會產(chǎn)生混合變成“臟數(shù)據(jù)”[10]。日志流按照Topic發(fā)布的架構圖見圖2。
圖2 日志流按照Topic發(fā)布架構圖
本文所采用的分布式集群中有三個主機,主機名為Hadoop1、Hadoop2、Hadoop3,對應機器中的Filebeat將收集到的日志分別推送到本主機名命名的Topic中。這樣設計的很好地避免日志被隨意混合,形成“臟數(shù)據(jù)”。
最后使用Logstash 對Kafka 集群中的日志數(shù)據(jù)進行消費讀取與保存。Logstash是一個開源數(shù)據(jù)收集引擎,具有實時流水線功能,將日志規(guī)范化后輸出到指定位置進行保存??傮w的分布式日志預處理與收集的算法流程圖如圖3所示。
圖3 日志過濾與收集的算法流程圖
在本階段主要使用了三種消息中間件進行日志的預處理、傳輸、接收與保存,且滿足大數(shù)據(jù)傳輸所需的高吞吐量,低延遲以及高可用等。
本文對日志異常檢測部分使用的方法是基于GRU 的深度學習檢測模型,對于日志異常檢測主要分為日志數(shù)據(jù)向量化處理,異常檢測模型的訓練和日志異常檢測三個部分。文本數(shù)據(jù)向矩陣向量化 轉(zhuǎn) 換 的 方 法 有word2vec[11](word to vector),TF-IDF[12],one-hot[13]等。word2vec 可以通過淺層的神經(jīng)網(wǎng)絡結構訓練一個權重矩陣如式(1)所示,來將獨熱編碼所得的高維數(shù)稀疏矩陣如式(2)所示,轉(zhuǎn)化為低維數(shù)的稠密向量矩陣如式(3)所示。Mikolov 在文獻[11]中指出一個優(yōu)化的單機版本一天可訓練上千億詞。可見word2vec 的效率是很高的。
另外word2vec 可以將相似度高的詞語通過在向量空間對應詞向量的距離體現(xiàn)出來[14]。所以本文使用word2vec對日志序列進行詞向量的構建,并作為GRU神經(jīng)網(wǎng)絡的輸入。
GRU 與LSTM 都為循環(huán)神經(jīng)網(wǎng)絡的變種,單個GRU 網(wǎng)絡的結構見圖4。GRU 升級了門限結構,將LSTM 里面的輸入門、遺忘門整合成一個更新門Zt,用Rt門替換了LSTM的輸入門,因此GRU網(wǎng)絡中的門的個數(shù)由LSTM中的3變成了2,有效地減少了總體參數(shù)的數(shù)量,縮短了訓練時間。Zt主要是用來對新輸入信息的過往數(shù)據(jù)進行歸納,Rt主要是決定前一步驟中狀態(tài)信息輸入模型的概率。
圖4 單個GRU網(wǎng)絡結構圖
式(6)中為上一個單元的隱藏層狀態(tài),輸入為Xt,重置門Rt,更新門Zt,候選隱狀態(tài)H?t,重置門Rt決定了如何將新的輸入信息與前面的記憶相結合,更新門Zt定義了前面記憶保存到當前時間步的量。如果本文將重置門Rt設置為1,更新門設置為0,那么本文將獲得標準RNN 模型。根據(jù)式(7)可以看出當前狀態(tài)的隱狀態(tài)的輸出取決于當前的輸入與之前的隱藏層的輸入。所以最后的輸入是依賴當前的輸入向量與之前的輸入,可以很好地處理日志上下文之間的關系,可以合理地對日志序列向量進行一個異常檢測訓練與檢測。
基于GRU 的日志異常檢測方法的總體流程圖以見圖5。通過以上對基于GRU 的日志異常檢測方法的闡述以及圖5 所表達的流程可知,在本階段主要對日志數(shù)據(jù)進行向量化處理,GRU 網(wǎng)絡對日志序列進行分類預測的訓練,網(wǎng)絡的輸出再經(jīng)過Softmax[15]分類器進行異常分類。
圖5 基于GRU的日志異常檢測算法流程圖
本文在實驗環(huán)節(jié)使用三臺Centos 服務器組成Hadoop 分布式集群作為實驗基礎,利用Filebeat 與Kafka 對集群中HDFS(Hadoop Distributed File System)日志進行預處理與收集,收集之后的日志經(jīng)過Logstash整理過濾生成待編碼日志。分布式集群和模型訓練與測試的機器配置信息見表1。
表1 硬件與軟件環(huán)境配置表
日志收集與解析的實驗部分所采用的分布式服務系統(tǒng)為3 個Hadoop 節(jié)點集群,主要是對HDFS所產(chǎn)生的日志文件進行一個異常分析。使用Filebeat對日志的變化進行監(jiān)控,并將新日志數(shù)據(jù)發(fā)送到libbeat,libbeat 將聚集事件,并將聚集的數(shù)據(jù)發(fā)送到Filebeat 配置的輸出接口。本文所使用的是Kafka 作為Filebeat的輸出。Kafka 中采用點對點的消息隊列模式,防止日志重復消費,造成網(wǎng)絡資源的浪費,同時根據(jù)不同的機器發(fā)布相對應的主題,實現(xiàn)不同機器日志的單獨收集。
最后Logstash 進行日志的消費輸出到對應的日志文件中進行保存。Filebeat 與Logstash 的配置文件信息如下。
filebeat.inputs:
-type:log
enabled:true
paths:
-/var/log/*。log
output.kafka:
enabled:true hosts:[“192.168.10.10:9092”,“192.168.10.11:9092”,“192.168.10.12:9092”]
topic:hadoop100
input{
kafka{
bootstrap_servers=> [ “192.168.10.10: 9092,192.168.10.11:9092,192.168.10.12:9092”]
topics=>[“hadoop100”]
group_id=>“filebeat-logstash”
}}
output{
file{
path=>“/tmp/logstash.output”
}}
在Filebeat的配置中path用來指定要監(jiān)控的日志目錄,通配符*表示監(jiān)控所有后綴名為.log的日志文件,output 指定為Kafka 輸出。Logstash 配置信息中再對輸入進行指定,就可以進行日志消息的抓取,最后再統(tǒng)一輸出到保存目錄即可。
根據(jù)所設計的異常檢測算法,本文實現(xiàn)了基于GRU 的深度學習檢測模型,其模型結構見圖6。針對本文所使用的基于GRU 的深度學習檢測模型,實驗使用PyTorch來對模型的網(wǎng)絡結構進行搭建以及實現(xiàn)。主要的模型與訓練參數(shù)見表2。
圖6 基于GRU的日志異常檢測框架圖
表2 模型與訓練參數(shù)
本文異常檢測的網(wǎng)絡模型的訓練數(shù)據(jù)集是亞馬遜公開的11,175,629條HDFS日志,數(shù)據(jù)集的分類標簽已由亞馬遜的分布式系統(tǒng)專家標記是否為異常日志。
實驗采用準確率(Precision)、召回率(Recall)以及綜合評價指標(F1-Measure)來評價模型的檢測效果,公式見式(8)~(10)。其中TP 正類判定為正類,F(xiàn)P 負類判定為正類,F(xiàn)N 正類判定為負類,TN負類判定為負類。
實驗也分別使用近年來主流的一些方法進行日志異常預測,比如LSTM[6]、Invariants Mining[16]以及PCA[17]。通過對比發(fā)現(xiàn)本文所使用的模型在綜合評價指標方面比其他三種方法的檢測精度有顯著優(yōu)勢。最后的實驗結果對比圖見圖7,具體的實驗結果數(shù)據(jù)見表3,*標表示本文使用的方法。
表3 實驗結果對比
圖7 實驗結果對比
通過實驗結果得知GRU 在F1-measure 的標準下效果最好,這也驗證了本文所使用的檢測模型是正確的。
本文提出了一種基于消息中間件與GRU 的異常檢測方法高效地對分布式系統(tǒng)中產(chǎn)生的日志進行采集與異常識別,極大地幫助運維人員了解系統(tǒng)的異常情況。在日志產(chǎn)生階段開始對日志進行一個預處理與采集,根據(jù)分布式集群中機器名劃分Topic,防止日志造成混淆,最后將日志保存到本地的文件系統(tǒng)中。在日志收集與解析之后就需要對日志進行一個異常識別。本文使用word2vec 進行詞向量的構建[18],word2vec 輸出的向量矩陣輸入GRU 網(wǎng)絡,經(jīng)由兩層GRU 單元組成的GRU 網(wǎng)絡得到其輸出,隨后將其輸入到全連接層經(jīng)過Softmax分類器,得到的結果分為正常和不正常兩種情況,實現(xiàn)了日志的異常情況的檢測。通過對比同為循環(huán)神經(jīng)網(wǎng)絡的LSTM 以及其他基于機器學習的檢測方法,最后根據(jù)實驗數(shù)據(jù)對比可以看出,本文所使用的GRU 模型的效果更好。接下來的工作是嘗試適應不同的分布式系統(tǒng)以及考慮在檢測模型中加入注意力機制等,對Spark,F(xiàn)link[19]等系統(tǒng)的日志進行異常分析,提高本文方法的普適性。