潘鋼
現階段移動經營分析的數據流大致分為數據接口、數據處理、數據分發、數據應用四個層級,每個層級內有數量龐大的運行程序,按照實際業務需求分成很多小層級,形成后置程序依賴前置程序的關系。而且每個程序的前置程序數量不固定,大于等于一個,就這形成了極其龐大且相互纏結的程序集群。程序間的依賴關系非常繁雜。每天凌晨開始,大量數據(大于100T)流經這些程序時,偶爾會有個別程序發生運行延遲。發生延遲程序會對后置造成多大范圍的影響、多深的影響是未知數。而且現有腳本和手工查證的方式不便,因為速度太慢,當查證出后置延遲應用時往往已錯過了時效性。即使讓有豐富經驗的工作人員操作此流程,也不能縮短這個時間,也不能達到理想的效果。
一、目標與成果
本次研究目標包括:
(一)一種預測后置應用是否延遲的方法,重點解決數據庫生產和運維過程中的問題預測問題,實現從“發現問題-找原因-處理問題”,轉變為“發現波動-提出預警-啟動預案-消滅問題”問題。
研究一種結合數據和機器學習方法,進行自動預測的方法,以數據監控和算法預測代替人工,大幅降低數據生產過程中出現的后置應用延時等問題;
研究方法實踐中所需要的方法論,包括采用的算法分析、模型構建、參數調整和模型調優等。
(二)研究一種數據庫內生產調度優化的方法,重點解決數據庫內前后置應用配置不合理的問題,實現理論和經驗調度向數據化、智能化調度的轉變。
研究一種結合數據和機器學習方法,判定程序啟動時間是否合理的判別方法,以歷史運行數據為基礎,以模型判定為依據,大幅降低由于調度導致后置程序延遲和前后置依賴不合理的問題,解決長期困擾運維人員的數據生產程序的基礎配置問題。
研究方法實踐中所需要的方法論,包括采用的算法分析、模型構建、參數調整和模型調優等。
二、技術方案
本方法分為三個步驟實現:掃描程序、預測模型、優化模型,如圖1所示。

(一)步驟一:掃描程序
為了得到當前應用的運行情況和應用的歷史信息,參見圖一中掃描程序的流程圖,具體步驟如下
1. 數據采集
從當日應用運行記錄中提取應用的運行信息,包含接口、處理、分發、應用等層級的全量元數據。經過數據清洗、數據匹配得到應用名、是否重要、是否延遲、是否完成、結束時間、延遲時間、標桿時間等信息。其中每個應用的標桿時間來自最近一段時間段內的統計值,如下圖二所示,x軸為最近一段時間內某個應用的歷史結束時間間隔記錄,y軸為次數。

