喻學(xué)軍 肖蓓
(福建師范大學(xué)數(shù)學(xué)與信息學(xué)院,福建福州 350007)
復(fù)雜事件處理(Complex Event Process)是一組已定義的工具和技術(shù),用于分析和控制驅(qū)動(dòng)現(xiàn)代分布式信息系統(tǒng)的一系列相互關(guān)聯(lián)的復(fù)雜事件[1]。決策支持系統(tǒng)有很多種形式,其中一種就包括復(fù)雜事件處理,從簡單事件流中推導(dǎo)出復(fù)雜決策是CEP提供的基本能力。簡單事件可能觸發(fā)系統(tǒng)中的狀態(tài)轉(zhuǎn)換,通過與預(yù)定義的事件模式進(jìn)行對(duì)比,可以了解復(fù)雜事件的關(guān)系。復(fù)雜事件處理引擎將外部收集到的事件流作為輸入,并對(duì)其進(jìn)行連續(xù)和及時(shí)的處理,以關(guān)注更高層次的事件中發(fā)生了什么。例如:網(wǎng)絡(luò)入侵檢測系統(tǒng)實(shí)時(shí)分析網(wǎng)絡(luò)流量,以確定可能的攻擊;環(huán)境檢測應(yīng)用處理來自傳感器網(wǎng)絡(luò)的原始數(shù)據(jù),以確定污染的程度[2]。復(fù)雜事件處理技術(shù)可以作為一種解決方法廣泛應(yīng)用在決策支持,大數(shù)據(jù)分析等領(lǐng)域。
Esper是一種用于復(fù)雜事件處理(CEP)和流分析的引擎[3],具有可擴(kuò)展性強(qiáng),內(nèi)存效率高,內(nèi)存計(jì)算,低延遲,高吞吐,實(shí)時(shí)流處理的特點(diǎn),用于在線和離線數(shù)據(jù)的事件分析。Esper提供了一種事件處理語言(EPL),它是一種用于處理基于時(shí)間的高頻事件數(shù)據(jù)的聲明性語言,實(shí)現(xiàn)和擴(kuò)展sql標(biāo)準(zhǔn),并支持針對(duì)事件和時(shí)間的豐富表達(dá)式。同時(shí),Esper可以在單機(jī)和分布式環(huán)境中運(yùn)行,不依賴外部環(huán)境。Esper能夠應(yīng)用在業(yè)務(wù)過程管理和自動(dòng)化、金融、網(wǎng)絡(luò)和應(yīng)用程序監(jiān)控以及傳感器網(wǎng)絡(luò)等領(lǐng)域。
事件是已經(jīng)發(fā)生的事實(shí),新的事件只能夠添加到事件流中,而不能從事件流中移除。在Esper中,流(Stream)是CEP的主要構(gòu)建模塊。Esper引擎中的計(jì)算執(zhí)行是以事件流作為基礎(chǔ),并使用標(biāo)準(zhǔn)表達(dá)式描述關(guān)注的事件模式,在Esper中,標(biāo)準(zhǔn)表達(dá)式稱為事件處理語言(Event Processing Language)。EPL語句允許指定關(guān)注的事件模式,并將其部署到Esper復(fù)雜事件處理引擎上,Esper將流定義為按時(shí)間排序的事件序列。首先,將簡單事件流輸入到Esper引擎中;隨后,Esper引擎執(zhí)行一系列轉(zhuǎn)換,以確定是否滿足感興趣的事件模式(例如:用于檢測違反某條規(guī)則)。EPL是一種用于處理基于時(shí)間的高頻事件數(shù)據(jù)的聲明性語言,實(shí)現(xiàn)和擴(kuò)展sql標(biāo)準(zhǔn),并支持針對(duì)事件和時(shí)間的表達(dá)式,EPL的構(gòu)造器允許構(gòu)建復(fù)雜且相互關(guān)聯(lián)的查詢語句,這些查詢語句將展示系統(tǒng)中隱式發(fā)生的復(fù)雜事件。EPL的基本語法如下所示:
在EPL中的select語句指定要在目標(biāo)表達(dá)式中檢索的事件屬性或事件;From語句指定要使用的事件流定義和事件名稱;where子句指定搜索條件,這些條件指定要搜索的事件或事件組合;可選的window語句指定事件時(shí)間和事件數(shù)量。除了以上這些,EPL還提供了內(nèi)連接、外連接等操作。
在Esper引擎中,事件輸入的類型可以是java對(duì)象、Map接口的實(shí)現(xiàn)、JSON格式的文檔、Object數(shù)組、Avro或者XML文檔,Esper支持所有事件類型的繼承和多態(tài),事件可以包含簡單類型的屬性、索引類型的屬性、映射類型的屬性、嵌套類型的屬性以及動(dòng)態(tài)類型的屬性。
Esper提供一種數(shù)據(jù)窗口,包括滑動(dòng)窗口,滾動(dòng)窗口以及組合窗口。數(shù)據(jù)窗口用于管理事件保留在引擎中的時(shí)間,通知引擎對(duì)關(guān)注的事件需要保留多長時(shí)間,或者滿足特定條件,引擎將丟棄事件。比如:引擎使用時(shí)間窗口對(duì)所有事件保留10s。在Esper中,命名窗口是全局可見的窗口,允許在查詢時(shí)有效地共享事件集,使得用戶不需要重復(fù)保存同一個(gè)事件。表在Esper中是一種全局的數(shù)據(jù)結(jié)構(gòu),用來保存事件的聚合狀態(tài),同時(shí)可以直接對(duì)事件進(jìn)行更新。Esper通過對(duì)事件一系列的操作(如聚合、排序、過濾等) 分析流事件以及歷史事件。同時(shí),Esper面對(duì)大量連續(xù)查詢具有良好的伸縮性(比如從同一個(gè)輸入流中有10000個(gè)查詢,檢查某個(gè)事件的特定屬性(年齡)位于某個(gè)區(qū)間,此時(shí),Esper會(huì)創(chuàng)建一棵決策樹,因此事件的評(píng)估時(shí)間只有l(wèi)og N,最壞的情況也是O(N))。除了以上特點(diǎn),Esper還具有并行化處理查詢、支持外部傳入的時(shí)間以及系統(tǒng)的時(shí)間,并在運(yùn)行時(shí)添加和刪除查詢等特點(diǎn)。
使用不同規(guī)模事件日志評(píng)估Esper的時(shí)間性能和內(nèi)存消耗。實(shí)驗(yàn)的環(huán)境為:Esper(5.0.0),eclipse IDE(2018-12),visualvm(2.0.2)內(nèi)存監(jiān)控工具。運(yùn)行環(huán)境為:64位Win10操作系統(tǒng)、8G內(nèi)存、i7-8750H的筆記本。
2.1.1 執(zhí)行時(shí)間
執(zhí)行時(shí)間是指觸發(fā)事件集中第一個(gè)事件發(fā)送到Esper引擎中到最后一個(gè)事件計(jì)算完畢,檢測復(fù)雜事件所花費(fèi)的時(shí)間。在本文設(shè)置中是以毫秒(ms)為時(shí)間單位,在匹配語句時(shí),Esper將調(diào)用updateListener接口中的update方法。
2.1.2 內(nèi)存消耗
內(nèi)存消耗是指第一個(gè)事件發(fā)送到Esper引擎到最后一個(gè)事件計(jì)算完畢過程中,所使用的最大的內(nèi)存,使用visualvm內(nèi)存監(jiān)控工具進(jìn)行測量,重復(fù)進(jìn)行五次,取平均內(nèi)存消耗。
2.1.3 吞吐量
吞吐量是指Esper引擎能夠在不丟失數(shù)據(jù)的情況下處理的每秒最大事件數(shù)。本文計(jì)算所有日志事件數(shù)量總和與執(zhí)行時(shí)間總和的商結(jié)果作為吞吐量。
表1 實(shí)驗(yàn)數(shù)據(jù)信息
圖1 實(shí)驗(yàn)過程框架
本文實(shí)驗(yàn)所用事件日志是流計(jì)算框架Storm運(yùn)行時(shí)產(chǎn)生的日志,一共包含7種事件類型。事件日志的規(guī)模為10萬、20萬、30萬、50萬、80萬、100萬、150萬、200萬。事件日志包含的trace長度和數(shù)量如表1所示,在10萬的日志中,trace的長度為10到22,trace總數(shù)量為6454。
實(shí)驗(yàn)過程如圖1所示,Storm在運(yùn)行中打出事件,以離線的方式發(fā)送給Esper引擎中,Esper根據(jù)所寫EPL語句生成觸發(fā)器,并對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行分析。
由圖2可知,Esper的執(zhí)行時(shí)間隨事件日志規(guī)模呈線性增長趨勢(shì),在時(shí)間性能方面,Esper分析和處理200萬條事件日志大概需要10.5秒,在內(nèi)存消耗方面,Esper處理200萬條事件大概需要1050MB。在吞吐量方面,Esper的平均吞吐量約為每秒16.36萬。因此Esper具有良好的性能。
圖1 不同事件日志規(guī)模下性能比較
在本文中,介紹了Esper的特點(diǎn)及EPL語言,并通過實(shí)驗(yàn)驗(yàn)證了Esper在復(fù)雜處理事件方面具有較好的性能。