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

Posted

技术标签:

【中文标题】RDD 中的分区数和 Spark 中的性能【英文标题】:Number of partitions in RDD and performance in Spark 【发布时间】:2016-06-18 11:14:22 【问题描述】:

在 Pyspark 中,我可以从列表中创建一个 RDD 并决定有多少个分区:

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

我决定对我的 RDD 进行分区的分区数量如何影响性能? 这与我的机器拥有的核心数量有什么关系?

【问题讨论】:

我强烈推荐这个link。跳转到“调整并行度”部分。它变得相当复杂,但肯定是深入的。 【参考方案1】:

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

分区太少您不会利用集群中所有可用的核心。

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

在两者之间,第一个对性能的影响要大得多。在这一点上,调度过多的小任务对低于 1000 的分区计数的影响相对较小。如果您有数万个分区,那么 spark 会变得非常慢.

【讨论】:

确实如此。我有一个特殊的工作,当它有 200 万个大型 json 对象分布在 25K 个分区时,它会耗尽内存。当我合并到 320 时,作业会在不到一分钟的时间内运行。这似乎是提高性能的最简单方法之一。 太多分区的缺点:更多的获取,更多的磁盘寻道。驱动程序需要跟踪每个任务的状态。资料来源:幻灯片 53,slideshare.net/Hadoop_Summit/why-your-spark-job-is-failing @user2918461:当您进行此测试时,您的集群中有多少核心?【参考方案2】:

为了补充 javadba 的出色答案,我记得文档建议将分区数设置为集群中 CPU 内核数的 3 或 4 倍,以便工作在可用 CPU 内核之间分布更均匀。意思是,如果集群中每个 CPU 核心只有 1 个分区,您将不得不等待一个运行时间最长的任务完成,但如果您将其进一步分解,则工作负载将与快速和慢速运行的任务更加均衡.

【讨论】:

您能否提供参考文档中描述的推荐分区数? @sversch,它是 CPU 内核,我已经修改以匹配我链接到的文档,并希望提供清晰。文档发生了变化,我的理解是,由于这个原因,通常期望答案是独立的。重新阅读文档并给出并行性指南以及分区如何工作,作为关于推荐分区数的指南的替代理解,您有什么建议? 在书中,Spark in action,Petar Zecevi´c 第 74 页说“我们建议使用比集群中的核心多三到四倍的分区” “集群中的 CPU 内核数”是指 spark.driver.cores 还是 spark.executor.cores @Kenny spark.executor.cores 是!【参考方案3】:

分区数对spark的代码性能影响很大。

理想情况下,spark 分区意味着您要洗牌的数据量。通常你应该在你的 shuffle 大小(shuffle read/write)上设置这个参数,然后你可以将分区数设置为每个分区 128 到 256 MB 以获得最大性能。

您可以通过将属性设置为:在 spark sql 代码中设置分区:

spark.sql.shuffle.partitions

或 在使用任何数据框时,您可以通过以下方式进行设置:

df.repartition(numOfPartitions)

【讨论】:

在对源代码进行了相当多的挖掘之后,我终于想出了如何获取分区数的 default 值:@987654321 @ (sc = pyspark.SparkContext())

以上是关于RDD 中的分区数和 Spark 中的性能的主要内容,如果未能解决你的问题,请参考以下文章

共同分区的 RDD 的加入是不是会导致 Apache Spark 中的洗牌?

Spark RDD在Spark中的地位和作用如何?

Spark RDD在Spark中的地位和作用如何?

Spark RDD在Spark中的地位和作用如何?

Spark-core:Spark RDD的高级算子

Spark——RDD算子