【发布时间】:2018-01-24 01:00:03
【问题描述】:
spark.sql.shuffle.partitions 和 spark.default.parallelism 有什么区别?
我已经尝试将它们都设置在SparkSQL中,但是第二阶段的任务号总是200。
【问题讨论】:
标签: performance apache-spark hadoop apache-spark-sql
spark.sql.shuffle.partitions 和 spark.default.parallelism 有什么区别?
我已经尝试将它们都设置在SparkSQL中,但是第二阶段的任务号总是200。
【问题讨论】:
标签: performance apache-spark hadoop apache-spark-sql
根据答案here,spark.sql.shuffle.partitions 配置了在为联接或聚合打乱数据时使用的分区数。
spark.default.parallelism 是RDDs 中的默认分区数,当用户未明确设置时,由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 当我们有内存拥塞并且我们看到以下错误时使用它: 火花错误:java.lang.IllegalArgumentException:大小超过 Integer.MAX_VALUE
因此,将您可以分配的分区设置为每个分区 256 MB,您可以使用它来设置您的进程。
如果分区数接近 2000,则将其增加到 2000 以上。由于 spark 对分区 2000 应用不同的逻辑,这将通过减少内存占用来提高代码性能,因为数据默认是高度压缩的,如果>2000.
【讨论】: