spark thriftserver的多用户公平调度

使用SparkThrfitServer结合Hive来做即席查询,那么会遇到这样的问题,一个数据量很大的查询SQL把所有的资源全占了,导致后面的SQL都等待,尽管在等待的SQL只需要几秒就能完成。


表数据量

3亿+条,36G左右(partquet+snappy)

sql语句

sql1

且不要管sql合理不合理,就是想让它多计算一点

SELECT count(1)
FROM (
    SELECT google_gci
        ,google_gri
        ,count(1)
    FROM capacity.cell_pathloss_data_hangzhou
    GROUP BY google_gci
        ,google_gri
    ) a;

sql2

select * from capacity.cell_pathloss_data_hangzhou limit 10;

第1次:默认情况,也就是FIFO模式

启动thriftserver

/home/etluser/kong/spark/spark-2.3.4-bin/spark-2.3.4-bin-hadoop2.6/sbin/stop-thriftserver.sh

/home/etluser/kong/spark/spark-2.3.4-bin/spark-2.3.4-bin-hadoop2.6/sbin/start-thriftserver.sh 
--master yarn 
--driver-memory 1G 
--executor-memory 1G 
--num-executors 2 
--executor-cores 2 
--hiveconf hive.server2.thrift.bind.host=`hostname -i` 
--hiveconf hive.server2.thrift.port=9012

执行情况如图,可以看到,调度模式为FIFO,sql2一直未能执行

第2次:FAIR模式,不指定提交资源池(即default)

创建fairscheduler.xml文件

<allocations>
  <pool name="pool1">
    <schedulingMode>FAIR</schedulingMode>
    <weight>5</weight>
    <minShare>3</minShare>
  </pool>

  <pool name="pool2">
    <schedulingMode>FAIR</schedulingMode>
    <weight>2</weight>
    <minShare>1</minShare>
  </pool>
</allocations>

启动thriftserver

/home/etluser/kong/spark/spark-2.3.4-bin/spark-2.3.4-bin-hadoop2.6/sbin/stop-thriftserver.sh

/home/etluser/kong/spark/spark-2.3.4-bin/spark-2.3.4-bin-hadoop2.6/sbin/start-thriftserver.sh 
--master yarn 
--driver-memory 1G 
--executor-memory 1G 
--num-executors 2 
--executor-cores 2 
--conf spark.scheduler.mode=FAIR 
--conf spark.scheduler.allocation.file=/home/etluser/kong/spark/spark-2.3.4-bin/spark-2.3.4-bin-hadoop2.6/conf/fairscheduler.xml 
--hiveconf hive.server2.thrift.bind.host=`hostname -i` 
--hiveconf hive.server2.thrift.port=9012

执行情况如图,可以看到,调度模式为FAIR,但是默认提交到default资源池,default池默认为FIFO,sql2一直未能执行。

第3次:FAIR模式,提交任务到指定池

set spark.sql.thriftserver.scheduler.pool=pool1;

执行情况如图,可以看到,调度模式FAIR,提交到资源池poll1,后提交的sql2在sql1执行的同时也被执行了。

 

 

注意

1.FIFO模式并非一定是sql1先执行完,sql2才可以执行。如果在资源充足的情况下,sql2依旧能
及时执行。但是如果资源被sql1基本吃掉了,那sql2的执行会很慢甚至等到sql1执行完毕才能执行。

2.FAIR模式下,spark在多个job之间以轮询(round robin)的方式去调度task,这样所有的job都可以大致平等的共享集群资源
,更适合多用户的情景。

3.FAIR模式下,可以配置多个资源池,设置不同的优先级/权重,设置一个很高权重(比如1000)也可以让池之间保持一个优先级
,比如这里的权重是1000池当它有job存在时,总会先启动任务。


参考:http://spark.apache.org/docs/2.3.3/job-scheduling.html#scheduling-within-an-application

原文地址:https://www.cnblogs.com/zz-ksw/p/12463799.html