Presto 任务调度: 任务分配到哪里

时间:2024-03-23 11:46:28

在调度任务时,有几个决策点,第一:分配多少个任务,第二:每个任务分配到哪些机器上。

要回答这个问题,首先把计算任务做一下分类,在presto内部有4种计算类型的节点:

  1. source节点,读源数据的节点,负责读取数据、Map阶段的计算任务。分配的个数由SplitManager根据数据决定。
  2. fixed节点,shuffle节点,用于处理reduce任务。比如group by计算,source阶段的数据按照hash发送到fixed节点。分配的个数由hash_partition_count这个session参数决定,由于是固定个数,所以对于不同的数据规模采用同样的个数也不是很合适,这也是需要改进的点。
  3. single节点,单节点计算任务,某些计算需要在单一节点计算,比如MergeReduce,output等,需要分配一个节点。
  4. coordinator only,只在coordinator节点计算的任务,一般是meta类操作。

Presto 任务调度: 任务分配到哪里

Presto是一个计算引擎,采用计算和存储分离的架构。所以,理论上来讲,上边回答清楚每个阶段分配多少个计算任务,然后按照随机的原则把task分配到每台机器上,并注意机器之间的负载均衡就足够了。

但是这样性能并不是最佳的。我们都知道,大规模的数据迁移是一件非常耗时的事情。在计算机硬件中,CPU、内存、磁盘、网卡,这些硬件中,网卡的性能提升是最慢的,在整个分布式系统中也是性能最差的。
因此在调度上presto提供了一种基于拓扑的调度算法(Topology Aware schedule),以使source节点尽量靠近数据。

拓扑调度算法Topology Aware Scheduling strategy

Presto 任务调度: 任务分配到哪里

Presto把集群资源划分成两级结构(Machine,集群)(包含机架的三级结构是我们的实现方式,不是presto原生的算法)。

分配算法如下:

  1. 当分配一个split时候,会给定split的一个地址,这个地址代表期望的分配地址。
  2. 从Machine层开始查找,首先查看Machine上已经分配的split个数是否已满,若未满则分配该机器,
  3. 若Machine资源池已满,然后查看机架级别的资源池。多个机器组成一个机架。然后在同一个机架找出一台机器,这台机器的资源池小于75%,则分配这台机器。
  4. 如果在机架级别找不到可用机器,则到集群级别找一台机器,这台机器的资源池使用量小于50%,则分配这台机器。否则分配失败。

presto代码提供了Machine/集群的两级拓扑结构,但是架构上提供一个基础的多级分配策略,因此我们增加了机架级别的资源调度。我们知道,同一个机架内机器在一个交换机下,网络速度要快于跨机架传输。

Presto调度上的其他优化点

presto提供了基础的调度能力,这个调度策略是很简单的,如果要实现精细化的调度,还有很多工作可以做。例如:

  1. 上文提到的Fix Count Scheduler,对所有的计算采用固定的节点个数。这个可以通过CBO,衡量不同数据源的大小,以及计算的复杂度,分配不同的节点个数。
  2. 上文提到的机架级别调度。
  3. 在资源池的管理上,简单以split的个数来衡量,但是我们知道每个split对应的数据量和计算复杂度是不一样的。因此更加精细化的策略是根据统计数据预估split消耗的内存/cpu。