首页 理论教育 集群资源申请与分配优化方案

集群资源申请与分配优化方案

时间:2023-06-21 理论教育 版权反馈
【摘要】:Master节点在接收到应用程序的注册请求之后,会把应用放在等待队列当中,并调用我们之前提及过得Master.scheduler方法,Master.schedule方法对应的是Master进程的驱动程序/应用程序调度逻辑:首先是对Driver进程的调度,在YARN集群模式下,Driver程序可以运行在Worker节点上,因此Master节点需要专门分配相应的集群资源来运行Driver进程,采用的方法是随机把Driver分配到空闲的Worker之上,代码如下所示。这就是应用程序资源分配的过程。Worker接收到该消息之后,会记录资源消耗量,并启动新的Executor进程。

集群资源申请与分配优化方案

在集群环境下,Driver程序通过实例化CoarseGrainedSchedulerBackend类来实现Driver程序与集群之间的通信,不同的集群模式实例化不同的CoarseGrainedSchedulerBackend类的子类,对于Standalone集群管理器使用的是SparkDeploySchedulerBackend类,SparkDeploySchedulerB ackend类启动的时候会实例化一个AppClient类,AppClient会向Master节点发送应用注册请求,注册请求中会包含自己需求的资源情况,其中应用程序需要的核心数在配置参数spark.cores.max中配置,内存需求量则在配置参数spark.cores.memory中配置。注册过程的代码如下。

Master节点在接收到应用程序的注册请求之后,会把应用放在等待队列当中,并调用我们之前提及过得Master.scheduler方法,Master.schedule方法对应的是Master进程的驱动程序/应用程序调度逻辑:首先是对Driver进程的调度,在YARN集群模式下,Driver程序可以运行在Worker节点上,因此Master节点需要专门分配相应的集群资源来运行Driver进程,采用的方法是随机把Driver分配到空闲的Worker之上,代码如下所示。

Master节点在接收到应用程序的注册请求之后,会把应用放在等待队列当中,并调用我们之前提及过得Master.scheduler方法,Master.schedule方法对应的是Master进程的驱动程序/应用程序调度逻辑:首先是对Driver进程的调度,在YARN集群模式下,Driver程序可以运行在Worker节点上,因此Master节点需要专门分配相应的集群资源来运行Driver进程,采用的方法是随机把Driver分配到空闲的Worker之上,代码如下所示。

接下来调度具体的应用程序,多个应用程序之间采用FIFO调度方法,先注册的应用程序会优先被分配资源。单个应用程序内,则采用两套资源调度,分别是SpreadOut调度策略和非SpreadOut调度策略,可以通过配置参数spark.deploy.spreadOut进行配置。无论是哪种策略,Master进程都会检查所有Workers剩余的内存大小是否能够满足应用程序的最低需求,并且应用程序之前从没在该Worker上启动过Executor(换句话说,在一个Worker中,一个应用程序最多只会有一个Executor专门来为其服务),满足的话,才会参与调度过程。判断Workers是否可用的实现代码如下。

接下来调度具体的应用程序,多个应用程序之间采用FIFO调度方法,先注册的应用程序会优先被分配资源。单个应用程序内,则采用两套资源调度,分别是SpreadOut调度策略和非SpreadOut调度策略,可以通过配置参数spark.deploy.spreadOut进行配置。无论是哪种策略,Master进程都会检查所有Workers剩余的内存大小是否能够满足应用程序的最低需求,并且应用程序之前从没在该Worker上启动过Executor(换句话说,在一个Worker中,一个应用程序最多只会有一个Executor专门来为其服务),满足的话,才会参与调度过程。判断Workers是否可用的实现代码如下。

对于SpreadOut调度策略,Master节点采用轮询的方式,每个可用的Worker为应用程序贡献一个CPU核心,直到分配的核心能够满足应用程序的需求。SpreadOut调度的实现代码如下。

对于SpreadOut调度策略,Master节点采用轮询的方式,每个可用的Worker为应用程序贡献一个CPU核心,直到分配的核心能够满足应用程序的需求。SpreadOut调度的实现代码如下。(www.xing528.com)

对于非SpreadOut调度策略,会一次性把一个Worker上所有可分配的核心全部分配给应用程序。非SpreadOut调度的实现代码如下。

对于非SpreadOut调度策略,会一次性把一个Worker上所有可分配的核心全部分配给应用程序。非SpreadOut调度的实现代码如下。

被分配任务的Worker会调用addExecutor函数来添加相应的Executor,并调用launchExecutor方法来实际启动Executor,该方法会记录Worker被消耗的资源,并向对应的Worker发生消息,通知其启动Executor。Worker接收到该消息之后,会记录资源消耗量,并启动新的Executor进程。

这就是应用程序资源分配的过程。而应用程序内部,具体将任务调度给Executor的过程,7.4节中会讲述。

被分配任务的Worker会调用addExecutor函数来添加相应的Executor,并调用launchExecutor方法来实际启动Executor,该方法会记录Worker被消耗的资源,并向对应的Worker发生消息,通知其启动Executor。Worker接收到该消息之后,会记录资源消耗量,并启动新的Executor进程。

这就是应用程序资源分配的过程。而应用程序内部,具体将任务调度给Executor的过程,7.4节中会讲述。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