RDD中的分区数和Spark中的性能

时间:2016-03-04 16:13:35

标签: performance apache-spark pyspark rdd

在Pyspark中,我可以从列表中创建RDD并确定要分区的数量:

sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)

我决定对RDD进行分区的分区数量如何影响性能? 这取决于我的机器核心数量如何?

3 个答案:

答案 0 :(得分:39)

主要影响是指定的分区太少或 分区太多。

分区太少您将无法使用群集中的所有可用核心。

分区太多管理许多小任务会产生过多的开销。

在两者之间,第一个对性能影响更大。对于低于1000的分区计数,此时调度太多小任务对此影响相对较小。如果您有数万个分区的数量级,那么spark会 非常

答案 1 :(得分:30)

为了添加到javadba的优秀答案,我记得文档建议将您的分区数设置为群集中CPU核心数的3或4倍,以便在可用的工作中更均匀地分配工作CPU核心。这意味着,如果群集中每个CPU核心只有1个分区,则必须等待一个运行时间最长的任务才能完成,但如果你进一步将其分解,则工作负载将更均匀地与快速和慢速运行的任务平衡

答案 2 :(得分:1)

分区数量对Spark代码性能有很大影响。理想情况下,spark分区表示您希望重新整理多少数据。通常,您应该根据随机播放大小(随机播放读写)设置此参数,然后可以决定每个分区的分区数量为128到256 MB,以获得最佳性能。

您可以通过将属性设置为在Spark sql代码中设置分区: spark.sql.shuffle.partitions 或者在使用任何数据框时,您可以通过belo进行设置: df.repartition(numOfPartitions)