spark.sql.shuffle.partitions和spark.default.parallelism有什么区别?


Answers:


97

这里的答案中,spark.sql.shuffle.partitions配置在对联接或聚合进行数据混排时使用的分区数。

spark.default.parallelism在分区的默认数量RDD通过转换返回好像joinreduceByKey以及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

4
关于这个数字应该是什么的任何建议...?
CpILL

1
@CpILL:这取决于您的情况,一些更多信息和有用的链接可以在这里找到:stackoverflow.com/questions/35800795/…。特别是,有关调优的Spark文档建议在集群中的每个CPU核心执行2-3个任务。
沙伊多

您可以根据可提供给执行者的整个节点上的可用内存确定分区的默认数量。所以这是简单的公式 分区数=(可用RAM以MB为单位)/ 256,即每个分区256MB。
阿米特·坎德尔沃尔

2
这里有些困惑。spark.sql.shuffle.partitions配置用于联接或聚集的分区。然后,您说spark.default.parallelism用于诸如join,reduceByKey之类的转换。难道也没有那些联接或聚集?
vi_ral

@Shaido即使我应用了--conf spark.sql.shuffle.partitions = 300,仍然可以看到生成了很多阶段,并且大多数阶段没有记录,这导致Jave堆OOM异常,如何处理这个情况?
BdEngineer

11

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,则默认压缩数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.