ResourceManager中的Resource Estimator框架介绍与算法剖析
歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~
本文由宋超發(fā)表于云+社區(qū)專欄
本文首先介紹了Hadoop中的ResourceManager中的estimator service的框架與運(yùn)行流程,然后對其中用到的資源估算算法進(jìn)行了原理剖析。
一. Resource Estimator Service的出發(fā)點(diǎn)與目標(biāo)
估計作業(yè)運(yùn)行使用資源是大數(shù)據(jù)處理集群的一個重要且具有挑戰(zhàn)性的問題。隨著用戶使用的集群資源越來越多,這一需求被逐漸放大。當(dāng)前現(xiàn)有的解決方案一般是依賴于用戶的經(jīng)驗(yàn)來對作業(yè)資源需求進(jìn)行估計,這樣即繁瑣又低效。根據(jù)對集群工作負(fù)載的分析,可以發(fā)現(xiàn)大部分工作(超過60%)是重復(fù)工作,這樣我們便有機(jī)會根據(jù)作業(yè)歷史資源使用情況來估計作業(yè)下一次的資源需求量。同時,在未來,希望能提出一種與框架無關(guān)的黑盒解決方案。這樣,即使作業(yè)來自不同的計算框架,我們也能對重復(fù)性作業(yè)進(jìn)行資源需求估算。
二. Resource Estimator Service的框架結(jié)構(gòu)
Hadoop-resource estimator主要由三個模塊組成:Translator,SkylineStore和Estimator。下面分別介紹這三部分。
1.ResourceSkyline用來表征作業(yè)在其生命周期中的資源利用率。它使用RLESparseResourceAllocation記錄容器分配的信息。RecurrenceId用于標(biāo)識重復(fù)pipeline的特定運(yùn)行。pipeline可以包含多個作業(yè),每個作業(yè)都有一個ResourceSkyline來表征其資源利用率。
2.Translator用來解析作業(yè)日志,提取他們的ResourceSkylines并將它們存儲到SkylineStore。SingleLineParser解析日志流中的一行并提取ResourceSkyline。
3.SkylineStore充當(dāng)Hadoop-resource estimator的存儲層,由2部分組成。HistorySkylineStore存儲由轉(zhuǎn)換程序提取的ResourceSkylines。它支持四種操作:addHistory,deleteHistory,updateHistory和getHistory。addHistory將新的ResourceSkylines附加到定期pipeline,而updateHistory刪除特定定期pipeline的所有ResourceSkyline,并重新插入新的ResourceSkylines。PredictionSkylineStore存儲由Estimator生成的預(yù)測RLESparseResourceAllocation。它支持兩個操作:addEstimation和getEstimation。
4.Estimator根據(jù)歷史記錄運(yùn)行預(yù)測重復(fù)出現(xiàn)的pipeline資源需求,將預(yù)測存儲到SkylineStore并在YARN上進(jìn)行資源預(yù)留。Solver讀取特定定期pipeline的所有歷史ResourceSkylines,并預(yù)測其包含在RLESparseResourceAllocation中的新資源需求。目前,Hadoop-resource estimator提供了一個LPSOLVER來進(jìn)行預(yù)測(其中用到的算法模型會在后面進(jìn)行講解)。
三.以示例demo演示其運(yùn)行流程
Resource Estimator Service的URI是http://0.0.0.0,默認(rèn)服務(wù)端口是9998
(在 ResourceEstimatorServiceHome/data中,有一個示例日志文件resourceEstimatorService.txt,其中包含2次運(yùn)行的tpch_q12查詢作業(yè)的日志。進(jìn)行資源預(yù)測主要有以下幾個步驟:
1.解析作業(yè)日志:
POST http://URI:port/resourceestimator/translator/LOG_FILE_DIRECTORY 復(fù)制代碼發(fā)送
POST http://0.0.0.0:9998/resourceestimator/translator/data/resourceEstimatorService.txt 復(fù)制代碼underlying estimator將從日志文件中提取ResourceSkylines并將它們存儲在jobHistory SkylineStore中。
2.查詢作業(yè)的歷史ResourceSkylines:
GET http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId} 復(fù)制代碼發(fā)送
GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/* 復(fù)制代碼underlying estimator將返回歷史SkylineStore中的所有記錄。在示例文件中能夠看到兩次運(yùn)行tpch_q12的ResourceSkylines:tpch_q12_0和tpch_q12_1。
3.預(yù)測作業(yè)的資源使用情況:
GET http://URI:port/resourceestimator/estimator/{pipelineId} 復(fù)制代碼發(fā)送
http://0.0.0.0:9998/resourceestimator/estimator/tpch_q12 復(fù)制代碼estimator將根據(jù)其歷史ResourceSkylines預(yù)測新運(yùn)行的作業(yè)資源需求,并將預(yù)測的資源需求存儲到j(luò)obEstimation SkylineStore。
4.查詢作業(yè)的預(yù)測資源情況:
GET http://URI:port/resourceestimator/skylinestore/estimate/{pipelineId} 復(fù)制代碼發(fā)送
http://0.0.0.0:9998/resourceestimator/skylinestore/estimation/tpch_q12 復(fù)制代碼估算器將返回tpch_q12作業(yè)資源預(yù)測情況。
5.刪除作業(yè)的歷史資源情況數(shù)據(jù):
DELETE http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId} 復(fù)制代碼發(fā)送
http://0.0.0.0:9998/resourceestimator/skylinestore/history/tpch_q12/tpch_q12_0 復(fù)制代碼underlying estimator將刪除tpch_q12_0的ResourceSkyline記錄。重新發(fā)送
GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/* 復(fù)制代碼underlying estimator只返回tpch_q12_1的ResourceSkyline。
四.資源預(yù)測算法中用到的數(shù)據(jù)介紹
Hadoop-resource estimator的Translator組件會解析日志并將其按照一定規(guī)范的格式進(jìn)行拼接,下面給出了示例中的資源歷史使用數(shù)據(jù)和預(yù)測資源數(shù)據(jù),可以看到作業(yè)的歷史資源使用數(shù)據(jù)是同一個job的兩次run,分別為tpch_q12_0和tpch_q12_1,其主要給出了隨時間變化的memory和cpu的使用情況。其中第0時間單位表示的是container規(guī)格,為memory:1024,vcores:1,第25時間單位為作業(yè)結(jié)束時刻,memory和cpu皆為0。可以看到預(yù)測數(shù)據(jù)根據(jù)歷史數(shù)據(jù)給出了10~25時間單位的資源預(yù)測數(shù)據(jù)。
歷史資源使用數(shù)據(jù):
[[{"pipelineId":"tpch\_q12","runId":"tpch\_q12\_0"},[{"jobId":"tpch\_q12\_0","jobInputDataSize":0.0,"jobSubmissionTime":0,"jobFinishTime":25,"containerSpec":{"memory":1024,"vcores":1},"skylineList":{"resourceAllocation":{"0":{"memory":1024,"vcores":1},"10":{"memory":1099776,"vcores":1074},"15":{"memory":2598912,"vcores":2538},"20":{"memory":2527232,"vcores":2468},"25":{"memory":0,"vcores":0}}}}]],[{"pipelineId":"tpch\_q12","runId":"tpch\_q12\_1"},[{"jobId":"tpch\_q12\_1","jobInputDataSize":0.0,"jobSubmissionTime":0,"jobFinishTime":25,"containerSpec":{"memory":1024,"vcores":1},"skylineList":{"resourceAllocation":{"0":{"memory":1024,"vcores":1},"10":{"memory":813056,"vcores":794},"15":{"memory":2577408,"vcores":2517},"20":{"memory":2543616,"vcores":2484},"25":{"memory":0,"vcores":0}}}}]]] 復(fù)制代碼預(yù)測數(shù)據(jù):
{"resourceAllocation":"10":{"memory":1083392,"vcores":1058},"15":{"memory":2598912,"vcores":2538},"20":{"memory":2543616,"vcores":2484},"25":{"memory":0,"vcores":0}}} 復(fù)制代碼五.Resource Estimator Service算法框架與原理
在本部分將重點(diǎn)介紹一下estimator中用到的資源預(yù)測算法原理。此算法由微軟提出,其鏈接在文末參考資料中給出。下圖是estimator的運(yùn)行框架,可以看到其主要由三部分組成,下面分別介紹這三部分。
image六.算法原理剖析
微軟提出的此資源分配算法本質(zhì)上是一種最優(yōu)化算法,其優(yōu)化的目標(biāo)函數(shù)是由兩部分組成的線性組合,下文中stage的概念是指每個job的運(yùn)行期間按照一定規(guī)則劃分成多個時間片,每個時間片稱之為一個stage,下面分步驟闡述其算法原理。
1.首先定義一個目標(biāo)函數(shù),也可以稱之為損失函數(shù),即我們優(yōu)化的目標(biāo)。在此算法中由過分配和欠分配組成的線性組合組成損失函數(shù)costfunction。目標(biāo)就是minimize(cost=αA0(s)+(1?α)Au(s))。其中A0(s)表示在當(dāng)前stage的資源過分配值,其是由當(dāng)前stage的分配值減去此stage的歷史資源使用均值然后取平均得到,其公式表示為A0(s)=1N∑Ni=1∑k(sk?si,k)+,sk即為當(dāng)前的資源分配值,si,k即為第i次run的歷史資源使用值;Au(s)表示當(dāng)前stage的欠分配值,其是由上一stage的欠分配值加上當(dāng)前stage的欠分配值得到,公式表示如下:Di,k(s1,...,sk)=(Di,k+si,k?sk)+,Au(s)=1N∑Ni=1Di,k(s),下圖比較直觀的顯示了estimator在預(yù)測資源時的一種過分配與欠分配的情況。
2.針對每個stage,此算法的策略就是選擇可以使得costfunction最小的資源分配方式,即選擇一個值使得costfunction最小,即得到Sk,即每一個stage上的資源分配值。 因?yàn)榉峙渲凳枪潭ㄒ?guī)格的倍數(shù),所以在實(shí)現(xiàn)時可以通過簡單的for循環(huán)或者一些最優(yōu)化算法比如爬山法或者蟻群算法就可以快速得到最小值。
3.總結(jié):算法中的做法是針對一個job,根據(jù)其歷史運(yùn)行時間拿到其作業(yè)開始和結(jié)束時間,在這時間段內(nèi)按照一定規(guī)則劃分時間片,每一個時間片為一個stage,根據(jù)同一job多次run的歷史資源使用情況來預(yù)測下一run的資源使用情況。其每次配置的策略是使得costfunction最小。costfunction是過分配與欠分配的一個線性組合。
七.算法的測試效果
在本次測試中運(yùn)行tpch_q12作業(yè)9次,并在每次運(yùn)行中收集作業(yè)的資源skylines。然后,在Resource Estimator Service中運(yùn)行日志解析器,從日志中提取ResourceSkylines并將它們存儲在SkylineStore中。下面繪制了作業(yè)的ResourceSkylines以進(jìn)行演示。
在Resource Estimator Service中運(yùn)行估算器來預(yù)測新運(yùn)行的資源需求,下面繪制了預(yù)測的資源需求數(shù)據(jù)。可以看到預(yù)測數(shù)據(jù)根據(jù)歷史資源使用情況較好地表征了下一次運(yùn)行的資源使用數(shù)據(jù),有一定的參考意義。另外在實(shí)際場景業(yè)務(wù)上的測試效果還有待考證。
八.參考
1.Resourcemanager Estimator Service
2.微軟算法文章
相關(guān)閱讀
簡單聊聊py的高性能編程
Prometheus 初體驗(yàn)
IF函數(shù)——放松工作,享受生活!
【每日課程推薦】機(jī)器學(xué)習(xí)實(shí)戰(zhàn)!快速入門在線廣告業(yè)務(wù)及CTR相應(yīng)知識
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請點(diǎn)擊
搜索關(guān)注公眾號「云加社區(qū)」,第一時間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!
海量技術(shù)實(shí)踐經(jīng)驗(yàn),盡在云加社區(qū)!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的ResourceManager中的Resource Estimator框架介绍与算法剖析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Optaplanner终于支持多线程并行
- 下一篇: 20165232 缓冲区溢出漏洞实验