賈雪磊 方 巍 張 文
(1.南京信息工程大學(xué)計(jì)算機(jī)與軟件學(xué)院 南京 210044)
(2.中國(guó)氣象科學(xué)研究院災(zāi)害天氣國(guó)家重點(diǎn)實(shí)驗(yàn)室 北京 100081)
(3.南京信大氣象科學(xué)技術(shù)研究院有限公司 南京 210044)
分布式的服務(wù)日志有著兩個(gè)特點(diǎn),首先日志的數(shù)據(jù)量是海量的,大規(guī)模的系統(tǒng)每小時(shí)打印日志約50Gb(約1.2 億~2 億行)的量級(jí)[1];另外分布式系統(tǒng)產(chǎn)生的日志都是分散在不同的服務(wù)器目錄下。由于日志數(shù)據(jù)是海量且分散的,因此對(duì)整個(gè)分布式系統(tǒng)的日志進(jìn)行分析與異常檢測(cè)會(huì)比單機(jī)系統(tǒng)復(fù)雜很多。所以就需要有一種高效的日志采集和分析方法來幫助完成對(duì)日志的分析工作,從日志中發(fā)現(xiàn)異常來避免系統(tǒng)異常而造成的嚴(yán)重后果。
近年來,有許多的科研團(tuán)隊(duì)對(duì)日志異常檢測(cè)展開了相關(guān)研究工作,并且取得了很豐碩的成果。早在2004年Mike Chen[2]等學(xué)者提出了使用決策樹的方法對(duì)HDFS 日志進(jìn)行的錯(cuò)誤檢測(cè)。Yinglung Liang[3]團(tuán)隊(duì)使用SVM(Support Vector Machines,支持向量機(jī))對(duì)IBM BlueGene/L的日志數(shù)據(jù)進(jìn)行一個(gè)異常處理。文獻(xiàn)[4]提出了使用RNN(Recurrent Neural Network,循環(huán)神經(jīng)網(wǎng)絡(luò))對(duì)系統(tǒng)日志進(jìn)行異常檢測(cè)。Qingwei[5]團(tuán)隊(duì)提出了一個(gè)LogCluster的方法對(duì)服務(wù)系統(tǒng)進(jìn)行一個(gè)日志錯(cuò)誤識(shí)別。最近幾年深度學(xué)習(xí)飛速發(fā)展,許多研究日志異常的團(tuán)隊(duì)將目光轉(zhuǎn)向了深度學(xué)習(xí)領(lǐng)域,其中Feifei Li[6]團(tuán)隊(duì)提出了一種基于LSTM[7](Long Short-Term Memory,長(zhǎng)短期記憶網(wǎng)絡(luò))的日志異常檢測(cè)模型DeepLog,這個(gè)模型通過學(xué)習(xí)大量的正常日志數(shù)據(jù),從中學(xué)習(xí)日志規(guī)則,當(dāng)檢測(cè)到新來的日志數(shù)據(jù)偏離了正常的日志規(guī)則,則認(rèn)定這條日志是一條異常日志。
常見的日志異常檢測(cè)的方法可以歸納為三個(gè)步驟[8]:1)日志采集和預(yù)處理;2)日志解析;3)異常檢測(cè)。整個(gè)日志異常檢測(cè)的流程圖見圖1所示。

