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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM