Spark的分区数对于Spark性能调优很重要,如果分区数少,那么并行执行的task就少,比如分区数为1,即使你分配的Executor很多,而实际执行的Executor只有1个,如果数据量很大的话,那么任务执行的就很慢,因此熟悉各种情况下默认的分区数对于Spark调优就很有必要了,特别是执行完算子返回的结果分区数为1的情况,更需要特别注意。
这个地方看有好多人说是默认block数有多少就有多少个分区,其实不太对(或者可能以前老版本的是这样的,新版本的不是这样的)我也没有去深究老版本。
-
1.如果textFile指定分区数量为0或者1的话,defaultMinPartitions值为1,则有多少个文件,就会有多少个分区。
-
2.如果不指定默认分区数量,则默认分区数量为2,则会根据所有文件字节大小totalSize除以分区数量partitons的值goalSize,然后比较goalSize和hdfs指定分块大小(这里是32M)作比较,以较小的最为goalSize作为切分大小,对每个文件进行切分,若文件大于大于goalSize,则会生成该文件大小/goalSize + 1个分区。
-
3.如果指定分区数量大于等于2,则默认分区数量为指定值,生成分区数量规则同2中的规则。
-
读取hdfs上的其它文件和spark sql读取的df默认分区数基本和上述规则一致
sc.parallelize()创建RDD
默认分区数等于sc.defaultParallelism,指定参数时分区数值等于参数值。