圖1 常見日志檢測(cè)的流程圖
本文針對(duì)目前分布式系統(tǒng)中日志異常研究存在的一些問題提出了如下的三點(diǎn)研究創(chuàng)新。
1)在日志采集前加入預(yù)處理操作。先進(jìn)行預(yù)處理的好處是在一定程度上減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高整個(gè)異常檢測(cè)的效率。
2)使用分布式的消息中間件進(jìn)行日志的采集與傳輸。分布式消息中間件可以很好地應(yīng)對(duì)高頻率的大數(shù)據(jù)的需求。
3)在日志異常檢測(cè)階段,本文提出了基于GRU[9]深度網(wǎng)絡(luò)的日志異常檢測(cè)方法,相比文獻(xiàn)[6]提出的基于LSTM 的檢測(cè)方法,GRU 結(jié)構(gòu)更為簡(jiǎn)單,所需訓(xùn)練樣本較少,具有輕量級(jí)與易實(shí)現(xiàn)的特點(diǎn)。
本文針對(duì)的是分布式系統(tǒng)的日志異常檢測(cè)問題,因此日志數(shù)據(jù)的高效收集是重點(diǎn)任務(wù)之一,也是進(jìn)行日志異常檢測(cè)之前必不可少的環(huán)節(jié)。
由于日志的數(shù)據(jù)量十分龐大,因此需要先進(jìn)行一個(gè)日志預(yù)處理,將日志數(shù)據(jù)中對(duì)日志異常檢測(cè)沒有幫助的信息進(jìn)行剔除,在一定程度上減少了需要進(jìn)行網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高整個(gè)異常檢測(cè)的效率。Filebeat 是一個(gè)輕量級(jí)的傳送器,可以用來對(duì)指定的日志文件或位置進(jìn)行日志的收集,通過使用配置參數(shù)exclude_lines 可以對(duì)收集的日志先進(jìn)行一個(gè)過濾。Filebeat 配置的輸出是Kafka,Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),具有高吞吐量、低延遲、持久性、高并發(fā)等特點(diǎn),十分適合對(duì)實(shí)時(shí)的日志進(jìn)行一個(gè)大數(shù)據(jù)量的傳輸。對(duì)不同機(jī)器的日志按不同Topic 進(jìn)行傳輸,使得日志流數(shù)據(jù)不會(huì)產(chǎn)生混合變成“臟數(shù)據(jù)”[10]。日志流按照Topic發(fā)布的架構(gòu)圖見圖2。

圖2 日志流按照Topic發(fā)布架構(gòu)圖
本文所采用的分布式集群中有三個(gè)主機(jī),主機(jī)名為Hadoop1、Hadoop2、Hadoop3,對(duì)應(yīng)機(jī)器中的Filebeat將收集到的日志分別推送到本主機(jī)名命名的Topic中。這樣設(shè)計(jì)的很好地避免日志被隨意混合,形成“臟數(shù)據(jù)”。
最后使用Logstash 對(duì)Kafka 集群中的日志數(shù)據(jù)進(jìn)行消費(fèi)讀取與保存。Logstash是一個(gè)開源數(shù)據(jù)收集引擎,具有實(shí)時(shí)流水線功能,將日志規(guī)范化后輸出到指定位置進(jìn)行保存。總體的分布式日志預(yù)處理與收集的算法流程圖如圖3所示。

圖3 日志過濾與收集的算法流程圖
在本階段主要使用了三種消息中間件進(jìn)行日志的預(yù)處理、傳輸、接收與保存,且滿足大數(shù)據(jù)傳輸所需的高吞吐量,低延遲以及高可用等。
本文對(duì)日志異常檢測(cè)部分使用的方法是基于GRU 的深度學(xué)習(xí)檢測(cè)模型,對(duì)于日志異常檢測(cè)主要分為日志數(shù)據(jù)向量化處理,異常檢測(cè)模型的訓(xùn)練和日志異常檢測(cè)三個(gè)部分。文本數(shù)據(jù)向矩陣向量化 轉(zhuǎn) 換 的 方 法 有word2vec[11](word to vector),TF-IDF[12],one-hot[13]等。word2vec 可以通過淺層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練一個(gè)權(quán)重矩陣如式(1)所示,來將獨(dú)熱編碼所得的高維數(shù)稀疏矩陣如式(2)所示,轉(zhuǎn)化為低維數(shù)的稠密向量矩陣如式(3)所示。Mikolov 在文獻(xiàn)[11]中指出一個(gè)優(yōu)化的單機(jī)版本一天可訓(xùn)練上千億詞。可見word2vec 的效率是很高的。

