自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

原創(chuàng)
大數(shù)據(jù) 數(shù)據(jù)庫
目前業(yè)界已經(jīng)有很多杰出的監(jiān)控系統(tǒng)如Nagios、Zabbix、Prometheus,但都是面向運維人員,在應(yīng)對復(fù)雜多變的業(yè)務(wù)指標(biāo)監(jiān)控時顯得不夠靈活。為此蘇寧數(shù)據(jù)云在流式計算框架Apache Flink之上設(shè)計了一組包含ETL、指標(biāo)計算、告警觸發(fā)、告警通知模塊的業(yè)務(wù)監(jiān)控引擎。

【51CTO.com原創(chuàng)稿件】1 引言

目前業(yè)界已經(jīng)有很多杰出的監(jiān)控系統(tǒng)如Nagios、Zabbix、Prometheus,但都是面向運維人員,在應(yīng)對復(fù)雜多變的業(yè)務(wù)指標(biāo)監(jiān)控時顯得不夠靈活。

為此蘇寧數(shù)據(jù)云在流式計算框架Apache Flink之上設(shè)計了一組包含ETL、指標(biāo)計算、告警觸發(fā)、告警通知模塊的業(yè)務(wù)監(jiān)控引擎。

其基本規(guī)則是告警SQL DSL語言,定義完備易用的場景規(guī)則語法和算子并支持動態(tài)更新調(diào)整,以便于業(yè)務(wù)方接入。下面對其基本原理和實現(xiàn)進(jìn)行介紹,供各位同行參考指正。

2 DSL規(guī)則設(shè)計

初期調(diào)研了各個業(yè)務(wù)方的需求,整理歸納出核心需求點主要是基于維度和時間的指標(biāo)絕對值、同環(huán)比或方差在超出閾值范圍則觸發(fā)告警,且業(yè)務(wù)方接入的是原始明細(xì)數(shù)據(jù),故在設(shè)計規(guī)則中需要包含數(shù)據(jù)清洗過濾、分組、聚合計算、時間窗口設(shè)置特性。

而SQL語言作為開發(fā)人員最熟悉的數(shù)據(jù)處理語言,選擇其作為原型,可以省去理解和溝通的成本。

語法規(guī)則如下:

  1. SELECT {metrics} FROM {metricFilters} WHERE {alertConditions} GROUP BY {groupByExpr} ORDER BY {orderByExpr} FOR LAST {number} MINUTE 
  • SELECT子句指標(biāo)計算
  • FROM子句數(shù)據(jù)過濾表達(dá)式
  • WHERE子句告警狀態(tài)判斷表達(dá)式
  • GROUP BY子句數(shù)據(jù)分組
  • ORDER BY子句排序規(guī)則
  • FOR LAST子句計算窗口時間

目前聚合函數(shù)支持的均值(avg)、記數(shù)(count)、總數(shù)(sum)、去重記數(shù)(distinct_count)等指標(biāo)計算,并支持多個指標(biāo)四則混合運算、位運算、比較運算、邏輯運算。

以下SQL規(guī)則表達(dá)的業(yè)務(wù)含義是根據(jù)錯誤類型和城市信息進(jìn)行分組,5分鐘內(nèi)錯誤數(shù)量大于100且與前5分鐘環(huán)比大于20%則觸發(fā)告警:

 

  1. SELECT COUNT(errorType, 5) AS currentTypeNum, COUNT(errorType, 10, 5) AS previewTypeNum, (currentTypeNum - previewTypeNum) / previewTypeNumAS circularPercent, errorType, city 
  2. FROM mobileAppIdIN ("Suning_PCbrowser","Suning_WAP")   
  3. WHERE currentTypeNum>100 AND circularPercent>0.2   
  4. GROUP BY errorType, city 
  5. ORDER BY EVENT_TIME  
  6. FOR LAST10 MINUTE 

3 實現(xiàn)設(shè)計

3.1 SQL解析

基于Antlr定義詞法和語法,使用Maven Antlr插件生成AST解析器,Visitor模式遍歷語法樹實現(xiàn)各個部分處理器,不熟悉的同學(xué)可以參考Antlr官方手冊,此處不再贅述。

