ResourceManager中的Resource Estimator框架介紹與算法剖析

歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~

本文由宋超發表于云+社區專欄

本文首先介紹了Hadoop中的ResourceManager中的estimator service的框架與運行流程,然后對其中用到的資源估算算法進行了原理剖析。

一. Resource Estimator Service的出發點與目標

估計作業運行使用資源是大數據處理集群的一個重要且具有挑戰性的問題。隨著用戶使用的集群資源越來越多,這一需求被逐漸放大。當前現有的解決方案一般是依賴于用戶的經驗來對作業資源需求進行估計,這樣即繁瑣又低效。根據對集群工作負載的分析,可以發現大部分工作(超過60%)是重復工作,這樣我們便有機會根據作業歷史資源使用情況來估計作業下一次的資源需求量。同時,在未來,希望能提出一種與框架無關的黑盒解決方案。這樣,即使作業來自不同的計算框架,我們也能對重復性作業進行資源需求估算。

二. Resource Estimator Service的框架結構

Hadoop-resource estimator主要由三個模塊組成:Translator,SkylineStore和Estimator。下面分別介紹這三部分。

1.ResourceSkyline用來表征作業在其生命周期中的資源利用率。它使用RLESparseResourceAllocation記錄容器分配的信息。RecurrenceId用于標識重復pipeline的特定運行。pipeline可以包含多個作業,每個作業都有一個ResourceSkyline來表征其資源利用率。

2.Translator用來解析作業日志,提取他們的ResourceSkylines并將它們存儲到SkylineStore。SingleLineParser解析日志流中的一行并提取ResourceSkyline。

3.SkylineStore充當Hadoop-resource estimator的存儲層,由2部分組成。HistorySkylineStore存儲由轉換程序提取的ResourceSkylines。它支持四種操作:addHistory,deleteHistory,updateHistory和getHistory。addHistory將新的ResourceSkylines附加到定期pipeline,而updateHistory刪除特定定期pipeline的所有ResourceSkyline,并重新插入新的ResourceSkylines。PredictionSkylineStore存儲由Estimator生成的預測RLESparseResourceAllocation。它支持兩個操作:addEstimation和getEstimation。

4.Estimator根據歷史記錄運行預測重復出現的pipeline資源需求,將預測存儲到SkylineStore并在YARN上進行資源預留。Solver讀取特定定期pipeline的所有歷史ResourceSkylines,并預測其包含在RLESparseResourceAllocation中的新資源需求。目前,Hadoop-resource estimator提供了一個LPSOLVER來進行預測(其中用到的算法模型會在后面進行講解)。

三.以示例demo演示其運行流程

Resource Estimator Service的URI是http://0.0.0.0,默認服務端口是9998

(在ResourceEstimatorServiceHome/conf/resourceestimator-config.xml” 中配置)。 在 ResourceEstimatorServiceHome/data中,有一個示例日志文件resourceEstimatorService.txt,其中包含2次運行的tpch_q12查詢作業的日志。進行資源預測主要有以下幾個步驟:

1.解析作業日志:

POST http://URI:port/resourceestimator/translator/LOG_FILE_DIRECTORY
復制代碼

發送

POST http://0.0.0.0:9998/resourceestimator/translator/data/resourceEstimatorService.txt
復制代碼

underlying estimator將從日志文件中提取ResourceSkylines并將它們存儲在jobHistory SkylineStore中。

2.查詢作業的歷史ResourceSkylines:

GET http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}
復制代碼

發送

GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*
復制代碼

underlying estimator將返回歷史SkylineStore中的所有記錄。在示例文件中能夠看到兩次運行tpch_q12的ResourceSkylines:tpch_q12_0和tpch_q12_1。

3.預測作業的資源使用情況:

GET http://URI:port/resourceestimator/estimator/{pipelineId}
復制代碼

發送

http://0.0.0.0:9998/resourceestimator/estimator/tpch_q12
復制代碼

estimator將根據其歷史ResourceSkylines預測新運行的作業資源需求,并將預測的資源需求存儲到jobEstimation SkylineStore。

4.查詢作業的預測資源情況:

GET http://URI:port/resourceestimator/skylinestore/estimate/{pipelineId}
復制代碼

發送

http://0.0.0.0:9998/resourceestimator/skylinestore/estimation/tpch_q12
復制代碼

估算器將返回tpch_q12作業資源預測情況。

5.刪除作業的歷史資源情況數據:

