分布式调度系统(3)——任务分配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式调度系统(3)——任务分配相关的知识,希望对你有一定的参考价值。

参考技术A

将任务分配到具体执行节点。

以上配置信息保存在 /config/job/jobName 节点。

任务分配的目标是:让当前工作尽可能均衡地在各执行节点上执行。
触发任务分配的事件,可能是:

任务分配单元 : 将任务拆分为最小可执行的粒度,如:一个父任务、一个shard子任务,一个子任务,作为一个分配单元。每个分配单元包括:(父任务名称,子任务shardItem序号/childIndex流水号,load)。
待分配任务列表 :按任务分类,每个任务形成一个待分配列表,按load倒叙、sharingItem/childIndex正序 排序。
节点下线 :在节点下线的场景,需要将故障节点下的任务摘下,按任务放入多个待分配任务列表。
任务启动 :对于任务启动的场景,任务下所有的任务分配单元均需要重新分配,都放入到待分配任务列表中。
节点上线 :在节点上线的场景中,需读取 /config/node/nodeName 数据, 确定受影响的任务。读取 /runtime/job/jobName/availableNodes/nodeName 确认受影响的节点。 计算新节点上线后平均每节点load,从负载最多的节点摘下。摘取时,每次摘取不同任务,直至节点node在平均值以下。

构建节点列表,构建 Map<String /*node name*/ , Long /*node load*/ > 。

逐个任务分配,优先分配总load高的任务。
每个任务按load倒叙,每次分配分配到不同节点,优先分配总load低的node。
如果节点load已经高出平均值,则退出待分配node列表。

集群启动过程中, 节点不断加进来, 不断触发任务重新分配, 这是没有必要的。
冷冻时间 :集群初始启动过程中,第1个启动的节点确认没有其他节点后,会创建 /runtime/frozonTime 节点,节点数据为解冻的时间点(一般为5分钟后)。
在解冻时间到达之前,不触发任务分配。
创建冷冻节点的同时,清理availableNodes,和 /runtime/node/nodeName/job 。

集群收到 shutdown 调用后,开始关闭集群,关闭顺序:

分布式调度系统现状

来自于阿里云

https://edu.aliyun.com/course/31/learn?spm=5176.8764728.0.0.qDnlmZ#lesson/618

课时一:分布式调度系统的现状

分布式调度的两大任务:任务调度和资源调度

任务调度:大量的计算任务、任务如何让切分、数据如何分割运算、监控运算状态

资源调度:供给方、不同业务间的平衡资源、支持优先级抢占

 

分布式调度系统:Hadoop MR(map reduce) ,YARN, Mesos, Aliyun-Fuxi

hadoop的map-reduce 典型的主从关系,存在的问题是 规模扩展存在瓶颈,

1.每增加一个节点,task_track注册到job_track就要加载新的内存

2.容错性差,Job Tracker 单点没有failover 一旦宕机,就会造成信息丢失

3.不利于功能扩展,不同任务采用不同的调度策略

 

很难做到热拔插(不停止进程的情况下改变系统的调度行为)

YARN:

区别(与hadoop)

1.将资源调度与任务调度进行区分

2.可以支撑更大的计算规模

 

缺陷:

1.只支持内存维度的分配

2.资源的交互性能

 

{调度是一个背包问题:

考虑内存时,调度是一维线性规划,

增加资源时,调度是高维背包问题

所以YARN仅支持内存维度的问题

}

 

以上是关于分布式调度系统(3)——任务分配的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Python 构建一个简单的分布式系统

分布式调度系统现状

最新开源分布式定时任务调度系统

从0实现分布式任务调度系统--etcd基础操作

如何快速低成本开发功能强大的分布式任务调度系统

分布式任务调度的解决方案