offline job resource management的问题

假设我有一些分布式的、离线的计算任务需要运行。我有100台机器。每个任务有固定的资源需求。比如任务A需要30台,2个小时。任务B需要40台,3个小时。这些任务类型是固定的,但是任务数量以及什么时候被提交上来是未知的。此时对于资源管理器(resource manager)来说,就有了资源利用率和调度公平性之间的权衡考虑。

举个例子。假设我现在只有35台空闲机器,此时任务B先被提交上来,它需要40台机器。我不能满足它。接着,任务A被提交上来,它只需要30台机器,我可以满足它。那么要让任务A先于任务B开始运行吗?如果不允许,那么就会浪费很多机器资源。这时候平台部门就会遭遇质疑:为什么整个cluster有1/3都是闲着,却有让大量的job在排队?
如果允许,那么就会造成小任务优先、大任务饿死。同样会遭人质疑。就像餐馆里如果某座来的早却菜上的晚,那么服务员就得做好挨骂的准备。

There is no perfect rules。但对于大多数公司来说,机器空闲率都是重要的考核指标,公平性这东西太过于抽象,没法考核。所以对于平台部门,一般都会为了提高机器使用率而牺牲公平性。我觉得这也是KPI机制的弊端之一。

如果你什么都不想,只是让Hadoop的yarn来调度资源,每个app自己去找yarn的resource manager来申请资源。那么,yarn其实不知道app把机器申请去了之后有没有实际在用,所以不会在机器使用率上达到一个优化的调度。对于APP来说,它本来只需要40台机器3个小时,但是为了等到这40台机器可能要等10个小时,而这10个小时它可能一直在占用大量的机器。

只要资源很紧张,再接下来,几乎一定会遇到job优先级的问题。有了优先级,一般就会做oversell 以及 可抢占式调度。这样才能让高优先级的任务真正“优先”起来。否则只能人为的划分多个cluster,从而又降低了机器使用率。



此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