使用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