spark.sql.shuffle.partitions
和spark.default.parallelism
有什么区别?
我试图在SparkSQL
中设置它们,但第二阶段的任务编号总是200。
从here的答案中,spark.sql.shuffle.partitions
配置在为连接或聚合重排数据时使用的分区数。
spark.default.parallelism
是RDD
中的默认分区数,如join
,reduceByKey
和parallelize
等转换时未由用户明确设置。请注意,spark.default.parallelism
似乎只适用于原始RDD
,在使用数据帧时会被忽略。
如果您正在执行的任务不是连接或聚合,并且您正在使用数据框,那么设置这些将不会产生任何影响。但是,您可以通过在代码中调用df.repartition(numOfPartitions)
(不要忘记将其分配给新的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:Size超过Integer.MAX_VALUE
所以设置你的可以为每个分区分配256 MB的分区,并且可以用来为你的进程设置分区。
如果分区数接近2000,则将其增加到2000以上。由于spark为分区<2000和> 2000应用了不同的逻辑,这将通过减少内存占用来提高代码性能,因为如果> 2000,数据默认值将被高度压缩。