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

Performance RDD中的分区数和Spark中的性能,performance,apache-spark,pyspark,rdd,Performance,Apache Spark,Pyspark,Rdd,在Pyspark中,我可以从列表中创建RDD,并决定有多少个分区: sc = SparkContext() sc.parallelize(xrange(0, 10), 4) 我决定对RDD进行分区的分区数对性能有何影响? 这如何取决于我的机器拥有的核心数量?主要影响是指定的分区太少或太多 分区太少您将无法利用集群中所有可用的核心 分区太多管理许多小任务会产生过多的开销 在这两者之间,第一个对性能的影响要大得多。对于分区计数低于1000的情况,此时安排太多smalls任务的影响相对较小。如果您有

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

sc = SparkContext()
sc.parallelize(xrange(0, 10), 4)
我决定对RDD进行分区的分区数对性能有何影响?
这如何取决于我的机器拥有的核心数量?

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

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

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


在这两者之间,第一个对性能的影响要大得多。对于分区计数低于1000的情况,此时安排太多smalls任务的影响相对较小。如果您有上万个分区,那么spark会变得非常慢。

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

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

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

您可以在spark sql代码中设置分区,方法是将属性设置为:

spark.sql.shuffle.partitions

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


df.repartition(numOfPartitions)

我强烈建议这样做。跳转到“调优并行性”部分。它变得相当复杂,但它确实是深入的。我有一个特别的任务,当它有200万个大型json对象跨25K分区拆分时,它常常会耗尽内存。当我合并到320时,作业运行不到一分钟。这似乎是提高性能的最简单方法之一。分区过多的缺点:抓取次数越多,磁盘查找次数越多。驱动程序需要跟踪每个任务的状态。来源:幻灯片53,@user2918461:您进行此测试时,集群中总共有多少个内核?请您提供文档中描述的推荐分区数的参考资料?@sversch,这是CPU内核,我已修改以匹配我链接到的文档,并希望提供清晰性。文档发生了变化,我的理解是,由于这个原因,答案通常是独立的。重新阅读文档,给出关于并行性和分区如何工作的指导原则,对于建议的分区数量,您有什么建议作为指导原则的替代理解“我们建议使用比集群中的核心数量多出三到四倍的分区”乘以“集群中的CPU核心数量”“你是说spark.driver.cores还是spark.executor.cores?@Kenny spark.executor.cores就是这样!在对源代码进行了大量挖掘之后,我终于找到了如何获取分区数的默认值:
sc.defaultParallelism
sc=pyspark.SparkContext()