zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【秒懂Java】【01_初识Java】04_学习资料
    【秒懂Java】【01_初识Java】03_Java简介
    【秒懂Java】【01_初识Java】02_软件开发
    【秒懂Java】【01_初识Java】01_编程语言
    Apriori算法
    Java并发编程--ThreadLocal内存泄漏原因
    Java并发编程--锁
    Java并发编程--wait/notify/notifyAll 方法的使用
    Java并发编程--线程的生命周期
    Java虚拟机--垃圾收集器--G1收集器
  • 原文地址:https://www.cnblogs.com/zz-ksw/p/12463799.html
Copyright © 2011-2022 走看看