RDD 中的分区数和 Spark 中的性能
Number of partitions in RDD and performance in Spark
在 Pyspark 中,我可以从列表创建 RDD 并决定有多少个分区:
sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)
我决定对 RDD 进行分区的分区数对性能有何影响?
这如何取决于我的机器的核心数量?
主要影响是指定太少的分区或 far 太多分区。
分区太少您将无法利用集群中所有可用的内核。
分区太多管理很多小任务会有过多的开销。
在两者之间,第一个对性能的影响要大得多。对于分区数低于 1000 的分区,安排太多的小型任务此时影响相对较小。如果分区数量达到数万个,那么 spark 会变得 very 慢。
为了补充 javadba 的出色答案,我记得文档建议将您的分区数设置为集群中 CPU 核心数的 3 或 4 倍,以便工作更均匀地分布在可用的 CPU 个核心。意思是,如果集群中每个 CPU 核心只有 1 个分区,则您将不得不等待最长的 运行 任务完成,但如果您将其进一步分解,工作负载将更加均衡有快有慢 运行 任务晚上出去。
分区数量对spark的代码性能有很大影响。
理想情况下,spark 分区意味着您要洗牌的数据量。通常你应该在你的 shuffle size(shuffle read/write) 上设置这个参数,然后你可以将分区数设置为每个分区 128 到 256 MB 以获得最大性能。
您可以在 spark sql 代码中设置分区,方法是将 属性 设置为:
spark.sql.shuffle.partitions
或
在使用任何数据框时,您可以通过以下方式进行设置:
df.repartition(分区数)
在 Pyspark 中,我可以从列表创建 RDD 并决定有多少个分区:
sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)
我决定对 RDD 进行分区的分区数对性能有何影响? 这如何取决于我的机器的核心数量?
主要影响是指定太少的分区或 far 太多分区。
分区太少您将无法利用集群中所有可用的内核。
分区太多管理很多小任务会有过多的开销。
在两者之间,第一个对性能的影响要大得多。对于分区数低于 1000 的分区,安排太多的小型任务此时影响相对较小。如果分区数量达到数万个,那么 spark 会变得 very 慢。
为了补充 javadba 的出色答案,我记得文档建议将您的分区数设置为集群中 CPU 核心数的 3 或 4 倍,以便工作更均匀地分布在可用的 CPU 个核心。意思是,如果集群中每个 CPU 核心只有 1 个分区,则您将不得不等待最长的 运行 任务完成,但如果您将其进一步分解,工作负载将更加均衡有快有慢 运行 任务晚上出去。
分区数量对spark的代码性能有很大影响。
理想情况下,spark 分区意味着您要洗牌的数据量。通常你应该在你的 shuffle size(shuffle read/write) 上设置这个参数,然后你可以将分区数设置为每个分区 128 到 256 MB 以获得最大性能。
您可以在 spark sql 代码中设置分区,方法是将 属性 设置为:
spark.sql.shuffle.partitions
或 在使用任何数据框时,您可以通过以下方式进行设置:
df.repartition(分区数)