另外word2vec 可以將相似度高的詞語通過在向量空間對(duì)應(yīng)詞向量的距離體現(xiàn)出來[14]。所以本文使用word2vec對(duì)日志序列進(jìn)行詞向量的構(gòu)建,并作為GRU神經(jīng)網(wǎng)絡(luò)的輸入。
GRU 與LSTM 都為循環(huán)神經(jīng)網(wǎng)絡(luò)的變種,單個(gè)GRU 網(wǎng)絡(luò)的結(jié)構(gòu)見圖4。GRU 升級(jí)了門限結(jié)構(gòu),將LSTM 里面的輸入門、遺忘門整合成一個(gè)更新門Zt,用Rt門替換了LSTM的輸入門,因此GRU網(wǎng)絡(luò)中的門的個(gè)數(shù)由LSTM中的3變成了2,有效地減少了總體參數(shù)的數(shù)量,縮短了訓(xùn)練時(shí)間。Zt主要是用來對(duì)新輸入信息的過往數(shù)據(jù)進(jìn)行歸納,Rt主要是決定前一步驟中狀態(tài)信息輸入模型的概率。

圖4 單個(gè)GRU網(wǎng)絡(luò)結(jié)構(gòu)圖

式(6)中為上一個(gè)單元的隱藏層狀態(tài),輸入為Xt,重置門Rt,更新門Zt,候選隱狀態(tài)H?t,重置門Rt決定了如何將新的輸入信息與前面的記憶相結(jié)合,更新門Zt定義了前面記憶保存到當(dāng)前時(shí)間步的量。如果本文將重置門Rt設(shè)置為1,更新門設(shè)置為0,那么本文將獲得標(biāo)準(zhǔn)RNN 模型。根據(jù)式(7)可以看出當(dāng)前狀態(tài)的隱狀態(tài)的輸出取決于當(dāng)前的輸入與之前的隱藏層的輸入。所以最后的輸入是依賴當(dāng)前的輸入向量與之前的輸入,可以很好地處理日志上下文之間的關(guān)系,可以合理地對(duì)日志序列向量進(jìn)行一個(gè)異常檢測(cè)訓(xùn)練與檢測(cè)。
基于GRU 的日志異常檢測(cè)方法的總體流程圖以見圖5。通過以上對(duì)基于GRU 的日志異常檢測(cè)方法的闡述以及圖5 所表達(dá)的流程可知,在本階段主要對(duì)日志數(shù)據(jù)進(jìn)行向量化處理,GRU 網(wǎng)絡(luò)對(duì)日志序列進(jìn)行分類預(yù)測(cè)的訓(xùn)練,網(wǎng)絡(luò)的輸出再經(jīng)過Softmax[15]分類器進(jìn)行異常分類。

圖5 基于GRU的日志異常檢測(cè)算法流程圖
本文在實(shí)驗(yàn)環(huán)節(jié)使用三臺(tái)Centos 服務(wù)器組成Hadoop 分布式集群作為實(shí)驗(yàn)基礎(chǔ),利用Filebeat 與Kafka 對(duì)集群中HDFS(Hadoop Distributed File System)日志進(jìn)行預(yù)處理與收集,收集之后的日志經(jīng)過Logstash整理過濾生成待編碼日志。分布式集群和模型訓(xùn)練與測(cè)試的機(jī)器配置信息見表1。

表1 硬件與軟件環(huán)境配置表
日志收集與解析的實(shí)驗(yàn)部分所采用的分布式服務(wù)系統(tǒng)為3 個(gè)Hadoop 節(jié)點(diǎn)集群,主要是對(duì)HDFS所產(chǎn)生的日志文件進(jìn)行一個(gè)異常分析。使用Filebeat對(duì)日志的變化進(jìn)行監(jiān)控,并將新日志數(shù)據(jù)發(fā)送到libbeat,libbeat 將聚集事件,并將聚集的數(shù)據(jù)發(fā)送到Filebeat 配置的輸出接口。本文所使用的是Kafka 作為Filebeat的輸出。Kafka 中采用點(diǎn)對(duì)點(diǎn)的消息隊(duì)列模式,防止日志重復(fù)消費(fèi),造成網(wǎng)絡(luò)資源的浪費(fèi),同時(shí)根據(jù)不同的機(jī)器發(fā)布相對(duì)應(yīng)的主題,實(shí)現(xiàn)不同機(jī)器日志的單獨(dú)收集。
最后Logstash 進(jìn)行日志的消費(fèi)輸出到對(duì)應(yīng)的日志文件中進(jìn)行保存。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 配置信息中再對(duì)輸入進(jìn)行指定,就可以進(jìn)行日志消息的抓取,最后再統(tǒng)一輸出到保存目錄即可。
根據(jù)所設(shè)計(jì)的異常檢測(cè)算法,本文實(shí)現(xiàn)了基于GRU 的深度學(xué)習(xí)檢測(cè)模型,其模型結(jié)構(gòu)見圖6。針對(duì)本文所使用的基于GRU 的深度學(xué)習(xí)檢測(cè)模型,實(shí)驗(yàn)使用PyTorch來對(duì)模型的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行搭建以及實(shí)現(xiàn)。主要的模型與訓(xùn)練參數(shù)見表2。

