1.默认分区
setMaster("local"):采用的是默认值,核数1
setMaster("local[*]"):最大分区数与物理机cpu核数相同,最小值为2,具体分区数量需要计算
2.从不同位置创建rdd,分区数量
-从集合中创建rdd 取决于分配给应用的cpu核数 -从外部文件中创建rdd math.min(取决于分配给应用的cpu核数,2)
3.分区计算方法
指定分区: 1.在textFile方法中,第二个参数minPartitions表示最小分区数 2.在实际计算分区数时,会根据文件的总大小和最小分区数相除运算 & 如果余数为0 那么最小分区数,就是实际的分区数 & 如果余数不为0 那么实际分区数,要计算。。。。。 例1: 22个字节,自定义3个分区
每个分区存储字节数=22/3取整 分区数=3+1(1为22/3多出的一个字节,需要单独放到一个分区,若剩余字节数大于每个分区存储的字节数,还需要再添加分区) 每个分区的数据按照:0~7|7~14|14~21放置,如果文件中一行的字节数超过了7,那会把一整行都读出,因为spark使用的是readlines,所以即使定义的第一个分区应该放置下标为0-6的数据,单也有可能将一整行,比如8个字节全取出,第二个分区仍会按照7-13的下标,把数据全部取出,但此时7、8号数据已经被取走,所以第二个分区会没有7、8号数据,只有9-13号数据,以此类推,第3、4个分区也是同样的方式取数据。总之,spark会按照算好的分区来取数,但由于spark是使用readlines来取数,取出的数据也受每一行的数据数量影响。
例2:
19个字节,5分区,则分区数=19/5 + 4/3 + 1 =5,因为剩下的4个字节大于每个分区存储的字节,所以存满3个字节后还要再加一个分区
例3:
37个字节,2个分区,分区数=2
计算方法:每个分区字节数=37/2=18,第二个分区算好后还剩下一个字节,1<1.1,所以不会再单独创建分区,所以分区数是2,不是3