进入textFile原码
发现 分区数量调用 hadoopFile中的TextInputFormat类,传入参数Key为LongWritable即偏移量,value为Text,
由此得知是通过这个类来读取
继续进入TextInputFormat类中
发现有个是否可以切分的判断,可以知道 一些不可拆分的文件由此过滤掉,可以切片拆分的文件继续往下寻找却没有相关处理逻辑 ,所以我们向上去到父类FileInputFormat中
找到如上逻辑,调用了listStatu与namenode交互获取文件属性,把要读取的文件总长度计算出来 totalSize
下面找到一个关键变量goalSize他的值为所有文件总长度除以默认最小分区数,
中间过程不一一赘述,关键代码在computeSplitSize
进入computeSplitSize中
三个参数值 goalSize上述计算过,minSize默认为1,blockSize为HDFS默认块大小 128M
computeSplitSize主处理很简单,先比较goalSize和blockSize大小取两者最小的,再与minSize比较取两者最大的 最终结果赋给splitSize
之后回到先前逻辑, 定义一个bytesRemaining接收每个文件的长度,进入while循环 条件为
文件长度/splitSize >1.1即SPLIT_SLOP便执行切分操作 直到条件不满足 停止循环切分
举例说明:
4个文件长度分别为100 100 100 1400字节,默认最小分区为2
首先计算全部文件总长度totalSize=100+100+100+1400=1700
goalSize=totalSize/最小分区数即2 =850
blockSize=128M换算成字节为134217728
minSize=1
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个分区