概况
spark提供了一些方案来调度资源。首先,每个spark程序都在跑在若干个独立的executor集群上的(其中executor是一个jvm来run task和store data),集群管理提供了集群层面的资源分配。其次,对于每一个spark程序来说,多个由不同进程提交的job(actions)可以并行的执行。这种情况很常见,sparkContext提供了一种公平调度的机制。
spark程序间的调度
不同的用户使用同一个集群,并使用不同的配置。最初需要解决的就是资源的分割。目前常见的分配原则有下列三种,其中yarn最常用。
- standalone 默认情况下spark程序是FIFO的形式被提交的,并占用所有可用资源。可以通过设置spark.cores.max控制占用core的数量,并通过spark.executor.memory控制每个executor使用的内存。
- yarn 主要通过 –num-executors或spark.executor.instances、–executor-memory或spark.executor.memory、–executor-cores或spark.executor.cores来控制。
目前不同的spark 程序之间不可以共享数据。但是可以通过获取和释放共享资源,比如动态资源分配。
spark程序内的调度
由不同线程提交的并行的job可以被同时执行,spark内部的调度是线程安全的。
一般来说,spark的调度是FIFO的,每个job还可以分成stages。如果第一个job中的stage有task运行,之后的job就需要等待。
从spark0.8开始,可以配置公平调度器,spark 分配tasks是以一种轮询的方式,短的job可以提前被执行完。可以在sparkContext中设置
spark.scheduler.mode=FAIR
公平调度池
公平调度池提供了一种方式将jobs一起放到某个资源池中,可以给某些重要的jobs提供高优先级的资源。可以保证需要重要jobs可以提前完成。
一般情况下,jobs被提交到了default pool中,不过可以在代码中随时控制当前线程的job在哪个pool中执行,比如sc.setLocalProperty(“spark.scheduler.pool”,”pool”),也可以取消使用当前的pool,sc.setLocalProperty(“spark.scheduler.pool”, null)
以上的使用都需要配置pool的配置文件。具体有三个参数,参数的含义如下:
- schedulingMode: 可以使FIFO和FAIR,控制pool中job的执行模式。
- weight: 控制和其他pool对集群资源的占用权重,默认为1,如果设置为2,这个pool就会获取2倍的资源。不仅如此,还可以控制jobs的执行时间,同时如果设置为1000,此pool总是启动tasks无论什么时候jobs active。
- minShare 最基本的资源分配。先满足此值,然后再分配weight
可以通过设置conf.set(“spark.scheduler.allocation.file”, “/path/to/file”)使用自己配置的文件。格式如下:
<?xml version="1.0"?>
<allocations>
<pool name="production">
<schedulingMode>FAIR</schedulingMode>
<weight>1</weight>
<minShare>2</minShare>
</pool>
<pool name="test">
<schedulingMode>FIFO</schedulingMode>
<weight>2</weight>
<minShare>3</minShare>
</pool>
</allocations>
如果在代码中使用sc.setLocalProperty(“spark.scheduler.pool”, “pool1”),并且不配置上述文件,每个分配池基本都是使用FIFO,weight=1,minshare=0.