对Spark2.2.0文档的学习2-Job Scheduling
Job Scheduling
Link:http://spark.apache.org/docs/2.2.0/job-scheduling.html
概况:
(1)集群中多个应用的调度主要考虑的是不同应用能够使用的集群资源的情况,即CPU以及内存资源,包括静态(Standalone,Mesos、Yarn)和动态(Mesos)的方式,动态资源分配方式需要考虑相应的请求资源的策略和放弃资源的策略。
(2)每个应用内部的调度考虑的是Spark调度器执行“jobs”的方式,默认为FIFO,可以配置成Fair模式。Fair模式下还有pool的概念,pool可以配置三种属性schedulingMode,weight以及minShare。
1、Scheduling Across Applications
一个集群中有多个Spark Application,每个Application独立的启动JVMs运行executors去执行任务以及存储数据。对于多个Application的资源的分配,有两种方案。最简单的是static partitioning每个应用得到它能够得到的最大数量的资源(Standalone mode,Mesos,Yarn都支持,每种需要配置一些参数,指定能够使用的CPU核数以及内存资源)。Mesos支持dynamic sharing of CPU cores。
此外,目前所有的模式都不支持不同应用之间的内存共享。
动态资源分配:
Spark提供基于负载动态调整应用占据的资源的机制。如果一个集群中有多个应用运行,这个机制时很有用的。This feature is disabled by default and available on all coarse-grained cluster managers, i.e. standalone mode, YARN mode, and Mesos coarse-grained mode.
资源分配策略:
Spark移除或者请求executors的启发式规则如下
Request Policy:动态资源分配开启的情况下, when it has pending tasks waiting to be scheduled.还有挂起的任务需要被调度时,即已有的executors不能同时满足所有的task,这时候Spark requests executors in rounds。
Remove Policy:A Spark application removes an executor when it has been idle for more than spark.dynamicAllocation.executorIdleTimeout
seconds.空闲超过一定的时间。
2、Scheduling Within an Application
(1)每个Spark应用(SparkContext实例)中,如果jobs由多个线程提交,那么多个并行的jobs可以同时运行。 By “job”, in this section, we mean a Spark action (e.g. save
, collect
) and any tasks that need to run to evaluate that action.
默认情况下,Spark的调度器以FIFO的方式运行jobs。从Spark0.8开始,也可以配置fair sharing的方式
(2)
Fair Scheduler支持将jobs组织成pools,然后给每个pool设置不同的调度选项。例如为高优先级的jobs创建一个high Priority pool、或者为每个用户的jobs创建一个pool。
pool的默认行为:By default, each pool gets an equal share of the cluster (also equal in share to each job in the default pool), but inside each pool, jobs run in FIFO order.
Pool的属性选项:
(1)schedulingMode
: This can be FIFO or FAIR,决定pool中jobs对资源的获取方式
(2)weight
: This controls the pool’s share(占有率) of the cluster relative to other pools.控制对集群资源的占有率
(3)minShare
: ensure that a pool can always get up to a certain number of resources