微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spark RDD textFile算子 分区数量详解

在这里插入图片描述进入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个分区

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