分区数决定并行度,所以其重要性在性能调优方面不言而喻。
1、如果分区数过少,一方面会造成并行度不够,可能造成集群资源闲置,不能充分发挥整个集群的能力。另一方面会造成分区过大,发生数据倾斜的可能性就更高。
2、如果分区数过多,那么花在任务调度上的时间可能要比实际执行任务的时间长。
--------------------------------------------------分区数的确定--------------------------------------------------
在没有指定分区数的情况下,分区数默认被设置为defaultMinPartitions
def defaultMinPartitions: Int = math.min(defaultParallelism, 2) 也就是说,分区数不超过2个,
官方给的解释是为了保证在处理小文件时的性能。
这种情况更多地适用于从一个Scala集合来创建一个RDD,例如sc.parallelize(List(1,2,3,6))。
一、对于Hadoop数据源
一般情况下,分区数可通过如下公式表示
分区数=max(sc.defaultParallelism, total_data_size / data_block_size)
Spark支持所有hadoop I/O格式,因为它使用相同的Hadoop InputFoarmat API以及Spark自有的其它格式化程序。因此,在默认情况下,Spark的输入分区和Hadoop/MapReduce的输入分片方式一致。
通常情况下,Spark为每一个hdfs块创建一个分区(注:如果行特别长,大