历史资源使用数据:
[[{"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的运行框架,可以看到其主要由三部分组成,下面分别介绍这三部分。
imageAutomatic interence,提取出作业的运行时间和历史资源使用情况。 (a) Extractor of target,能提取出作业的运行开始与结束时间。 (b) Job resource model,能提取出作业的资源使用情况,例如作业资源随时间运行的变化情况和资源使用总量。
Recurring Reservation,此部分包括有Job Resource Model,可以根据作业历史运行时间与作业历史资源使用情况给出下一任务的资源使用情况。 (a) 通过改变参数α,可以控制estimator在分配资源的时候是侧重过分配还是侧重欠分配。 (b) 根据作业资源预测模型给出的预测值为作业在原来分配的资源的基础上添加资源添加agenda。此job下一个run就运行在此资源分配的基础上。
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以进行演示。