圖6 基于GRU的日志異常檢測(cè)框架圖

表2 模型與訓(xùn)練參數(shù)
本文異常檢測(cè)的網(wǎng)絡(luò)模型的訓(xùn)練數(shù)據(jù)集是亞馬遜公開的11,175,629條HDFS日志,數(shù)據(jù)集的分類標(biāo)簽已由亞馬遜的分布式系統(tǒng)專家標(biāo)記是否為異常日志。
實(shí)驗(yàn)采用準(zhǔn)確率(Precision)、召回率(Recall)以及綜合評(píng)價(jià)指標(biāo)(F1-Measure)來評(píng)價(jià)模型的檢測(cè)效果,公式見式(8)~(10)。其中TP 正類判定為正類,F(xiàn)P 負(fù)類判定為正類,F(xiàn)N 正類判定為負(fù)類,TN負(fù)類判定為負(fù)類。

實(shí)驗(yàn)也分別使用近年來主流的一些方法進(jìn)行日志異常預(yù)測(cè),比如LSTM[6]、Invariants Mining[16]以及PCA[17]。通過對(duì)比發(fā)現(xiàn)本文所使用的模型在綜合評(píng)價(jià)指標(biāo)方面比其他三種方法的檢測(cè)精度有顯著優(yōu)勢(shì)。最后的實(shí)驗(yàn)結(jié)果對(duì)比圖見圖7,具體的實(shí)驗(yàn)結(jié)果數(shù)據(jù)見表3,*標(biāo)表示本文使用的方法。

表3 實(shí)驗(yàn)結(jié)果對(duì)比

圖7 實(shí)驗(yàn)結(jié)果對(duì)比
通過實(shí)驗(yàn)結(jié)果得知GRU 在F1-measure 的標(biāo)準(zhǔn)下效果最好,這也驗(yàn)證了本文所使用的檢測(cè)模型是正確的。
本文提出了一種基于消息中間件與GRU 的異常檢測(cè)方法高效地對(duì)分布式系統(tǒng)中產(chǎn)生的日志進(jìn)行采集與異常識(shí)別,極大地幫助運(yùn)維人員了解系統(tǒng)的異常情況。在日志產(chǎn)生階段開始對(duì)日志進(jìn)行一個(gè)預(yù)處理與采集,根據(jù)分布式集群中機(jī)器名劃分Topic,防止日志造成混淆,最后將日志保存到本地的文件系統(tǒng)中。在日志收集與解析之后就需要對(duì)日志進(jìn)行一個(gè)異常識(shí)別。本文使用word2vec 進(jìn)行詞向量的構(gòu)建[18],word2vec 輸出的向量矩陣輸入GRU 網(wǎng)絡(luò),經(jīng)由兩層GRU 單元組成的GRU 網(wǎng)絡(luò)得到其輸出,隨后將其輸入到全連接層經(jīng)過Softmax分類器,得到的結(jié)果分為正常和不正常兩種情況,實(shí)現(xiàn)了日志的異常情況的檢測(cè)。通過對(duì)比同為循環(huán)神經(jīng)網(wǎng)絡(luò)的LSTM 以及其他基于機(jī)器學(xué)習(xí)的檢測(cè)方法,最后根據(jù)實(shí)驗(yàn)數(shù)據(jù)對(duì)比可以看出,本文所使用的GRU 模型的效果更好。接下來的工作是嘗試適應(yīng)不同的分布式系統(tǒng)以及考慮在檢測(cè)模型中加入注意力機(jī)制等,對(duì)Spark,F(xiàn)link[19]等系統(tǒng)的日志進(jìn)行異常分析,提高本文方法的普適性。