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.mzph.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。下面这篇文章主要给大家…