spark.sql.shuffle.partitions
和之间有什么区别spark.default.parallelism
?
我尝试将它们都设置为SparkSQL
,但是第二阶段的任务编号始终为200。
Answers:
从这里的答案中,spark.sql.shuffle.partitions
配置在对联接或聚合进行数据混排时使用的分区数。
spark.default.parallelism
在分区的默认数量RDD
通过转换返回好像join
,reduceByKey
以及parallelize
在不被用户显式设置。请注意,这spark.default.parallelism
似乎仅适用于原始RDD
数据,在使用数据框时将被忽略。
如果您正在执行的任务不是联接或聚合,而您正在使用数据框,则设置这些将不会有任何效果。但是,您可以通过在代码中调用df.repartition(numOfPartitions)
(不要忘记将其分配给new val
)来自行设置分区数。
要更改代码中的设置,您只需执行以下操作:
sqlContext.setConf("spark.sql.shuffle.partitions", "300")
sqlContext.setConf("spark.default.parallelism", "300")
另外,您可以通过以下方式将作业提交到集群时进行更改spark-submit
:
./bin/spark-submit --conf spark.sql.shuffle.partitions=300 --conf spark.default.parallelism=300
spark.default.parallelism是spark设置的默认分区数,默认为200。如果要增加分区数,则可以应用spark.sql.shuffle.partitions属性在spark配置或运行spark SQL时。
通常,此spark.sql.shuffle.partitions当发生内存拥塞并且正在看到以下错误时,将使用:spark error:java.lang.IllegalArgumentException:大小超过Integer.MAX_VALUE
因此设置您可以为每个分区分配一个256 MB的分区,并可以用来设置您的进程。
同样,如果分区数接近2000,则将其增加到2000以上。由于spark对<2000和> 2000分区应用了不同的逻辑,这将通过减少内存占用量来提高代码性能,因为如果> 2000,则默认压缩数据。