艾力卡木·再比布拉,甄 妞,黃 山,段曉東
(大連民族大學(xué) a.計算機(jī)科學(xué)與工程學(xué)院;b.大數(shù)據(jù)應(yīng)用技術(shù)國家民委重點實驗室;c.大連市民族文化數(shù)字技術(shù)重點實驗室,遼寧 大連 116650)
在現(xiàn)今的社會,大數(shù)據(jù)處理廣泛應(yīng)用于電子商務(wù)、O2O、物流配送等領(lǐng)域,協(xié)助企業(yè)不斷地發(fā)展新業(yè)務(wù),創(chuàng)新運營模式。Flink[1]作為新一代的大數(shù)據(jù)計算引擎,能夠以數(shù)據(jù)并行和流水線的方式執(zhí)行批處理和流處理任務(wù),相較于上一代大數(shù)據(jù)處理框架Spark,具有低延遲、高吞吐、高性能等優(yōu)勢。隨著Docker[2]容器技術(shù)的發(fā)展,F(xiàn)link等大數(shù)據(jù)應(yīng)用都逐漸走向容器化。并且利用Kubernetes[3]等編排工具去管理容器化應(yīng)用。
由于Flink集群有異構(gòu)性并且Flink本身沒有均衡負(fù)載的能力,很多學(xué)者利用RNN、LSTM[4]等機(jī)器學(xué)習(xí)技術(shù)去提前預(yù)測負(fù)載并進(jìn)行調(diào)度。文獻(xiàn)[5]通過區(qū)域劃分和基于人工螢火蟲優(yōu)化的算法實現(xiàn)負(fù)載均衡。文獻(xiàn)[6]設(shè)計了雙向的LSTM來對云計算資源的動態(tài)變化的復(fù)雜特性進(jìn)行預(yù)測。文獻(xiàn)[7]將ARIMA與自回歸神經(jīng)網(wǎng)絡(luò)相結(jié)合,對云服務(wù)器上的實時資源情況進(jìn)行預(yù)測,實驗證明,該模型與其他單一模型相比,預(yù)測結(jié)果更加精確。文獻(xiàn)[8]提出了Flink環(huán)境下基于負(fù)載預(yù)測的彈性資源調(diào)(LPERS-Flink)策略。文獻(xiàn)[9]通過將超載節(jié)點上的容器遷移到低負(fù)載節(jié)點,降低系統(tǒng)通信開銷,提升集群的吞吐量與計算效率。文獻(xiàn)[10]通過優(yōu)化支持向量機(jī)構(gòu)建負(fù)載預(yù)測模型,對單步與多步云計算資源負(fù)載進(jìn)行預(yù)測分析。文獻(xiàn)[11]使用遞歸神經(jīng)網(wǎng)絡(luò)RNN來實現(xiàn)對云工作負(fù)荷的預(yù)測,通過Google Cloud Trace數(shù)據(jù)集上的實驗驗證了該方法的準(zhǔn)確性。文獻(xiàn)[12]首先使用ARIMA模型進(jìn)行預(yù)測,再使用ENN模型對ARIMA誤差進(jìn)行預(yù)測,最終得到修正后的預(yù)測值。該文獻(xiàn)提出的組合預(yù)測模型有效提升了云環(huán)境中工作負(fù)載預(yù)測的精度。文獻(xiàn)[13]提出了一種基于自回歸移動平均模型ARIMA與長短期記憶網(wǎng)絡(luò)LSTM的組合預(yù)測模型,預(yù)測精度相比其他預(yù)測模型有明顯的提升,降低了云環(huán)境中對資源負(fù)載的實時預(yù)測誤差。
容器化部署Flink時,由于下游算子所在容器無法預(yù)知上游算子傳輸?shù)臄?shù)據(jù)量,導(dǎo)致上下游算子的容器內(nèi)存分配不均衡問題。針對此問題,本文提出基于深度學(xué)習(xí)的容器化Flink上下游負(fù)載均衡框架,提出C-BiLSTM預(yù)測模型,使用CEEMDAN分解方法和BiLSTM相結(jié)合的預(yù)測方法預(yù)測Flink下游所需內(nèi)存利用率,并依據(jù)預(yù)測結(jié)果對下游容器的伸縮操作。
Flink中TaskManager結(jié)構(gòu)如圖1。Flink中每一個TaskManager是一個JVM進(jìn)程,它可以啟動多個獨立的線程,來并行執(zhí)行多個子任務(wù)(subtask)。TaskManager的計算資源是有限的,并不是所有任務(wù)都可以放在一個TaskManager上并行執(zhí)行。并行的任務(wù)越多,每個線程的資源就會越少。為了控制并發(fā)量,F(xiàn)link需要在TaskManager上對每個任務(wù)運行所占用的資源做出明確的劃分。由于下游算子所在容器無法預(yù)知上游算子傳輸?shù)臄?shù)據(jù)量,導(dǎo)致上下游算子的容器內(nèi)存分配不均衡問題。
圖1 Flink中TaskManager結(jié)構(gòu)
系統(tǒng)架構(gòu)如圖2。Flink提交作業(yè)到伸縮模塊和Kubernetes集群上,監(jiān)控模塊獲取節(jié)點數(shù)據(jù)并傳給預(yù)測模塊進(jìn)行數(shù)據(jù)處理和預(yù)測任務(wù)。預(yù)測結(jié)果傳回到伸縮模塊進(jìn)行伸縮,最后傳給Flink進(jìn)行容器的初始化操作。
圖2 系統(tǒng)架構(gòu)圖
本文提出的負(fù)載均衡策略由監(jiān)控模塊、預(yù)測模塊和容器伸縮模塊構(gòu)成。監(jiān)控模塊獲取到容器資源負(fù)載數(shù)據(jù),傳送給預(yù)測模塊,預(yù)測模塊對時序列數(shù)據(jù)進(jìn)行數(shù)據(jù)的預(yù)處理并預(yù)測下游容器所需要的內(nèi)存利用率,并把預(yù)測結(jié)果傳給容器伸縮模塊,最后伸縮模塊根據(jù)預(yù)測的結(jié)果提前對下游的容器數(shù)量進(jìn)行伸縮操作來避免上下游之間的負(fù)載不均衡。模塊之間的交互流程如圖3。
圖3 模塊之間的交互流程
監(jiān)控模塊本文采用Prometheus監(jiān)控組件監(jiān)測集群負(fù)載信息,框架圖如圖4所示。在容器中部署Prometheus目標(biāo),收集部署Flink的容器的CPU負(fù)載信息,這些信息由Pushgateway收集匯總。利用Prometheus的服務(wù)發(fā)現(xiàn)組件,連接Kubernetes收集容器的內(nèi)存負(fù)載信息。Prometheus服務(wù)器部署在集群的主節(jié)點上,分別從Pushgateway和服務(wù)發(fā)現(xiàn)組件中拉取CPU及內(nèi)存負(fù)載信息,并將這些信息保存到TSDB數(shù)據(jù)庫中。收集的信息由Grafana導(dǎo)出到預(yù)測模塊處理。
圖4 Prometheus體系架構(gòu)圖
資源負(fù)載預(yù)測模塊主要作用是對容器的監(jiān)控數(shù)據(jù)進(jìn)行預(yù)測分析,預(yù)測容器資源未來負(fù)載情況,然后將預(yù)測結(jié)果發(fā)送給資源伸縮模塊,為資源伸縮工作提供決策支持。
(1)數(shù)據(jù)預(yù)處理。數(shù)據(jù)預(yù)處理首先獲取監(jiān)控數(shù)據(jù)中的時間序列數(shù)據(jù)后,對此進(jìn)行重采樣,并刪掉數(shù)據(jù)不合法的值。在對數(shù)據(jù)進(jìn)行填充缺失值操作。數(shù)據(jù)預(yù)處理過程的偽代碼見表1。
表1 容器資源負(fù)載時間序列預(yù)處理過程
(2)負(fù)載預(yù)測。本文提出一種組合預(yù)測模型C-BiLSTM模型,將CEEMDAN方法和BiLSTM模型結(jié)合,使得分析時間序列變得更加精確。CEEMDAN方法可以有效分析時間序列中的信息,將時間序列分解為不同的頻率、趨勢特征的分量,彼此之間相互獨立。因此使用CEEMDAN方法進(jìn)行時間序列特征分析可以減少預(yù)測誤差,增大預(yù)測精度。BiLSTM模型具有強(qiáng)大的學(xué)習(xí)能力,可以有效地針對容器中的資源負(fù)載時間序列進(jìn)行預(yù)測,獲得精準(zhǔn)的預(yù)測結(jié)果。C-BiLSTM模型的預(yù)測流程,其主要步驟如圖5。
圖5 C-BiLSTM模型流程圖
基于CEEMDAN方法將原始時間序列分解為一系列的IMF分量和res殘差序列,其中IMF分量就是原始時間序列中不同趨勢特征的分量,而res殘差序列就是原始時間序列的長期的,整體的變化趨勢;將IMF分量和res殘差序列分別作為BiLSTM模型的輸入,進(jìn)行訓(xùn)練和接收預(yù)測值,最后得出預(yù)測結(jié)果;LSTM結(jié)構(gòu)如圖6。LSTM用內(nèi)部自循環(huán)結(jié)構(gòu)來控制信息流,通過輸入門、遺忘門、輸出門三個非線性門控單元和一個記憶單元來控制信息的流通和損失。遺忘門由一個sigmod神經(jīng)網(wǎng)絡(luò)層和一個按位乘操作構(gòu)成,用來遺忘一些不必要的信息,遺忘門決定了上一時刻細(xì)胞狀態(tài)中的哪些信息將被遺忘。記憶門由輸入門與tanh神經(jīng)網(wǎng)絡(luò)層和一個按位乘操作構(gòu)成,與遺忘門相反,記憶門決定輸入信息x(t)和上一時刻輸出信息h(t-1)中的哪些信息被保留。輸出門與tanh函數(shù)以及按位乘操作共同作用將細(xì)胞狀態(tài)和輸入信號傳遞到輸出端。LSTM無法編碼從后向到前向的信息,因此本文使用由前向與后向LSTM組成的BiLSTM模型。BiLSTM網(wǎng)絡(luò)就是在LSTM網(wǎng)絡(luò)中使用兩套連接權(quán)重分別沿前向時序和后向時序?qū)ν恍蛄羞M(jìn)行建模。BiLSTM網(wǎng)絡(luò)結(jié)構(gòu)圖如圖7。x(t)表示序列中第t幀的特征向量,其中t=1~T,T是樣本序列中的總幀數(shù)。在BiLSTM網(wǎng)絡(luò)中x(t)被LSTM網(wǎng)絡(luò)分別沿前向時序和后向時序處理并輸出信息h(t)。對得到的各個IMF分量和res殘差序列預(yù)測結(jié)果進(jìn)行合并,合并計算過程如公式(1)。
(1)
圖6 C-BiLSTM模型流程圖
圖7 BiLSTM網(wǎng)絡(luò)結(jié)構(gòu)圖
容器資源負(fù)載模型訓(xùn)練偽代碼見表2。讀取監(jiān)控獲取的容器資源負(fù)載數(shù)據(jù),經(jīng)過對此數(shù)據(jù)預(yù)處理后進(jìn)行CEEMDAN分解,得到IMF分量和res殘差序列并進(jìn)行檢查有無異常,將分量后的數(shù)據(jù)交給BiLSTM網(wǎng)絡(luò)進(jìn)行訓(xùn)練,最終得出預(yù)測結(jié)果。
表2 容器資源負(fù)載模型訓(xùn)練流程
本文的伸縮模塊是基于預(yù)測模塊的輸出并提前進(jìn)行調(diào)整下游容器數(shù)量來達(dá)到上下游負(fù)載均衡的目的。從預(yù)測模塊獲取到預(yù)測結(jié)果,計算下游容器數(shù)量是否需要進(jìn)行伸縮操作。并按照判斷結(jié)果,提前對下游容器數(shù)量進(jìn)行伸縮操作。本文容器伸縮模塊的流程如圖8。
圖8 容器伸縮模塊流程圖
表3 實驗環(huán)境
為了驗證本文提出的C-BiLSTM模型的資源負(fù)載預(yù)測效果,使用了通過監(jiān)控Flink作業(yè)的上游容器工作負(fù)載得到的數(shù)據(jù)集來進(jìn)行資源負(fù)載預(yù)測實驗,數(shù)據(jù)集包含了一系列真實場景下的工作負(fù)載,本數(shù)據(jù)集包含的指標(biāo)有容器的CPU利用率和內(nèi)存利用率以及磁盤利用率。CPU利用率是集群信息中的重要指標(biāo),由于Flink內(nèi)部上下游容器是共享整個pod的CPU資源,所以本文主要預(yù)測指標(biāo)是內(nèi)存利用率。
在對本文模型進(jìn)行訓(xùn)練之后,使用本文模型對15個采樣點的數(shù)據(jù)進(jìn)行了預(yù)測,預(yù)測結(jié)果與真實值的對比如圖9。本文模型與真實值的數(shù)據(jù)非常接近,預(yù)測誤差非常小,即使是在面臨突發(fā)負(fù)載時預(yù)測效果也很好,大部分采樣點的數(shù)據(jù)曲線貼合效果比較好,證明了本文模型具有很好的預(yù)測效果。
圖9 真實內(nèi)存利用率與預(yù)測內(nèi)存利用率對比
本文方法預(yù)測的下游所需容器數(shù)量與實際所需窗口數(shù)量的對比如圖10??梢钥闯鲱A(yù)測下游容器數(shù)量并且與實際所需容器數(shù)量基本的誤差很小,驗證了本文提出的伸縮策略的有效性。
圖10 實際下游所需容器數(shù)量與預(yù)測下游
為更好的說明本文模型的預(yù)測效果,選取了三種不同模型RNN、LSTM和EMD-LSTM作為對比模型,然后與本文模型進(jìn)行對比驗證,這些模型的預(yù)測誤差指標(biāo)值對比如圖11。本文提出的C-BiLSTM模型的所有預(yù)測誤差指標(biāo)都要低于三個對比模型,并且要比EMD-LSTM模型誤差要更低,說明本文模型的預(yù)測誤差都很低,使用CEEMDAN方法來對時間序列的分解進(jìn)行優(yōu)化也是有效的。說明本文提出的C-BiLSTM模型可以針對時間序列數(shù)據(jù),有效地對時間序列數(shù)據(jù)進(jìn)行處理,消除數(shù)據(jù)的波動性,從而提高了Flink上下游負(fù)載序列的預(yù)測精度,降低預(yù)測誤差。
a)不同模型內(nèi)存利用率均方根誤差(RMSE)
b)不同模型內(nèi)存利用率平均絕對百分比誤差(MAPE)圖11 不同預(yù)測模型內(nèi)存利用率誤差對比
不同數(shù)據(jù)規(guī)模數(shù)據(jù)的運行時間如圖12。提出的基于C-BiLSTM模型之負(fù)載預(yù)測的彈性伸縮策略明顯比Flink減少了約20%的運行時間。
圖12 不同數(shù)據(jù)規(guī)模任務(wù)運行時間對比
圖13 不同類型任務(wù)負(fù)載運行時間對比
為驗證負(fù)載均衡策略的有效性,使用WordCount、PageRank和TeraSort三種不同類型的計算任務(wù)來對策略評估,結(jié)果如圖13。從實驗結(jié)果可以看出,本文提出的伸縮策略與Flink默認(rèn)算法比,在運行時間上,均有一定的優(yōu)化效果。其中,在PageRank任務(wù)上的優(yōu)化效果最為明顯,這是由于PageRank屬于計算密集型作業(yè),而WordCount屬于數(shù)據(jù)密集型作業(yè),TeraSort屬于I/O密集型作業(yè),后兩種作業(yè)中消耗較多的I/O資源,而本文提出的調(diào)度算法在資源均衡方面主要考慮了CPU和內(nèi)存的使用率,故算法在計算密集型作業(yè)上的優(yōu)勢較為明顯。
本文提出的Flink上下游負(fù)載均衡策略,通過深度學(xué)習(xí)的方法對Flink上游容器進(jìn)行分析來預(yù)測下游所需要的內(nèi)存利用率,以此提前對下游容器數(shù)量進(jìn)行伸縮,使上下游容器的負(fù)載進(jìn)行均衡,減少下游處理時間和上游的等待時間。經(jīng)實驗驗證,該算法可以緩解下游容器的內(nèi)存資源不夠的問題,讓任務(wù)的處理時間得到了明顯的縮減。受研究環(huán)境有限,本實驗僅使用了數(shù)據(jù)量不夠大的數(shù)據(jù)集進(jìn)行實驗。以后需要在更大的數(shù)據(jù)集及更多流數(shù)據(jù)上應(yīng)用,以進(jìn)一步驗證該策略的有效性。