泊松分布的參數λ是單位時間(或單位面積)內隨機事件的平均發生率。泊松分布適合于描述單位時間內隨機事件發生的次數。
2. 數據處理
對來自不同層級的數據進行處理,得到數據格式一致的數據集。如有些數據接口的應用名得加上前綴,完成狀態采用統一的編號格式,結束時間使用同一種格式。
這里采用簡單的六西格瑪計算。對于每一個前置應用程序,連續60天的完成情況可以構成一個簡單時間序列,可以反映一定時間內的數據生產完成情況。那么這個時間序列的均值μ反映該程序的平均完成情況;時間序列的σ反映程序完成情況的波動性。從生產角度來說,為了控制的嚴格程度,往往需要生產的及時性控制在更小的范圍內,因此,我們設定t≤μ+σ,即生產的波動性應控制在1個σ的范圍內,如果一個程序完成時間大于μ+σ,我們認為該程序延遲,延時記為1,未延時記為0。例,假設一個程序的平均完成時間為20分鐘,誤差為5分鐘,今天該程序10分鐘運行完畢,我們認為沒有延時,記為0;如果該程序運行30分鐘,我們判定該程序延時,記為1。
3. 數據保存
把應用的屬性,如:是否重要、是否延遲、是否完成、結束時間、延遲時間、標桿時間等信息,提取出來后放入一個對象中。以應用名為鍵(key),應用對象為值(value)統一保存。
4. 歷史數據統計
統計最近三個月內每個應用的平均運行時長和等待時長。運行時長指的是應用從開始執行到結束執行中間所耗費的時間。等待時長指的是應用眾多前置中最晚結束的時間到本應用開始執行之間的間隔時長。
(二)步驟二:預測模型
通過遞歸計算得到未執行應用的延遲可能性,參見圖一中預測模型的流程圖,具體步驟如下:
1. 設置延遲閥值
設置初始延遲的閥值和范圍,這里圈定數據接口、數據處理、數據分發、數據應用四個層級中的重要應用,閥值為延遲30分鐘以上。如果此應用還沒執行完成,則把當前時間代指應用的結束時間,在此基礎上累加后置時間。以結束時間作為標記時間,即本分支推算到當前應用的標記。
2. 得到關系樹
在程序血緣關系表中記錄著應用的前后置關系,每條信息是一對一關系,但總體上是多對多關系,也就是說一個前置會對應多個后置,一個后置會有多個前置應用。逐個拿到圖1的步驟二預測模型的第一個環節中判定的延遲應用名,在關系表中取得它的后置應用名。
3. 驗證應用有效
驗證后置應用是否有效,最近三個月是否有運行記錄,如果沒有的話則忽略此應用。
4. 查看是否已執行
查看后置應用當日是否已經執行過,如果已經執行過則更新標記時間,即本分支推算到當前應用的標記。直接把后置應用的結束時間覆蓋標記時間。如果還未執行則跳至圖1的步驟二預測模型的第六個環節進行判定。
5. 查看是否已預測
查看后置應用是否已經預測過,因為一個前置有多個后置應用,意味著現在這個后置可能會出現在別的應用的后置中,所以有必要查看此后置應用是否已被預測。如果已經被預測過,則比較預測結束時候是否早于標記時間加上等待時長和運行時長,取更大的那個時間覆蓋預測結束時間。這是因為應用得等待每個前置完成后才能開始執行。如果沒有預測過,則跳至圖1的步驟二預測模型的最后一個環節。
6. 預測應用
進入此環節的便是待預測的應用,累加標記時間、應用等待時長、運行時長,減去標桿時間得到預計延時長,如果為負數或0表示不會延遲。使用預計延時長通過線性擬合算法得到此后置的預計延時幾率。但無法保證此后置應用沒有再下一層的后置,所以需要從圖1的步驟二預測模型的第二個環節開始使用遞歸算法,把此后置應用作為前置,運算它的下一層,即后置的后置。如果沒有下一層則自動終止。
(三)步驟三:優化模型
驗證預測出的延時幾率的可信度,參見圖一中優化模型的流程圖,具體步驟如下:
1. 關聯預測
對比每個預測出來的結果和對應的前置的關聯關系,即在歷史記錄中查看當前置們發生延遲時后置是否也會發生延遲,得到如下的關系表,其中1表示延遲,0表示未延遲。

邏輯性的思維是指根據邏輯規則進行推理的過程;它先將信息化成概念,并用符號表示,然后,根據符號運算按串行模式進行邏輯推理;這一過程可以寫成串行的指令,讓計算機執行。然而,直觀性的思維是將分布式存儲的信息綜合起來,結果是忽然間產生的想法或解決問題的辦法。這種思維方式的根本之點在于以下兩點:1、信息是通過神經元上的興奮模式分布儲在網絡上;2、信息處理是通過神經元之間同時相互作用的動態過程來完成的。
結合BP網絡結構,誤差由輸出展開至輸入的過程如下:

本模型在輸入層使用的節點數和前置數相同,設置兩個隱藏層,輸出層直接輸出0和1用來代指后置應用是否會延遲。如下圖3所示。

3. 保存結果
保存預測出的應用名和延時幾率
4. 使用結果
延時幾率大于50%的應用自動發送給運維管理人員,對這些應用進行重點觀測或看情況進行重新調度。如果該延遲應用超過一定時間仍未完成則自動重新調度。
三、結論
本文提出預測后置應用延遲的方法,解決了當前、后置關系呈金字塔狀的情況下的自動預測,現有的預測模型更多解決的是鏈式關系下的逐層排查問題。在算法方面,使用的是自行設計的基于業務的推演算法,順著關系樹逐個節點計算出預計完成時間,遞歸至整個關系樹,得到每個未完成節點的總的延時概率。在應用成效上,預測結果的準確率經過驗證達到94%以上。