spark3.0-python教程-SparkSQL:默认shuffle 有200个分区,设置分区数(spark.sql.shuffle.partitions)

案例

默认shuffle 有200个分区

执行下面的代码:

from time import sleep
import findspark
findspark.init()

from pyspark.sql import  SparkSession 

spark = SparkSession.builder.\
    appName("test").\
    master("local[*]").\
    enableHiveSupport().\
    getOrCreate()

spark.sparkContext.setLogLevel("ERROR")

# 200个任务
df = spark.sql("select gender,avg(age) as avg_age from soh_student group by gender order by avg_age")

# 75+100+20+4+2个任务
# df = spark.sql("select gender,avg(age) as avg_age from soh_student group by gender order by avg_age")

df.show()

sleep(60) # 休眠60秒
spark.stop()

执行上面的代码时,控制显示如下:

可见有 200个任务

查看 web 监控页面

访问 http://hadoop1:4040 ,页面如下:

有 200个任务

点击超链接,显示如下:

有一个操作,开启了 200个任务,点击该任务的 超链接,显示如下:

是 shuffle 阶段

提出问题

默认 200个任务,有以下问题:

  • 单机运行,开启这么多任务,效率反而低
  • 集群运行,当数据量较小,开启这么多任务,浪费资源。而且任务执行时间较短,大部分时间都用在调度
  • 集群运行,当数据量较大,开启任务较少,不能充分利用集群资源,效率低

解决

设置初始分区的 1.5-2倍之间

config("spark.sql.shuffle.partitions", "2").\

代码

# 默认shuffle 有200个分区

from time import sleep
import findspark
findspark.init()

from pyspark.sql import  SparkSession 

spark = SparkSession.builder.\
    appName("test").\
    master("local[*]").\
    enableHiveSupport().\
    config("spark.sql.shuffle.partitions", "2").\
    getOrCreate()

spark.sparkContext.setLogLevel("ERROR")

# 200个任务
df = spark.sql("select gender,avg(age) as avg_age from soh_student group by gender order by avg_age")

df.show()

sleep(60)
spark.stop()

原文出处:/show_1IX3FeMc8ozc.html