DELETE http://URI:port/resourceestimator/skylinestore/history/{pipelineId}/{runId}
復制代碼

發送

http://0.0.0.0:9998/resourceestimator/skylinestore/history/tpch_q12/tpch_q12_0
復制代碼

underlying estimator將刪除tpch_q12_0的ResourceSkyline記錄。重新發送

GET http://0.0.0.0:9998/resourceestimator/skylinestore/history/*/*
復制代碼

underlying estimator只返回tpch_q12_1的ResourceSkyline。

四.資源預測算法中用到的數據介紹

Hadoop-resource estimator的Translator組件會解析日志并將其按照一定規范的格式進行拼接,下面給出了示例中的資源歷史使用數據和預測資源數據,可以看到作業的歷史資源使用數據是同一個job的兩次run,分別為tpch_q12_0和tpch_q12_1,其主要給出了隨時間變化的memory和cpu的使用情況。其中第0時間單位表示的是container規格,為memory:1024,vcores:1,第25時間單位為作業結束時刻,memory和cpu皆為0。可以看到預測數據根據歷史數據給出了10~25時間單位的資源預測數據。

歷史資源使用數據:

[[{"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}}}}]]]
復制代碼

預測數據:

{"resourceAllocation":"10":{"memory":1083392,"vcores":1058},"15":{"memory":2598912,"vcores":2538},"20":{"memory":2543616,"vcores":2484},"25":{"memory":0,"vcores":0}}}
復制代碼

五.Resource Estimator Service算法框架與原理

在本部分將重點介紹一下estimator中用到的資源預測算法原理。此算法由微軟提出,其鏈接在文末參考資料中給出。下圖是estimator的運行框架,可以看到其主要由三部分組成,下面分別介紹這三部分。

image

  1. Automatic interence,提取出作業的運行時間和歷史資源使用情況。 (a) Extractor of target,能提取出作業的運行開始與結束時間。 (b) Job resource model,能提取出作業的資源使用情況,例如作業資源隨時間運行的變化情況和資源使用總量。
  2. Recurring Reservation,此部分包括有Job Resource Model,可以根據作業歷史運行時間與作業歷史資源使用情況給出下一任務的資源使用情況。 (a) 通過改變參數α,可以控制estimator在分配資源的時候是側重過分配還是側重欠分配。 (b) 根據作業資源預測模型給出的預測值為作業在原來分配的資源的基礎上添加資源添加agenda。此job下一個run就運行在此資源分配的基礎上。
  3. Dynamic Reprovisioning,此部分根據前面給出的資源agenda,動態調整作業的每個運行階段的資源分配。

六.算法原理剖析

微軟提出的此資源分配算法本質上是一種最優化算法,其優化的目標函數是由兩部分組成的線性組合,下文中stage的概念是指每個job的運行期間按照一定規則劃分成多個時間片,每個時間片稱之為一個stage,下面分步驟闡述其算法原理。

1.首先定義一個目標函數,也可以稱之為損失函數,即我們優化的目標。在此算法中由過分配和欠分配組成的線性組合組成損失函數costfunction。目標就是minimize(cost=αA0(s)+(1?α)Au(s))。其中A0(s)表示在當前stage的資源過分配值,其是由當前stage的分配值減去此stage的歷史資源使用均值然后取平均得到,其公式表示為A0(s)=1N∑Ni=1∑k(sk?si,k)+,sk即為當前的資源分配值,si,k即為第i次run的歷史資源使用值;Au(s)表示當前stage的欠分配值,其是由上一stage的欠分配值加上當前stage的欠分配值得到,公式表示如下:Di,k(s1,...,sk)=(Di,k+si,k?sk)+,Au(s)=1N∑Ni=1Di,k(s),下圖比較直觀的顯示了estimator在預測資源時的一種過分配與欠分配的情況。

2.針對每個stage,此算法的策略就是選擇可以使得costfunction最小的資源分配方式,即選擇一個值使得costfunction最小,即得到Sk,即每一個stage上的資源分配值。 因為分配值是固定規格的倍數,所以在實現時可以通過簡單的for循環或者一些最優化算法比如爬山法或者蟻群算法就可以快速得到最小值。

3.總結:算法中的做法是針對一個job,根據其歷史運行時間拿到其作業開始和結束時間,在這時間段內按照一定規則劃分時間片,每一個時間片為一個stage,根據同一job多次run的歷史資源使用情況來預測下一run的資源使用情況。其每次配置的策略是使得costfunction最小。costfunction是過分配與欠分配的一個線性組合。

七.算法的測試效果

在本次測試中運行tpch_q12作業9次,并在每次運行中收集作業的資源skylines。然后,在Resource Estimator Service中運行日志解析器,從日志中提取ResourceSkylines并將它們存儲在SkylineStore中。下面繪制了作業的ResourceSkylines以進行演示。

在Resource Estimator Service中運行估算器來預測新運行的資源需求,下面繪制了預測的資源需求數據。可以看到預測數據根據歷史資源使用情況較好地表征了下一次運行的資源使用數據,有一定的參考意義。另外在實際場景業務上的測試效果還有待考證。

八.參考

1.Resourcemanager Estimator Service

2.微軟算法文章

相關閱讀

簡單聊聊py的高性能編程

Prometheus 初體驗

IF函數——放松工作,享受生活!

【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由作者授權騰訊云+社區發布,更多原文請點擊

搜索關注公眾號「云加社區」,第一時間獲取技術干貨,關注后回復1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在云加社區!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281903.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

幾十款 WPF 控件 - UI 庫,總有一款適合你

幾十款 WPF 控件 - UI 庫,總有一款適合你獨立觀察員 2022 年 10 月 16 日引言眾所周知,使用 WPF 框架能夠開發出功能強大、界面美觀的桌面端應用。能夠達到這個效果,各種 WPF 的控件庫、UI 庫功不可沒。所以,想著能不能收集一下目…

mysql將系統權限授予用戶_mysql創建用戶并授予權限

1、create schema [數據庫名稱] default character set utf8 collate utf8_general_ci;--創建數據庫采用create schema和create database創建數據庫的效果一樣。2、create user ‘[用戶名稱]‘‘%‘ identified by ‘[用戶密碼]‘;--創建用戶密碼8位以上,包括&#…

Android Studio導出jar包

Eclipse直接有個Export,可以直接導出jar包。AS相對Eclipse變化很大,編譯腳本變成了Gradle,各種導包操作都有差異。 下面是AS導出jar的過程: 第一步,修改app下的build.grade。 apply plugin: com.android.application修改為 apply …

GitHub Actions構建鏡像并部署服務

目的通過GitHub的Actions來(白嫖)部署.Net服務到阿里云服務器。環境準備需要一個阿里云服務器并且該服務器還安裝了docker環境,如果環境安裝不清楚可以查看之前的文章。創建鏡像倉庫在阿里云的容器鏡像服務中,創建一個鏡像倉庫用來存儲我們測試的鏡像&am…

20165232 緩沖區溢出漏洞實驗

緩沖區溢出漏洞實驗 實驗準備 實驗環境需要32位的Linux系統,需要下載安裝一些用于編譯 32 位 C 程序的軟件包,代碼如下: $ sudo apt-get update$ sudo apt-get install -y lib32z1 libc6-dev-i386$ sudo apt-get install -y lib32readline-gp…

使用qt的qtcore庫怎么包含_GitHub - coologic/QtCoreExamples: QtCore模塊相關類庫范例

QtCoreExamplesQtCore模塊相關類庫范例QJsonExampleQt進行Json文件讀寫范例QXmlExampleQt使用QXmlStreamReader/QXmlStreamWriter類進行XML文件讀寫范例非不是使用QtXML模塊QSharedMemoryExampleQt使用QSharedMemory實現共享內存QSettingsExample(Blog)Qt使用QSettings配置讀寫…

spfile

1 讓ORACLE自己主動從spfile啟動 SQL> create spfile/dev/vx/rdsk/vgora/lv_spfile from pfile; SQL> shutdown immediate; 改動initora11g.ora文件 /oracle/app/product/11g/db/dbs cp initora11g.ora initora11g.ora_bak echo SPFILE/dev/vx/rdsk/vgora/lv_spfil…

Atcoder 084D - Small Multiple(最短路徑+思維)

分析&#xff1a;這題腦洞新奇...居然是最短路...將0到k-1看做k個點&#xff0c;第t個點向(10*t0,1,2...,9)%k連一條長度為0,,1,2,..,9的邊&#xff0c;然后枚舉s1,2,...,9,算出所有從s到0的最短路&#xff0c;答案就是最短路s的最小值。 1 #include<iostream>2 #include…

Blazor學習之旅(5)數據綁定

【Blazor】| 總結/Edison Zhou大家好&#xff0c;我是Edison。最近在學習Blazor做全棧開發&#xff0c;因此根據老習慣&#xff0c;我會將我的學習過程記錄下來&#xff0c;一來體系化整理&#xff0c;二來作為筆記供將來翻看。本篇&#xff0c;我們來了解下在Blazor中數據是如…

chrome開啟touch屏幕點擊事件

2019獨角獸企業重金招聘Python工程師標準>>> 在chrome瀏覽器輸入 chrome://flags/#top-chrome-md 找到屬性 UI Layout for the browsers top chrome 選擇Hybrid&#xff0c;重啟chrome&#xff0c;如下圖&#xff1a; 轉載于:https://my.oschina.net/swingcoder/blo…

安卓如何更換wps黑金會員圖標_wps圖標(手機wps會員圖標黑色)

嘗試右鍵文件--打開方式--選擇默認程序,選擇wps程序,勾選始終以選擇的程序打開此文件,確定。如果還是不行的話,請嘗試做以下操作:點擊桌面左下角開始按鈕--在. 在WPS演示中,單擊“項目符號”,找到對應的那個即可。在WPS文字中,也是如此。 如題,如何做一個圖表,分別表…

Linux服務器重啟后crs_stat -t 命令無法正常使用以及解決思路

前提&#xff1a;在Linux系統中安裝ASM&#xff0c;安裝完ASM和Oracle數據庫時都是正常使用的&#xff0c;但在重啟服務器后Oracle相關命令不識別。1、[gridudevasm:/home/grid]$crsctl status res -t -bash: crsctl: command not found2、查看環境變量是否正常&#xff0c;命令…

英語十六個時態總結

下面用表格的形式給羅列出來&#xff0c;便于記憶 英語共有十六種時態&#xff0c;其表現形式如下(以study為例)&#xff1a; 一般時 進行時 完成時 完成進行時 現在 studystudies am studyingis studyingare studying have studiedhas studied have been studyinghas …

Python基礎--Python3基礎語法

Python3 基礎語法編碼默認情況下&#xff0c;Python3源碼文件以UTF-8編碼&#xff0c;所有字符串都是Unicode字符串。當然也可以為源碼文件指定不同的編碼&#xff0c;例如&#xff1a;# -*- coding: cp-1252 -*-標識符1.第一個字符必須是字母表中字母或下劃線&#xff1b;2.標…

3 Python os 文件和目錄

ile 對象使用 open 函數來創建&#xff0c;下表列出了 file 對象常用的函數&#xff1a; 序號方法及描述1 file.close() 關閉文件。關閉后文件不能再進行讀寫操作。 2 file.flush() 刷新文件內部緩沖&#xff0c;直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖…

python 打開某個exe_python定時檢查啟動某個exe程序(如果exe掛了)

詳見代碼如下&#xff1a;import threadingimport timeimport osimport subprocessdef get_process_count(imagename):p os.popen(tasklist /FI "IMAGENAME eq %s" % imagename)return p.read().count(imagename)def timer_start():t threading.Timer(120,watch_fu…

redis系列3---理解內存

理解內存 為什么要理解內存呢&#xff1f;redis所有的數據都存在內存中如何高效利用內存&#xff0c;實現用更少的內存存更多的數據&#xff0c;從而降低成本 如何統計內存使用&#xff1f;info memory可以獲取內存相關指標&#xff0c;如下&#xff1a;used_memory&#xff1a…

Google發布了Tensorflow Lite,用于移動電話的神經網絡庫

Google的工程副總Dave Burke宣布了一個專門針對移動電話而優化的Tensorflow新版本。\\這一新的軟件庫稱為Tensorflow Lite&#xff0c;允許開發人員在用戶的移動電話上實時地運行人工智能應用。據Burke介紹&#xff0c;該庫在設計上力求更快和更小的同時&#xff0c;依然支持最…

4. ZooKeeper 基本操作

ZooKeeper的數據模型及其API支持以下九個基本操作&#xff1a; 操作描述create在ZooKeeper命名空間的指定路徑中創建一個znodedelete從ZooKeeper命名空間的指定路徑中刪除一個znodeexists檢查路徑中是否存在znodegetChildren獲取znode的子節點列表getData獲取與znode相關的數據…

byte java byte_詳解java中的byte類型

Java中整數類型有:byte占8位, short 占16位, int占32位, long占64位Java也提供了一個byte數據類型&#xff0c;并且是基本類型中的整數類型。java byte是作為最小的數字來處理的&#xff0c;因此它的值域被定義為-128~127&#xff0c;也就是signed byte。下面這篇文章主要給大家…