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