概述
spark有多种方式调度各个计算所需的资源.
首先,每个application(即sparkContext实例)有一组独立的Executor进程。各种cluster manager(yarn Resource manager,standalone master等等)为application间的调度提供自己的方式。
其次,一个application内的各个job(spark action实例)也可能并行执行,前提是各个job是在独立的线程中提交。这种情况在处理网络请求的场景下是正常的,如shark。spark提供了fairscheduler来调度application内的job。
调度application
每个spark application有一组专有的executor jvm,这组jvm只用来跑这个application的任务,以及只存储这个application的数据。如果是多用户共享集群,不同的cluster manager,会有不同的资源分配(或调度)方式:
standalone模式:默认情况下,提交到集群的application以FIFO方式调度,每个被调度的application会使用所有的集群资源。你可以配置spark.cores.max来控制application的资源使用量;若未设置spark.core.max,也可以通过spark.deploy.defaultCores设置默认值。除了控制core的使用,也可以通过spark.executor.memory指定每个executor的内存使用量。
Mesos:在memos模式下,通过spark.mesos.coarse=true的配置可以启用静态分区(static partition)功能。同standalone模式一样,也可以通过spark.cores.max和spark.executor.memory分别配置core和内存的使用量。
yarn:在yarn模式下,--num-executors控制application使用的executor的数量,--executor-memory 和 --executor-cores分别控制core和内存使用。
对于memos,还可以实现CPU核心动态共享(dynamic sharing of CPU cores)。这种模式下,每个application同样具有固定和独立的内存,只是在计算空闲时,可以把core分配给其他application使用。这种模式在具有大量不是很活跃的application的情况下很有用。此模式的一个缺点是:当一个application需要重新获得属于自己的核心时,可能由于借用core的application正在计算而需要等待,造成不可预测的延迟。开启这种模式,只需要使用memos://URL以及spark.mesos.coarse设置为false(默认值就是false)。
请注意