欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~html
本文由 宋超发表于 云+社区专栏
本文首先介绍了Hadoop中的ResourceManager中的estimator service的框架与运行流程,而后对其中用到的资源估算算法进行了原理剖析。算法
估计做业运行使用资源是大数据处理集群的一个重要且具备挑战性的问题。随着用户使用的集群资源愈来愈多,这一需求被逐渐放大。当前现有的解决方案通常是依赖于用户的经验来对做业资源需求进行估计,这样即繁琐又低效。根据对集群工做负载的分析,能够发现大部分工做(超过60%)是重复工做,这样咱们便有机会根据做业历史资源使用状况来估计做业下一次的资源需求量。同时,在将来,但愿能提出一种与框架无关的黑盒解决方案。这样,即便做业来自不一样的计算框架,咱们也能对重复性做业进行资源需求估算。apache
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来进行预测(其中用到的算法模型会在后面进行讲解)。oop
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}}}
在本部分将重点介绍一下estimator中用到的资源预测算法原理。此算法由微软提出,其连接在文末参考资料中给出。下图是estimator的运行框架,能够看到其主要由三部分组成,下面分别介绍这三部分。
image
微软提出的此资源分配算法本质上是一种最优化算法,其优化的目标函数是由两部分组成的线性组合,下文中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 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!