解析SQL語句過程如下:

  • 提取所有計算中用的到字段和過濾條件(FROM語句),作為預(yù)處理器用于ETL過程
  • WHERE子句抽象為布爾表達(dá)式,系統(tǒng)狀態(tài)判斷條件
  • GROUP BY子句抽象為從一個數(shù)據(jù)對象中提取分組Key的處理器
  • ORDER BY從句中提取時間窗口字段即Apache Flink中Event Time或Process Time
  • FOR LAST子句提取出時間窗口大小
  • SELECT語句是一組支持AS別名的算子,執(zhí)行后的結(jié)果為鍵值對,即業(yè)務(wù)指標(biāo)

需要注意的是考慮到ETL過程和計算過程都是獨立模塊,若計算過程通過字段名引用字段值,則中間對象必然是鍵值對方式的Map結(jié)構(gòu),在傳輸中序列化和反序列化必然會對性能有一定的影響。

為此在遍歷抽象語法樹過程中須構(gòu)建一個解析上下文,把字段名引用改為數(shù)組下標(biāo),ETL過程產(chǎn)生的中間數(shù)據(jù)對象為數(shù)組結(jié)構(gòu),計算時訪問字段值的時間復(fù)雜度為O(1)。

例如原始數(shù)據(jù)為:

 

  1. {"errorType":"E005","mobileAppId":"Suning_WAP","city":"025","network":"CMCC"
  2. 解析出子字段數(shù)組[“errorType”,”city”]發(fā)送ETL模塊,處理后數(shù)據(jù)對象Row為[“E005”,”025”],算子COUNT(“errorType”)實際運行中為COUNT(ROW[0]) 

3.2 整體架構(gòu)

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

整個流程中ETL和告警計算模塊都是運行在Apache Flink中,借用Flink實時計算和狀態(tài)持久化能力。

每個業(yè)務(wù)接入方的數(shù)據(jù)格式不盡相同,把相關(guān)數(shù)據(jù)解析、清洗、過濾、豐富等功能單獨抽離成ETL模塊,可以根據(jù)接入方業(yè)務(wù)需求單獨定制部署,其中SQL中FROM階段提前到ETL模塊,提取過濾掉不需要的數(shù)據(jù),降低數(shù)據(jù)傳輸量。

3.3 SQL引擎在Flink中的運行機(jī)制

  • ETL模塊

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

告警規(guī)則SourceStream轉(zhuǎn)成廣播流BroadcastStream并connect到數(shù)據(jù)解析Stream,因并行度不一致且未分組須使用BroadcastProcessFunction處理規(guī)則的變化通知,把SQL規(guī)則解析成字段提取和過濾處理器,保存在BroadcastState中達(dá)到數(shù)據(jù)流和廣播流共享狀態(tài)的目的。

  • 告警計算模塊

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

從Kafka中消費ETL模塊提取的字段和規(guī)則ID,根據(jù)告警規(guī)則Group子句提取分組信息;結(jié)合規(guī)則流解析Select子句表達(dá)式計算所有指標(biāo);再次結(jié)合規(guī)則流解析Where 子句告警觸發(fā)條件和狀態(tài)機(jī)相關(guān)參數(shù),判斷系統(tǒng)當(dāng)前健康狀態(tài),觸發(fā)健康狀態(tài)機(jī)變遷;把系統(tǒng)狀態(tài)變遷和當(dāng)前指標(biāo)值作為告警事件寫入Kakfa,由告警通知模塊根據(jù)通知規(guī)則配置處理相關(guān)發(fā)送邏輯。

3.4 聚合計算

Apache Flink是流式實時處理框架,而聚合計算類似于批處理,需要計算窗口內(nèi)的所有數(shù)據(jù);相對應(yīng)告警SQL可能會產(chǎn)生大量分組,每個分組其實都是獨立的告警規(guī)則,若是緩存一個事件窗口的數(shù)據(jù)進(jìn)行計算,會對Flink的狀態(tài)維護(hù)產(chǎn)生巨大壓力,所以對于聚合計算采用的分鐘級分桶計算和累加器聚合結(jié)果設(shè)計思路。

  • 分桶

根據(jù)時間窗口長度創(chuàng)建環(huán)形隊列,每分鐘一個桶,按照時間計算當(dāng)前元素桶的位置,計算當(dāng)前桶的值。

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

  • 累加器

類似于Spark和Flink中累加器Accumulator實現(xiàn),保存分鐘級計算中間結(jié)果、合并累加器、獲取最終值,因此計算過程中不必保留原始數(shù)據(jù),只需要在Flink中保存累加器的狀態(tài)即可。

 

  1. /** 
  2.      * Creates a new accumulator, starting a new aggregate. 
  3.      */ 
  4.      ADD createAccumulator(); 
  5.  
  6.      /** 
  7.      * Adds the given input value to the given accumulator, returning the 
  8.      * new accumulator value. 
  9.      */ 
  10. ADD add(ELE value, ADD accumulator); 
  11.  
  12. /** 
  13.      * Gets the result of the aggregation from the accumulator. 
  14.      */ 
  15. OUT getResult(ADD accumulator); 
  16.  
  17. /** 
  18.      * Merges two accumulators, returning an accumulator with the merged state. 
  19.      */ 
  20. ADD merge(ADD a, ADD b); 

其中去重計數(shù)distinct_count聚合計算在告警場景允許精度損失故采用支持分桶累加的HyperLogLog算法,降低對內(nèi)存的要求。

3.5 告警狀態(tài)機(jī)

是否產(chǎn)生告警事件并不是依據(jù)計算出的指標(biāo),而是根據(jù)Where從句判斷指標(biāo)是否超出閾值返回True或False確定當(dāng)前系統(tǒng)健康狀態(tài),比對當(dāng)前狀態(tài)產(chǎn)生的健康狀態(tài)變遷事件作為觸發(fā)告警事件。

目前設(shè)計系統(tǒng)的狀態(tài)有三種,即正常(Normal)、警告(Warning)、嚴(yán)重(Critical),而后兩種就是分別對應(yīng)兩個SQL DSL中Where從句表達(dá)式,狀態(tài)變遷圖如下:

基于Antlr在Apache Flink中實現(xiàn)監(jiān)控規(guī)則DSL化的探索實踐

業(yè)務(wù)系統(tǒng)是否產(chǎn)生告警通知也可以根據(jù)這幾種事件進(jìn)行配置,如果連續(xù)5分鐘異常才產(chǎn)生告警,則可以只關(guān)注CONTINUE相關(guān)事件。當(dāng)然告警通知系統(tǒng)也有通知合并和告警風(fēng)暴抑制相關(guān)功能。

4 問題和展望

目前此引擎已經(jīng)用于蘇寧易購登錄、商品詳情頁、購物車和支付多個業(yè)務(wù)線的用戶體驗監(jiān)控,幫助產(chǎn)品和業(yè)務(wù)運營人員可以快速發(fā)現(xiàn)和定位問題。為了提升處理能力和降低接入難度,以下兩個方面還需要進(jìn)行優(yōu)化:

  • 改進(jìn)Apache Flink狀態(tài)管理 現(xiàn)在Flink集群中狀態(tài)管理使用的FsStateBackend機(jī)制,狀態(tài)保存在HDFS文件系統(tǒng),在高基數(shù)維度或多維組合產(chǎn)生海量分組的業(yè)務(wù)場景下可能會有OOM和性能風(fēng)險,下一步準(zhǔn)備切換為支持增量Checkpoint的RocksDB狀態(tài)存儲方案。
  • 異常檢測智能化 現(xiàn)有告警規(guī)則如何判斷系統(tǒng)狀態(tài)是否異常還是依據(jù)靜態(tài)閾值,這種方式要求業(yè)務(wù)方對系統(tǒng)指標(biāo)有精確的了解,且隨著業(yè)務(wù)的變化要不斷調(diào)整,不符合業(yè)界的發(fā)展趨勢。下一階段計劃針對新業(yè)務(wù)無歷史數(shù)據(jù)的場景采用曲線波動檢測3sigma和中位數(shù)絕對偏差MAD(Median absolute deviation)算法,而比較穩(wěn)定的業(yè)務(wù)線引入時間序列異常檢測機(jī)器學(xué)習(xí)。

蘇寧數(shù)據(jù)云服務(wù)產(chǎn)品

蘇寧數(shù)據(jù)云已有大數(shù)據(jù)開發(fā)套件(提供全方位的大數(shù)據(jù)開發(fā)服務(wù))、人工智能服務(wù)(實現(xiàn)智能的人機(jī)互動做出更好決策)、數(shù)據(jù)分析及展示服務(wù)(提供海量數(shù)據(jù)處理與分析方法)、平臺基礎(chǔ)服務(wù)(提供大數(shù)據(jù)平臺基礎(chǔ)服務(wù)),實時告警數(shù)據(jù)分析平臺也在規(guī)劃建設(shè)中。實時計算中實現(xiàn)監(jiān)控規(guī)則DSL是內(nèi)部項目的一次技術(shù)探索,若能經(jīng)過實際業(yè)務(wù)的考驗,也會考慮通過數(shù)據(jù)云對外提供服務(wù)。

作者簡介

黃小虎,蘇寧科技集團(tuán)消費者平臺購物流程架構(gòu)負(fù)責(zé)人,全面負(fù)責(zé)蘇寧易購商品詳情頁、購物車、大聚會等核心系統(tǒng)的優(yōu)化及大促保障工作。對電商交易流程和業(yè)務(wù)有較深入的思考和研究,專注于高并發(fā)大型電商網(wǎng)站的架構(gòu)設(shè)計、高可用的系統(tǒng)設(shè)計。曾主導(dǎo)和參與了 Commerce 系統(tǒng)拆分、商品詳情頁接入層優(yōu)化、云信客服系統(tǒng)重構(gòu)等重大技術(shù)攻關(guān)項目。現(xiàn)致力于打造蘇寧易購新一代核心購物流程系統(tǒng),希望將購物體驗做到更好。

胡正林,蘇寧科技集團(tuán)消費者平臺高級架構(gòu)師,十余年軟件開發(fā)經(jīng)驗,熟悉大型分布式高并發(fā)系統(tǒng)架構(gòu)和開發(fā),目前主要負(fù)責(zé)易購各系統(tǒng)架構(gòu)優(yōu)化與大促保障工作。

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

 

責(zé)任編輯:未麗燕 來源: 51CTO.com
相關(guān)推薦

2021-05-20 09:55:23

Apache Flin阿里云大數(shù)據(jù)

2022-04-07 16:50:28

FlinkB站Kafka

2021-12-08 10:35:04

開源監(jiān)控Zabbix

2018-11-14 13:49:16

Apache Flin唯品會架構(gòu)

2021-08-06 15:06:09

騰訊開源Apache

2025-03-20 10:50:08

RedisCaffeine緩存監(jiān)控

2022-09-16 08:23:22

Flink數(shù)據(jù)湖優(yōu)化

2022-04-14 10:29:57

機(jī)器學(xué)習(xí)時間技術(shù)

2016-12-28 14:27:24

大數(shù)據(jù)Apache Flin搜索引擎

2024-10-23 20:09:47

2016-01-12 11:38:19

智能化運維運維業(yè)務(wù)

2024-04-17 07:21:52

物化視圖查詢加速器數(shù)據(jù)倉庫

2021-08-31 10:18:34

Flink 數(shù)倉一體快手

2009-06-14 22:09:24

Java界面布局DSL

2022-04-22 09:05:12

蔚來汽車Flink實時數(shù)倉

2021-05-06 11:54:40

大數(shù)據(jù)Flink

2022-08-21 07:25:09

Flink云原生K8S

2022-04-15 10:52:50

模型技術(shù)實踐

2023-07-31 07:49:03

2025-03-06 04:00:00

點贊
收藏

51CTO技術(shù)棧公眾號