賈雪磊 方 巍 張 文
(1.南京信息工程大學(xué)計(jì)算機(jī)與軟件學(xué)院 南京 210044)
(2.中國氣象科學(xué)研究院災(zāi)害天氣國家重點(diǎn)實(shí)驗(yàn)室 北京 100081)
(3.南京信大氣象科學(xué)技術(shù)研究院有限公司 南京 210044)
分布式的服務(wù)日志有著兩個(gè)特點(diǎn),首先日志的數(shù)據(jù)量是海量的,大規(guī)模的系統(tǒng)每小時(shí)打印日志約50Gb(約1.2 億~2 億行)的量級[1];另外分布式系統(tǒng)產(chǎn)生的日志都是分散在不同的服務(wù)器目錄下。由于日志數(shù)據(jù)是海量且分散的,因此對整個(gè)分布式系統(tǒng)的日志進(jìn)行分析與異常檢測會(huì)比單機(jī)系統(tǒng)復(fù)雜很多。所以就需要有一種高效的日志采集和分析方法來幫助完成對日志的分析工作,從日志中發(fā)現(xiàn)異常來避免系統(tǒng)異常而造成的嚴(yán)重后果。
近年來,有許多的科研團(tuán)隊(duì)對日志異常檢測展開了相關(guān)研究工作,并且取得了很豐碩的成果。早在2004年Mike Chen[2]等學(xué)者提出了使用決策樹的方法對HDFS 日志進(jìn)行的錯(cuò)誤檢測。Yinglung Liang[3]團(tuán)隊(duì)使用SVM(Support Vector Machines,支持向量機(jī))對IBM BlueGene/L的日志數(shù)據(jù)進(jìn)行一個(gè)異常處理。文獻(xiàn)[4]提出了使用RNN(Recurrent Neural Network,循環(huán)神經(jīng)網(wǎng)絡(luò))對系統(tǒng)日志進(jìn)行異常檢測。Qingwei[5]團(tuán)隊(duì)提出了一個(gè)LogCluster的方法對服務(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,長短期記憶網(wǎng)絡(luò))的日志異常檢測模型DeepLog,這個(gè)模型通過學(xué)習(xí)大量的正常日志數(shù)據(jù),從中學(xué)習(xí)日志規(guī)則,當(dāng)檢測到新來的日志數(shù)據(jù)偏離了正常的日志規(guī)則,則認(rèn)定這條日志是一條異常日志。
常見的日志異常檢測的方法可以歸納為三個(gè)步驟[8]:1)日志采集和預(yù)處理;2)日志解析;3)異常檢測。整個(gè)日志異常檢測的流程圖見圖1所示。
圖1 常見日志檢測的流程圖
本文針對目前分布式系統(tǒng)中日志異常研究存在的一些問題提出了如下的三點(diǎn)研究創(chuàng)新。
1)在日志采集前加入預(yù)處理操作。先進(jìn)行預(yù)處理的好處是在一定程度上減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高整個(gè)異常檢測的效率。
2)使用分布式的消息中間件進(jìn)行日志的采集與傳輸。分布式消息中間件可以很好地應(yīng)對高頻率的大數(shù)據(jù)的需求。
3)在日志異常檢測階段,本文提出了基于GRU[9]深度網(wǎng)絡(luò)的日志異常檢測方法,相比文獻(xiàn)[6]提出的基于LSTM 的檢測方法,GRU 結(jié)構(gòu)更為簡單,所需訓(xùn)練樣本較少,具有輕量級與易實(shí)現(xiàn)的特點(diǎn)。
本文針對的是分布式系統(tǒng)的日志異常檢測問題,因此日志數(shù)據(jù)的高效收集是重點(diǎn)任務(wù)之一,也是進(jìn)行日志異常檢測之前必不可少的環(huán)節(jié)。
由于日志的數(shù)據(jù)量十分龐大,因此需要先進(jìn)行一個(gè)日志預(yù)處理,將日志數(shù)據(jù)中對日志異常檢測沒有幫助的信息進(jìn)行剔除,在一定程度上減少了需要進(jìn)行網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高整個(gè)異常檢測的效率。Filebeat 是一個(gè)輕量級的傳送器,可以用來對指定的日志文件或位置進(jìn)行日志的收集,通過使用配置參數(shù)exclude_lines 可以對收集的日志先進(jìn)行一個(gè)過濾。Filebeat 配置的輸出是Kafka,Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),具有高吞吐量、低延遲、持久性、高并發(fā)等特點(diǎn),十分適合對實(shí)時(shí)的日志進(jìn)行一個(gè)大數(shù)據(jù)量的傳輸。對不同機(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,對應(yīng)機(jī)器中的Filebeat將收集到的日志分別推送到本主機(jī)名命名的Topic中。這樣設(shè)計(jì)的很好地避免日志被隨意混合,形成“臟數(shù)據(jù)”。
最后使用Logstash 對Kafka 集群中的日志數(shù)據(jù)進(jìn)行消費(fèi)讀取與保存。Logstash是一個(gè)開源數(shù)據(jù)收集引擎,具有實(shí)時(shí)流水線功能,將日志規(guī)范化后輸出到指定位置進(jìn)行保存。總體的分布式日志預(yù)處理與收集的算法流程圖如圖3所示。
圖3 日志過濾與收集的算法流程圖
在本階段主要使用了三種消息中間件進(jìn)行日志的預(yù)處理、傳輸、接收與保存,且滿足大數(shù)據(jù)傳輸所需的高吞吐量,低延遲以及高可用等。
本文對日志異常檢測部分使用的方法是基于GRU 的深度學(xué)習(xí)檢測模型,對于日志異常檢測主要分為日志數(shù)據(jù)向量化處理,異常檢測模型的訓(xùn)練和日志異常檢測三個(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)練上千億詞??梢妛ord2vec 的效率是很高的。
另外word2vec 可以將相似度高的詞語通過在向量空間對應(yīng)詞向量的距離體現(xiàn)出來[14]。所以本文使用word2vec對日志序列進(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 升級了門限結(jié)構(gòu),將LSTM 里面的輸入門、遺忘門整合成一個(gè)更新門Zt,用Rt門替換了LSTM的輸入門,因此GRU網(wǎng)絡(luò)中的門的個(gè)數(shù)由LSTM中的3變成了2,有效地減少了總體參數(shù)的數(shù)量,縮短了訓(xùn)練時(shí)間。Zt主要是用來對新輸入信息的過往數(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)系,可以合理地對日志序列向量進(jìn)行一個(gè)異常檢測訓(xùn)練與檢測。
基于GRU 的日志異常檢測方法的總體流程圖以見圖5。通過以上對基于GRU 的日志異常檢測方法的闡述以及圖5 所表達(dá)的流程可知,在本階段主要對日志數(shù)據(jù)進(jìn)行向量化處理,GRU 網(wǎng)絡(luò)對日志序列進(jìn)行分類預(yù)測的訓(xùn)練,網(wǎng)絡(luò)的輸出再經(jīng)過Softmax[15]分類器進(jìn)行異常分類。
圖5 基于GRU的日志異常檢測算法流程圖
本文在實(shí)驗(yàn)環(huán)節(jié)使用三臺(tái)Centos 服務(wù)器組成Hadoop 分布式集群作為實(shí)驗(yàn)基礎(chǔ),利用Filebeat 與Kafka 對集群中HDFS(Hadoop Distributed File System)日志進(jìn)行預(yù)處理與收集,收集之后的日志經(jīng)過Logstash整理過濾生成待編碼日志。分布式集群和模型訓(xùn)練與測試的機(jī)器配置信息見表1。
表1 硬件與軟件環(huán)境配置表
日志收集與解析的實(shí)驗(yàn)部分所采用的分布式服務(wù)系統(tǒng)為3 個(gè)Hadoop 節(jié)點(diǎn)集群,主要是對HDFS所產(chǎn)生的日志文件進(jìn)行一個(gè)異常分析。使用Filebeat對日志的變化進(jìn)行監(jiān)控,并將新日志數(shù)據(jù)發(fā)送到libbeat,libbeat 將聚集事件,并將聚集的數(shù)據(jù)發(fā)送到Filebeat 配置的輸出接口。本文所使用的是Kafka 作為Filebeat的輸出。Kafka 中采用點(diǎn)對點(diǎn)的消息隊(duì)列模式,防止日志重復(fù)消費(fèi),造成網(wǎng)絡(luò)資源的浪費(fèi),同時(shí)根據(jù)不同的機(jī)器發(fā)布相對應(yīng)的主題,實(shí)現(xiàn)不同機(jī)器日志的單獨(dú)收集。
最后Logstash 進(jìn)行日志的消費(fèi)輸出到對應(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 配置信息中再對輸入進(jìn)行指定,就可以進(jìn)行日志消息的抓取,最后再統(tǒng)一輸出到保存目錄即可。
根據(jù)所設(shè)計(jì)的異常檢測算法,本文實(shí)現(xiàn)了基于GRU 的深度學(xué)習(xí)檢測模型,其模型結(jié)構(gòu)見圖6。針對本文所使用的基于GRU 的深度學(xué)習(xí)檢測模型,實(shí)驗(yàn)使用PyTorch來對模型的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行搭建以及實(shí)現(xiàn)。主要的模型與訓(xùn)練參數(shù)見表2。
圖6 基于GRU的日志異常檢測框架圖
表2 模型與訓(xùn)練參數(shù)
本文異常檢測的網(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)以及綜合評價(jià)指標(biāo)(F1-Measure)來評價(jià)模型的檢測效果,公式見式(8)~(10)。其中TP 正類判定為正類,F(xiàn)P 負(fù)類判定為正類,F(xiàn)N 正類判定為負(fù)類,TN負(fù)類判定為負(fù)類。
實(shí)驗(yàn)也分別使用近年來主流的一些方法進(jìn)行日志異常預(yù)測,比如LSTM[6]、Invariants Mining[16]以及PCA[17]。通過對比發(fā)現(xiàn)本文所使用的模型在綜合評價(jià)指標(biāo)方面比其他三種方法的檢測精度有顯著優(yōu)勢。最后的實(shí)驗(yàn)結(jié)果對比圖見圖7,具體的實(shí)驗(yàn)結(jié)果數(shù)據(jù)見表3,*標(biāo)表示本文使用的方法。
表3 實(shí)驗(yàn)結(jié)果對比
圖7 實(shí)驗(yàn)結(jié)果對比
通過實(shí)驗(yàn)結(jié)果得知GRU 在F1-measure 的標(biāo)準(zhǔn)下效果最好,這也驗(yàn)證了本文所使用的檢測模型是正確的。
本文提出了一種基于消息中間件與GRU 的異常檢測方法高效地對分布式系統(tǒng)中產(chǎn)生的日志進(jìn)行采集與異常識(shí)別,極大地幫助運(yùn)維人員了解系統(tǒng)的異常情況。在日志產(chǎn)生階段開始對日志進(jìn)行一個(gè)預(yù)處理與采集,根據(jù)分布式集群中機(jī)器名劃分Topic,防止日志造成混淆,最后將日志保存到本地的文件系統(tǒng)中。在日志收集與解析之后就需要對日志進(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)了日志的異常情況的檢測。通過對比同為循環(huán)神經(jīng)網(wǎng)絡(luò)的LSTM 以及其他基于機(jī)器學(xué)習(xí)的檢測方法,最后根據(jù)實(shí)驗(yàn)數(shù)據(jù)對比可以看出,本文所使用的GRU 模型的效果更好。接下來的工作是嘗試適應(yīng)不同的分布式系統(tǒng)以及考慮在檢測模型中加入注意力機(jī)制等,對Spark,F(xiàn)link[19]等系統(tǒng)的日志進(jìn)行異常分析,提高本文方法的普適性。