- 1.如果不指定默认分区数量,则默认分区数为2。计算规则是:
所有文件字节大小totalSize除以默认分区数的值goalSize,然后比较goalSize和hdfs指定分块大小作比较,以较小的最为goalSize作为切分大小,对每个文件进行切分,若文件大于大于goalSize,则会生成该文件大小/goalSize + 1个分区。
-
2.如果textFile指定分区数量为0或者1的话,defaultMinPartitions值为1,则有多少个文件,就会有多少个分区。
-
3.如果指定分区数量大于等于2,则默认分区数量为指定值,生成分区数量规则同2中的规则。
思考一下,为什么要这样子分区呢?
可能有的文件很小,有的文件很大,这样处理的话,能尽量使每个分区中的文件大小均匀一点,这样每个task就均匀一点。
例子:
4个文件长度分别为100 100 100 1400字节,默认最小分区为2
首先计算全部文件总长度totalSize=100+100+100+1400=1700B
goalSize=totalSize/最小分区数即2 =850B
blockSize=128M换算成字节为134217728B
minSize=1B
goalSize与blockSize取最小 值为850
850 与minSize取最大 值为850
即splitSize为850
然后 每个文件长度除以850 判断是否大于1.1
文件1,2,3都是100所以各生成1个分区,
文件4位1400,除以850>1.1 切分一个分区,剩余
(1400-850)/850 >1.1不再成立 又生成一个分区.
所以举例中的四个文件 共生成5个分区