首页 理论教育 RDD分区个数的设置原则及影响分析

RDD分区个数的设置原则及影响分析

时间:2023-06-21 理论教育 版权反馈
【摘要】:RDD分区的一个分配原则:尽可能地使得分区的个数等于集群核心数目。创建操作中,程序开发者可以手动指定分区的个数,例如sc.parallelize表示创建得到的RDD分区个数为2,在没有指定分区个数的情况下,Spark会根据集群部署模式,来确定一个分区个数默认值。对于parallelize方法,默认情况下,分区的个数会受Spark配置参数spark.default.parallelism的影响,官方对该参数的解释是用于控制Shuffle过程中默认使用的任务数量,这也符合对分区个数与任务个数之间关系的理解,代码如下。

RDD分区个数的设置原则及影响分析

RDD分区的一个分配原则:尽可能地使得分区的个数等于集群核心数目。RDD可以通过创建操作或者转换操作得到。转换操作中,分区的个数会根据转换操作中对应的多个RDD之间的依赖关系确定,窄依赖由子RDD由父RDD分区的个数决定,Shuffle依赖由子RDD分区器决定。

创建操作中,程序开发者可以手动指定分区的个数,例如sc.parallelize(Array(1,2,3,4,5),2)表示创建得到的RDD分区个数为2,在没有指定分区个数的情况下,Spark会根据集群部署模式,来确定一个分区个数默认值。

这里分别讨论parallelize和textFile两种通过外部数据创建生成RDD的方法。

对于parallelize方法,默认情况下,分区的个数会受Spark配置参数spark.default.parallelism的影响,官方对该参数的解释是用于控制Shuffle过程中默认使用的任务数量,这也符合对分区个数与任务个数之间关系的理解,代码如下。

无论是以本地模式、Standalone模式、YARN模式或者是Mesos模式来运行Spark,分区的默认个数等于对spark.default.parallelism配置项的指定值,若该值未设置,则会根据不同集群模式的特征,来确定这个值。

对于本地模式,默认分区个数等于本地机器的CPU核心总数(或者是用户通过local[N]参数指定分配给Spark的核心数目),这样的设置显然是合理的,因为把每个分区的计算任务交付给单个核心执行,能够保证最大的计算效率。其实现代码如下。(www.xing528.com)

若使用Apache Mesos作为集群的资源管理系统,默认分区个数等于8。其实现代码如下。

//TODO:查询Mesos资源管理器的core数目

override def defaultParallelism():Int=sc.conf.getInt("spark.default.parallelism",8)

其他集群模式(Standalone或者YARN),默认分区个数等于集群中所有核心数目的总和,或者2,取两者中的较大值。其实现代码如下。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