美文网首页
178、Spark运维管理进阶之作业资源调度Fair Sched

178、Spark运维管理进阶之作业资源调度Fair Sched

作者: ZFH__ZJ | 来源:发表于2019-02-11 13:20 被阅读0次

要启用Fair Scheduler,只要简单地将spark.scheduler.mode属性设置为FAIR即可

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.scheduler.mode", "FAIR")
val sc = new SparkContext(conf)

或者

--conf spark.scheduler.mode=FAIR

默认池

fair scheduler也支持将job分成多个组并放入多个池中,以及为每个池设置不同的调度优先级。这个feature对于将重要的和不重要的job隔离运行的情况非常有用,可以为重要的job分配一个池,并给予更高的优先级; 为不重要的job分配另一个池,并给予较低的优先级。

默认情况下,新提交的job会进入一个默认池,但是job的池是可以通过spark.scheduler.pool属性来设置的。

如果你的spark application是作为一个服务启动的,SparkContext 7*24小时长时间存在,然后服务每次接收到一个请求,就用一个子线程去服务它
在子线程内部,去执行一系列的RDD算子以及代码来触发job的执行
在子线程内部,可以调用SparkContext.setLocalProperty("spark.scheduler.pool", "pool1")

在设置这个属性之后,所有在这个线程中提交的job都会进入这个池中。同样也可以通过将该属性设置为null来清空池子。

池的默认行为

默认情况下,每个池子都会对集群资源有相同的优先使用权,但是在每个池内,job会使用FIFO的模式来执行。
举例来说,如果要为每个用户创建一个池,这就意味着每个用户都会获得集群的公平使用权,但是每个用户自己的job会按照顺序来执行。

配置池的属性

可以通过配置文件来修改池的属性。每个池都支持以下三个属性:

1、schedulingMode: 可以是FIFO或FAIR,来控制池中的jobs是否要排队,或者是共享池中的资源
2、weight: 控制每个池子对集群资源使用的权重。默认情况下,所有池子的权重都是1.
如果指定了一个池子的权重为2。举例来说,它就会获取其他池子两倍的资源使用权。设置一个很高的权重值,比如1000,也会很有影响,基本上该池子的task会在其他所有池子的task之前运行。
3、minShare: 除了权重之外,每个池子还能被给予一个最小的资源使用量。

池子的配置是通过xml文件来配置的,在spark/conf的fairscheduler.xml中配置
我们自己去设置这个文件的路径,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>

相关文章

网友评论

      本文标题:178、Spark运维管理进阶之作业资源调度Fair Sched

      本文链接:https://www.haomeiwen.com/subject/tatijqtx.html