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

时间:2017-08-16 02:22:50

标签: performance apache-spark hadoop apache-spark-sql bigdata

spark.default.parallelismSparkSQL之间有什么区别?

我试图在var myfunc = function(){ //do something setTimeout(function(){ myfunc(); }, 100); }(); 中设置它们,但第二阶段的任务编号始终为200.

2 个答案:

答案 0 :(得分:52)

从答案here开始,spark.sql.shuffle.partitions配置为连接或聚合数据移动数据时使用的分区数。

spark.default.parallelismRDD转换后返回的默认分区数,如joinreduceByKeyparallelize未由用户明确设置。请注意,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

答案 1 :(得分:1)

spark.default.parallelism 是spark设置的默认分区数,默认为200。 并且如果要增加分区数,则可以应用属性 spark.sql.shuffle.partitions 在spark配置中或运行spark SQL时设置分区数。

通常,当我们出现内存拥塞并看到以下错误时,会使用此 spark.sql.shuffle.partitions : 发生火花错误:java.lang.IllegalArgumentException:大小超过Integer.MAX_VALUE

因此,您可以为每个分区分配256 MB的分区,并可以用于设置进程。

另外

如果分区数接近2000,则将其增加到2000以上。由于spark对<2000和> 2000分区应用了不同的逻辑,这将通过减少内存占用量来提高代码性能,因为如果默认情况下数据将被高度压缩> 2000。