Spark应用程序之间调度

Spark程序之间调度资源分配策略分为两种情况:

所谓分配,简单来说就是Spark集群管理器为每个Spark程序,调配分发集群中CPU和内存的使用量的过程

静态资源分配:

      各Spark程序启动时一次性分配程序所需要的所有资源(主要是CPU,内存),在运行过程中一直独占,不发生改变;直到程序退出才释放资源,还给集群

动态资源分配:

      在各个Spark程序运行期间,由集群管理器根据各程序执行时的情况不断的调配各个程序所需要的资源(即动态),可按需增加或减少。 

动态资源分配的粒度为执行器,即增加减少的时执行器(一个spark程序在一个节点上只有一个执行器)也意味着Spark程序节点的增加减少,

要启动动态资源分配策略,需要设置spark.dynamicAllocation.enabled(目前只有在yarn模式下才可用)

    请求执行器策略

     当开启动态资源分配时,Spark应用程序中的所有Task会排队等待调度执行,根据等待间隔时间的设置,向集群资源管理器发起执行器资源的申请;这种情况足以说明当前Spark程序执行器资源不足,不足以并行执行所有的Task。

      Spark会一直循环向集群管理器请求执行器资源,请求规则是在Spark程序中的Task已经排队等待了spark.dynamicAllocation.schedulerBacklogTimeout秒后,还有其他Task在排队等待处理,就会间隔spark.dynamicAllocation.schedulerBacklogTimeout秒向集群资源管理器发起一次请求申请需要更多的执行器,随后每一次请求执行器的数量会成指数增长,如一个程序第一次会增加一个执行器请求数量,下一次数量是2,4,8......以此内推。

 移除执行器策略

当Spark程序的某一个执行器空闲状态超过spark.dynamicAllocation.executorIdleTimeout秒之后会被移除。

为了执行器能优雅退出(不导致数据失败或者执行任务中断),这里应启动额外shuffle外部服务,这个服务在集群的每个节点上都会有,并且是独立与spark程序和他们的执行器的;  这意味着在执行器退出前,其内部的数据会保存到这个外部服务中;之后的其他Spark执行器在请求这个执行器的时候都是从shuffle服务中获取文件而不是执行器中获取,以达到优雅移除执行器的目的


备注:目前StandaLone,Yarn,Mesos都不支持程序间内存共享的功能,可将相关RDD做成单独的服务,其他RDD都去访问它进行数据处理

猜你喜欢

转载自blog.csdn.net/weixin_34268579/article/details/87227684